Re: [pgbr-geral] AJUDA COM FUNÇÃO

2010-03-23 Thread Mozart Hasse
Oi Jose,

Para pegar aproximadamente 1 de cada 10 registros da sua tabela, faça o
seguinte:

--insert into ONDEVOCEQUISER
select * 
from SUATABELA
where (
cast(
  substring(
  cast(ctid as varchar(20)),
  2,
  position(',' in cast(ctid as varchar(20)))-2 )
  as int) * 199+
cast(
  substring(
  cast(ctid as varchar(20)),
  position(',' in cast(ctid as varchar(20)))+1,
  length(rtrim(cast(ctid as varchar(20 - position(',' in cast(ctid as
varchar(20)))-1 )
  as int) )
% 10=1

Troque o 10 da última linha pela taxa de amostragem que te convier.
(Sim, eu também sinto uma falta desgraçada do rowid do Oracle)
Devido ao tamanho dos registros influenciarem na distribuição dos ctids,
você pode não ter *exatamente* 10% dos registros no caso acima (apesar de eu
duvidar que a margem de erro tire teu sono). Isso pode ser minimizado rodando
um vacuum full antes da exportação ou escolhendo outro primo no lugar do 199
que seja mais próximo do número de registros por bloco da tabela desejada.

Atenciosamente,

Mozart Hasse

> From: Jose Luis Ramos 
> Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo
> (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma
> tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e
assim
> por diante. O objetivo é gerar uma base menor que a base que estou lendo.




___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] AJUDA COM FUNÇÃO

2010-04-06 Thread Mozart Hasse
Olá Jose,

> Bom dia ! Estou retomando este trabalho e tenho algumas dúvidas. Obrigado.
> 1) Tentei executar o "insert as select" que voce me passou e está dando o
> seguinte erro:
> cdrger=# \i insert.sql
> psql:insert.sql:18: ERRO:  não pode converter tipo tid para character
> varying

Puuutz, de fato, não funciona em versões anteriores do PostgreSQL. Eu te
passei o que funcionou na 8.4.3, não sei a partir de que versão foi colocado
esse CAST. Não tenho sugestão de jeito fácil de fazer isso em versões
anteriores.

> O que significa o ctid ? Será que é isso que ele está reclamando ? Estou
> executando isso:

ctid é um identificador único do registro dentro da tabela, composto por 2
números. O que o fragmento que passei faz é transformar os dois num número
único e tirar o resto da divisão para ter uma distribuição meio
aleatória.

Atenciosamente,

Mozart Hasse


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] AJUDA COM FUNÇÃO

2010-04-06 Thread Osvaldo Kussama
Em 6 de abril de 2010 13:41, Mozart Hasse  escreveu:
> Olá Jose,
>
>> Bom dia ! Estou retomando este trabalho e tenho algumas dúvidas. Obrigado.
>> 1) Tentei executar o "insert as select" que voce me passou e está dando o
>> seguinte erro:
>> cdrger=# \i insert.sql
>> psql:insert.sql:18: ERRO:  não pode converter tipo tid para character
>> varying
>
> Puuutz, de fato, não funciona em versões anteriores do PostgreSQL. Eu te
> passei o que funcionou na 8.4.3, não sei a partir de que versão foi colocado
> esse CAST. Não tenho sugestão de jeito fácil de fazer isso em versões
> anteriores.
>
>> O que significa o ctid ? Será que é isso que ele está reclamando ? Estou
>> executando isso:
>
> ctid é um identificador único do registro dentro da tabela, composto por 2
> números. O que o fragmento que passei faz é transformar os dois num número
> único e tirar o resto da divisão para ter uma distribuição meio
> aleatória.
>


Verifique se funciona:

bdteste=# SELECT ctid, (substring(ctid::text, 2, position(',' in
ctid::text)-2 )::int) * 199 + (substring(ctid::text, position(',' in
ctid::text)+1, length(rtrim(ctid::text)) - position(',' in
ctid::text)-1 )::int) FROM foo;
 ctid  | ?column?
---+--
 (0,1) |1
 (0,2) |2
 (0,3) |3
 (0,4) |4
(4 registros)

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] AJUDA COM FUNÇÃO

2010-04-07 Thread Mozart Hasse
Olá Jose,

Fuçando um pouco fora da limitada documentação do PostgreSQL, em versões
anteriores à 8.4, pode-se converter o tipo ctid para um tipo utilizável
através da função tidout() e mais algumas gambiarras.

O código-raimunda equivalente ao que passei, que assim codificado funciona em
versões anteriores do PostgreSQL fica:

select * 
from SUATABELA
where (
cast(
  substring(
  encode(cstring_send(tidout(ctid)),'escape'),
  2,
  position(',' in rtrim( encode(cstring_send(tidout(ctid)),'escape') ))-2 )
  as int) * 199+
cast(
  substring(
  encode(cstring_send(tidout(ctid)),'escape'),
  position(',' in encode(cstring_send(tidout(ctid)),'escape'))+1,
  length(rtrim(encode(cstring_send(tidout(ctid)),'escape'))) - position(',' in
encode(cstring_send(tidout(ctid)),'escape'))-1 )
  as int) )
% 10=1


Atenciosamente,

Mozart Hasse


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-10-31 Thread Osvaldo Kussama
Em 31/10/08, tetraetila(R)<[EMAIL PROTECTED]> escreveu:
>
> Este select abaixo funciona da forma que eu quero, ele me retorna os campos
> que estão bloqueados na tabela, Ok!
> Gostaria de fazer uma função com ele.
>
>
> select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p
> WHERE p.locked_row = a.ctid order by sr_recno;
>
>
> Com base em uma função que achei no Google estou tentando adaptar o select
> acima para a função abaixo, não sei
> a linguagem plpgsql e estou estudando o Postgres, gostaria da ajuda de vocês
> para fazê-la funcionar.
>
> Muito obrigado, segue abaixo a função que estou tentando adaptar. Perdoem os
> erros! :- )
>
> Adilson
>
> /*
>
> Retirada em parte da função CREATE OR REPLACE FUNCTION
> whichrowslocked(text,text)
> encontrada no Google.
>
> /*
>
>
> -- Function: colunas(text)
>
> -- DROP FUNCTION colunas(text);
>
> CREATE OR REPLACE FUNCTION colunas(text)
>   RETURNS SETOF RECORD AS
> $BODY$
> DECLARE
>   myrec RECORD;
>   myst TEXT;
>   innermyst TEXT;
> BEGIN
>   innermyst = 'select * FROM '||$1||' as a,
> pgrowlocks('||quote_literal($1)||') AS p WHERE p.locked_row = a.ctid order
> by sr_recno';
>   FOR myrec IN EXECUTE innermyst LOOP
>  myst = innermyst||myrec;
>  BEGIN
>EXECUTE myst;
>EXCEPTION WHEN lock_not_available THEN
>RETURN NEXT myrec;
>  END;
>   END LOOP;
>   RETURN;
> END;
>
> $BODY$
>LANGUAGE 'plpgsql' VOLATILE STRICT
>COST 100
>ROWS 1000;
> ALTER FUNCTION colunas(text) OWNER TO postgres;
>


Não deu para entender o que você quer fazer.
Vejamos:
- innermyst é uma string que contém o comando SQL que você desja executar.
- myrec é um record contendo todos os campos resultantes da junção da
tabela $1 com a tabela pgrowlocks.
- você concatena a string com o record (sinceramente não sei qual o
resultado) e tenta executar?

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-01 Thread tetraetila®
- Original Message - 
From: "Osvaldo Kussama" <[EMAIL PROTECTED]>
To: "Comunidade PostgreSQL Brasileira" 
Sent: Friday, October 31, 2008 9:07 PM
Subject: Re: [pgbr-geral] Ajuda com função

>  select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p
>  WHERE p.locked_row = a.ctid order by sr_recno;

> Não deu para entender o que você quer fazer.
> Vejamos:
> - innermyst é uma string que contém o comando SQL que você desja executar.
> - myrec é um record contendo todos os campos resultantes da junção da
> - tabela $1 com a tabela pgrowlocks.
> - você concatena a string com o record (sinceramente não sei qual o
> resultado) e tenta executar?

Osvaldo
___

Nem eu?   : - )

Caro Osvaldo

Ela precisa me retornar o resultado como se eu tivesse feito este select:

select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p
WHERE p.locked_row = a.ctid order by sr_recno;

Ao invés dele passo a usar: select colunas( 'a003.a003015_tbl' );

Fiz umas modificações, vide abaixo. Ao executar recebo o erro:

ERROR: set-valued function called in context that cannot accept a set
CONTEXT: PL/pgSQL function "colunas" while casting return value to
function's return type.

Obrigado!

Adilson



/* MODIFICADA - MODIFICADA - MODIFICADA /*

 -- Function: colunas(text)

 -- DROP FUNCTION colunas(text);

 CREATE OR REPLACE FUNCTION colunas( text )
   RETURNS SETOF record AS
 $BODY$
 DECLARE
   myrec RECORD;
   myst TEXT;
 BEGIN
   myst = 'select * FROM '||$1||' as a, pgrowlocks('||quote_literal($1)||')
AS p WHERE p.locked_row = a.ctid order by sr_recno';
   FOR myrec IN EXECUTE myst LOOP
  BEGIN
EXECUTE myst;
EXCEPTION WHEN lock_not_available THEN
RETURN NEXT myrec;
  END;
   END LOOP;
   RETURN;
 END;

 $BODY$
LANGUAGE 'plpgsql' VOLATILE STRICT
COST 100
ROWS 1000;
 ALTER FUNCTION colunas(text) OWNER TO postgres;
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-01 Thread Osvaldo Kussama
Em 01/11/08, tetraetila(R)<[EMAIL PROTECTED]> escreveu:
> - Original Message -
> From: "Osvaldo Kussama" <[EMAIL PROTECTED]>
>
>> Não deu para entender o que você quer fazer.
>> Vejamos:
>> - innermyst é uma string que contém o comando SQL que você desja executar.
>> - myrec é um record contendo todos os campos resultantes da junção da
>> - tabela $1 com a tabela pgrowlocks.
>> - você concatena a string com o record (sinceramente não sei qual o
>> resultado) e tenta executar?
>
> Osvaldo
> ___
>
> Nem eu?   : - )
>
> Caro Osvaldo
>
> Ela precisa me retornar o resultado como se eu tivesse feito este select:
>
> select * FROM a003.a003015_tbl as a, pgrowlocks('a003.a003015_tbl') AS p
> WHERE p.locked_row = a.ctid order by sr_recno;
>
> Ao invés dele passo a usar: select colunas( 'a003.a003015_tbl' );
>


Para fazer exatamente oque o SELECT acima faz, mas passando a tabela,
teste a função:

CREATE OR REPLACE FUNCTION colunas(text)
   RETURNS SETOF record AS
$$
 DECLARE
   myrec RECORD;
   myst TEXT;
 BEGIN
   myst = 'select * FROM ' || $1 ||
  ' as a, pgrowlocks(' || quote_literal($1) ||
  ') AS p WHERE p.locked_row = a.ctid order by sr_recno';
   FOR myrec IN EXECUTE myst LOOP
RETURN NEXT myrec;
   END LOOP;
   RETURN;
 END;
$$ LANGUAGE 'plpgsql' VOLATILE STRICT;

Para usar utilize:
SELECT * FROM colunas('sua_tabela') AS foo(lista de tipo de campos de
sua_tabela + lista de tipo de campos de pg_rowlocks);

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-01 Thread Osvaldo Kussama
Adilson:

Pelo visto você continua tentando trabalhar com bloqueios de registros.
Já foi dito anteriormente, e vou insistir novamente: dê uma estudada
na maneira como o PostgreSQL trabalha (particularmente MVCC [1]) pois
é bem diferente da maneira com que um dbf trabalha.

Osvaldo

[1] http://pgdocptbr.sourceforge.net/pg80/mvcc.html#MVCC-INTRO
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-03 Thread Luiz Rafael Culik Guimaraes
Ola tetraetila

Vc esta  utilizando o sqlrdd do xharbour.com correto.

se sim nao e necessario fazer o que vc esta tentando

o sqlrdd e bem inteligente quando a bloqueios de arquivos

[]s
Luiz
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-03 Thread tetraetila®
Vou verificar isto agora, muito obrigado novamente...

Adilson




- Original Message - 
From: "Osvaldo Kussama" <[EMAIL PROTECTED]>
To: "Comunidade PostgreSQL Brasileira" 
Sent: Saturday, November 01, 2008 6:23 PM
Subject: Re: [pgbr-geral] Ajuda com função


Adilson:

Pelo visto você continua tentando trabalhar com bloqueios de registros.
Já foi dito anteriormente, e vou insistir novamente: dê uma estudada
na maneira como o PostgreSQL trabalha (particularmente MVCC [1]) pois
é bem diferente da maneira com que um dbf trabalha.

Osvaldo

[1] http://pgdocptbr.sourceforge.net/pg80/mvcc.html#MVCC-INTRO
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral 

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-03 Thread tetraetila®
Valeu Osvaldo,

Muito obrigado, vou testar.

Adilson
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-03 Thread tetraetila®
Sim Luiz

O que estou fazendo e saindo dele ( sqlrdd ) para trabalhar nativamente
com o Postgres.

Obrigado!

Adilson


> - Original Message - 
> From: "Luiz Rafael Culik Guimaraes" <[EMAIL PROTECTED]>
> To: "Comunidade PostgreSQL Brasileira" 
> 
> Sent: Monday, November 03, 2008 8:58 AM
> Subject: Re: [pgbr-geral] Ajuda com função
>

> Ola tetraetila
>
> Vc esta  utilizando o sqlrdd do xharbour.com correto.
>
> se sim nao e necessario fazer o que vc esta tentando
>
> o sqlrdd e bem inteligente quando a bloqueios de arquivos
>
> []s
> Luiz
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral 

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2008-11-04 Thread Luiz Rafael Culik Guimaraes
Ola



>O que estou fazendo e saindo dele ( sqlrdd ) para >trabalhar nativamente
>com o Postgres.

nao precisa fazer isso
o sqlrdd acessa o banco direto por queries tambem
e nao precisa desse tipo de gambiarra para acessar os dados

[]s
Luiz
www.xharbour.com.br

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2009-07-09 Thread Rafael Domiciano
Eu faço isso com a function retornando um type... funciona direitinho...:
CREATE TYPE typ_teste
( codigo integer, texto, text);

CREATE FUNCTION fnc_teste() RETURNS setof typ_teste

Acho que da pra fazer com out tb
create function fnc_teste (out, out)

2009/7/9 Rudinei Dias 

> Pessoal,
>
> Já dei uma olhada nas mensagens do fórum, sei que vi algo relativo a isto
> aqui.
>
> Preciso que o retorno de uma função retorne mais de um valor dentro de
> uma sql, tipo retorno multi-coluna.
> Já tentei vetores também, mas o retorno é uma estrutura textual dentro do
> campo.
>
> ex. select xy();
> resultado
> coluna A  |  coluna B
>    |  d
>
> Eu tava 'nas idéia' com crosstab mas não é isso...
> a idade já não ajuda mais... não consigo me lembrar...
>
> Alguém recorda como fazer?
>
> Desde já agradeço
>
> --
> -
> Rudinei Dias
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2012-09-18 Thread Marcone
Em 18 de setembro de 2012 15:26, Stclara  escreveu:
>
> A função:
> CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS
> $body$
> DECLARE
>debito_atual NUMERIC(18,2);
>linha saldo_caixa;
> begin
>SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE
> (type_cash= 'D');
>linha.debito = debito_atual;
> RETURN;
> END
> $body$
> LANGUAGE 'plpgsql';
>
>
> Aí para usar:
> select * from saldocaixa().
>
> No entanto, não retorna valor algum. Onde estou errando?


Pude identificar duas razões para o retorno vazio:
I - Verifique se na tabela cashes a coluna type_cash possui valores
iguais a 'D" (creio que sim);
II - Para que uma função que retorna set of funcione adequadamente
você tem que usar "return next" para cada registro retornado  e
"return" no final [1].
III - Levando em conta que sua função retornará mais de um registro é
bom você dar uma olhada no "for select loop" [1] e [2].

[1] - 
http://www.postgresql.org/docs/9.2/static/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING
[2] - 
http://www.postgresql.org/docs/9.2/static/plpgsql-control-structures.html#PLPGSQL-RECORDS-ITERATING

-- 
Marcone Peres - DBA
http://www.linkedin.com/in/marconeperes
@marconeperes
(61) 8146-0028
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2012-09-18 Thread Irineu
Em 18/09/2012 15:26, Stclara escreveu:
> Salve, pessoal. Estou precisando desenvolver uma função para retornar
> saldo e comecei desta maneira, mas não retorna dados:
>
> Criei um type:
> CREATE TYPE saldo_caixa AS (
> debito numeric(18,2)
>);
>
> A função:
> CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS
> $body$
> DECLARE
> debito_atual NUMERIC(18,2);
> linha saldo_caixa;
> begin
> SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE
> (type_cash= 'D');
> linha.debito = debito_atual;
> RETURN;
> END
> $body$
> LANGUAGE 'plpgsql';
>
>

uma outra possibilidade:

CREATE OR REPLACE FUNCTION saldocaixa()
  RETURNS SETOF saldo_caixa AS
$body$
DECLARE
debito_atual NUMERIC(18,2);
linha saldo_caixa;
begin
  RETURN Query SELECT SUM(value_cash)::NUMERIC(18,2) FROM cashes WHERE 
(type_cash= 'D');
END
$body$
LANGUAGE 'plpgsql';



-- 
Irineu Raymundo
Programador/Consultor Técnico
Senda Engenharia de Dados Ltda.

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] ajuda com função

2013-12-18 Thread Matheus de Oliveira
2013/12/18 Eloi 

> Ola a toda a lista,
>
> Estou a tentar fazer funcionar a seguinte função para mover todas as
> tabelas de um esquema para outro.
> Não obtenho nenhum erro mas no entanto nada é movido.
> Peculiaridades: o nome do esquema de origem está em "PascalCase" e o de
> destino em minúsculas.
>
> Alguém me pode indicar o que estou a fazer mal?
>
> CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text)
>   RETURNS text AS
> $BODY$
> DECLARE
> row record;
> BEGIN
> FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from
> LOOP
> EXECUTE 'ALTER TABLE ' || sch_from || '.' ||
> quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';';
> END LOOP;
> RETURN 'Tables were moved';
> END;
> $BODY$
>   LANGUAGE plpgsql VOLATILE
>   COST 100;
>
> ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres;
>
> SELECT sys_move_tables('"OrigEm"', 'destino');
>
> Obrigado. Cumprimentos,
>

Simples. Sua função não executa nada por causa da seguinte consulta:

SELECT tablename FROM pg_tables WHERE schemaname = sch_from;

Veja que você passou '"OrigEm"' para sch_from, logo essa consulta ficaria:

SELECT tablename FROM pg_tables WHERE schemaname = '"OrigEm"';

Mas nas tabelas de catálogo, os nomes são armazenados diretamente, sem
aspas duplas, logo sua consulta não traz nenhum registros e o loop não é
executado.

A solução é não passar com aspas duplas na chamada da função e tratar
dentro da mesma:

CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text)
  RETURNS text AS
$BODY$
DECLARE
row record;
BEGIN
FOR row IN SELECT tablename FROM pg_tables WHERE schemaname =
sch_from
LOOP
EXECUTE 'ALTER TABLE ' || quote_ident(sch_from) || '.' ||
quote_ident(row.tablename) || ' SET SCHEMA ' || quote_ident(sch_to) ||
';';
END LOOP;
RETURN 'Tables were moved';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

SELECT sys_move_tables('OrigEm', 'destino');


Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] ajuda com função

2013-12-18 Thread Eloi Ribeiro

On 2013-12-18 15:23, Matheus de Oliveira wrote:

2013/12/18 Eloi 


Ola a toda a lista,

Estou a tentar fazer funcionar a seguinte função para mover todas
as
tabelas de um esquema para outro.
Não obtenho nenhum erro mas no entanto nada é movido.
Peculiaridades: o nome do esquema de origem está em "PascalCase" e
o de
destino em minúsculas.

Alguém me pode indicar o que estou a fazer mal?

CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to
text)
  RETURNS text AS
$BODY$
DECLARE
    row record;
BEGIN
    FOR row IN SELECT tablename FROM pg_tables WHERE schemaname =
sch_from
    LOOP
        EXECUTE 'ALTER TABLE ' || sch_from || '.' ||
quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';';
    END LOOP;
RETURN 'Tables were moved';
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres;

SELECT sys_move_tables('"OrigEm"', 'destino');

Obrigado. Cumprimentos,


Simples. Sua função não executa nada por causa da seguinte
consulta:

    SELECT tablename FROM pg_tables WHERE schemaname = sch_from;

Veja que você passou '"OrigEm"' para sch_from, logo essa consulta
ficaria:

    SELECT tablename FROM pg_tables WHERE schemaname = '"OrigEm"';

Mas nas tabelas de catálogo, os nomes são armazenados diretamente,
sem aspas duplas, logo sua consulta não traz nenhum registros e o
loop não é executado.

A solução é não passar com aspas duplas na chamada da função e
tratar dentro da mesma:

    CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text,
sch_to text)
  RETURNS text AS
    $BODY$
    DECLARE
    row record;
    BEGIN
     FOR row IN SELECT tablename FROM pg_tables WHERE
schemaname = sch_from
    LOOP
    EXECUTE 'ALTER TABLE ' || quote_ident(sch_from)
|| '.' ||
    quote_ident(row.tablename) || ' SET SCHEMA ' ||
quote_ident(sch_to) || ';';
     END LOOP;
    RETURN 'Tables were moved';
    END;
    $BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
   
    SELECT sys_move_tables('OrigEm', 'destino');

Atenciosamente,

--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres [1]



Certo, já funciona.
Obrigado pela ajuda!

Eloi








___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] ajuda com função

2013-12-18 Thread Guimarães Faria Corcete DUTRA , Leandro
2013/12/18 Eloi Ribeiro :
> On 2013-12-18 15:23, Matheus de Oliveira wrote:
>> www.dextra.com.br/postgres [1]
>
> Certo, já funciona.

Sim, a Dextra funciona, e o PostgreSQL também.

Brincadeirinha… mas como você não cortou nem sequer a assinatura da
mensagem a que respondeu, foi como o gMail me mostrou tua resposta.

Além de evitar o /top posting/, outro ponto da netiqueta — não lembro
se chega a estar na RFC 1855 — é cortar da mensagem respondida tudo a
que não se está respondendo diretamente, a menos que seja importante
para contextualizar.  E evita esses efeitos colaterais engraçados.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] ajuda com função

2013-12-18 Thread Eloi
On 18-12-13 18:51, Guimarães Faria Corcete DUTRA, Leandro wrote:
> 2013/12/18 Eloi Ribeiro :
>> On 2013-12-18 15:23, Matheus de Oliveira wrote:
>>> www.dextra.com.br/postgres [1]
>> Certo, já funciona.
> Sim, a Dextra funciona, e o PostgreSQL também.
>
> Brincadeirinha… mas como você não cortou nem sequer a assinatura da
> mensagem a que respondeu, foi como o gMail me mostrou tua resposta.
>
> Além de evitar o /top posting/, outro ponto da netiqueta — não lembro
> se chega a estar na RFC 1855 — é cortar da mensagem respondida tudo a
> que não se está respondendo diretamente, a menos que seja importante
> para contextualizar.  E evita esses efeitos colaterais engraçados.

Estava eu a pensar por onde cortar quando respondi mas não sabia por
onde e decidi não cortar.
Não conhecia esse critério, terei em conta na próxima vez.
Sim, esta na 'RFC 1855' (também ignorava): 'When replying to a message,
include enough original material to be understood but no more.'
Sempre aprender :-)



___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função

2014-12-16 Thread Matheus de Oliveira
2014-12-16 17:47 GMT-02:00 Matheus Saraiva :
>
> Ao usar a seguinte função
>
> http://paste.ubuntu.com/9543365/
>
> Estou recebendo um erro, informando que a função atingiu o fim e não
> encontrou um retorno. Não tenho muita experiência com PLPGSQL mas acredito
> que o retorno final está lá (*RETURN sucess;*)
>

Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa linha
para antes da EXCEPTION, linha 15.

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função

2014-12-16 Thread Matheus Saraiva
Em Ter, 2014-12-16 às 17:56 -0200, Matheus de Oliveira escreveu:
> 
> 2014-12-16 17:47 GMT-02:00 Matheus Saraiva
> :
> Ao usar a seguinte função
> 
> http://paste.ubuntu.com/9543365/
> 
> Estou recebendo um erro, informando que a função atingiu o fim
> e não encontrou um retorno. Não tenho muita experiência com
> PLPGSQL mas acredito que o retorno final está lá (RETURN
> sucess;)
> 
> 
> Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa
> linha para antes da EXCEPTION, linha 15.
> 
> 
> Atenciosamente,
> -- 
> Matheus de Oliveira
> Analista de Banco de Dados
> Dextra Sistemas - MPS.Br nível F!
> www.dextra.com.br/postgres
> 
> 
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Ok, deu certo. Esse bloco exception é diferente do que eu imaginava,
achei quele ele terminasse quando não encontrasse mais clausulas when
then. Pelo visto ele não tem um delimitador que marque o seu fim.
-- 
Matheus Saraiva da Silva
Chapecó - SC

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função

2014-12-16 Thread Osvaldo Kussama
Em 16/12/14, Matheus Saraiva escreveu:
> Em Ter, 2014-12-16 às 17:56 -0200, Matheus de Oliveira escreveu:
>>
>> 2014-12-16 17:47 GMT-02:00 Matheus Saraiva
>> :
>> Ao usar a seguinte função
>>
>> http://paste.ubuntu.com/9543365/
>>
>> Estou recebendo um erro, informando que a função atingiu o fim
>> e não encontrou um retorno. Não tenho muita experiência com
>> PLPGSQL mas acredito que o retorno final está lá (RETURN
>> sucess;)
>>
>>
>> Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa
>> linha para antes da EXCEPTION, linha 15.
>>
>>
>> Atenciosamente,
>> --
>> Matheus de Oliveira
>> Analista de Banco de Dados
>> Dextra Sistemas - MPS.Br nível F!
>> www.dextra.com.br/postgres
>>
>>
>> ___
>> pgbr-geral mailing list
>> pgbr-geral@listas.postgresql.org.br
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
> Ok, deu certo. Esse bloco exception é diferente do que eu imaginava,
> achei quele ele terminasse quando não encontrasse mais clausulas when
> then. Pelo visto ele não tem um delimitador que marque o seu fim.
> --


De:
http://www.postgresql.org/docs/current/interactive/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING

"If no error occurs, this form of block simply executes all the
statements, and then control passes to the next statement after END.
But if an error occurs within the statements, further processing of
the statements is abandoned, and control passes to the EXCEPTION list.
The list is searched for the first condition matching the error that
occurred. If a match is found, the corresponding handler_statements
are executed, and then control passes to the next statement after
END."

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função

2014-12-16 Thread Matheus de Oliveira
Em 16/12/2014 18:11, "Matheus Saraiva"  escreveu:
>
> Em Ter, 2014-12-16 às 17:56 -0200, Matheus de Oliveira escreveu:
> >
> > 2014-12-16 17:47 GMT-02:00 Matheus Saraiva
> > :
> > Ao usar a seguinte função
> >
> > http://paste.ubuntu.com/9543365/
> >
> > Estou recebendo um erro, informando que a função atingiu o fim
> > e não encontrou um retorno. Não tenho muita experiência com
> > PLPGSQL mas acredito que o retorno final está lá (RETURN
> > sucess;)
> >
> >
> > Aquele RETURN na linha 27 está dentro do bloco de exceções. Mova essa
> > linha para antes da EXCEPTION, linha 15.
> >
>
> Ok, deu certo. Esse bloco exception é diferente do que eu imaginava,
> achei quele ele terminasse quando não encontrasse mais clausulas when
> then. Pelo visto ele não tem um delimitador que marque o seu fim.

O final de cada WHEN seria até encontrar o próximo WHEN ou, no caso do
último,  até encontrar a cláusula END. Lembre-se que você pode aninhar
blocos BEGIN/EXCEPTION/END, assim você pode ter um bloco interno:

BEGIN
...
BEGIN
...
EXCEPTION
...
END
RETURN ...;
END;
> --
> Matheus Saraiva da Silva
> Chapecó - SC
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função

2015-09-28 Thread Eloi

On 2015-09-25 10:33, Eloi wrote:

1) A função não esta a funcionar devidamente. Suponho que relacionado
com esta parte:
AND t2.country_id = '||$$'$$||quote_ident(country_code)||$$'$$
Algo esta mal que não consigo identificar.


O quote_ident() sobra, julgo que porque se trata de uma string e não de 
um objeto.

Assim já funciona:
AND t2.country_id = '||$$'$$||country_code||$$'$$

Eloi
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Ajuda com função

2015-09-28 Thread Sebastian Webber
Em 28 de setembro de 2015 06:41, Eloi  escreveu:

> On 2015-09-25 10:33, Eloi wrote:
>
>> 1) A função não esta a funcionar devidamente. Suponho que relacionado
>> com esta parte:
>> AND t2.country_id = '||$$'$$||quote_ident(country_code)||$$'$$
>> Algo esta mal que não consigo identificar.
>>
>
> O quote_ident() sobra, julgo que porque se trata de uma string e não de um
> objeto.
> Assim já funciona:
> AND t2.country_id = '||$$'$$||country_code||$$'$$
>


Como você queria representar os dados? quote_ident vai colocar eles entre
aspas duplas. Talvez o bloco todo possa ser reescrito com quote_literal:

AND t2.country_id = QUOTE_LITERAL(country_code)


Dê uma olhada nos detalhes na doc[1].

Um abraço!

[1] http://www.postgresql.org/docs/9.4/static/functions-string.html


-- 
Sebastian Webber
http://swebber.me
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] Ajuda com função

2015-09-28 Thread Eloi

On 2015-09-28 16:21, Sebastian Webber wrote:

AND t2.country_id = '||$$'$$||country_code||$$'$$


Como você queria representar os dados? quote_ident vai colocar eles
entre aspas duplas. Talvez o bloco todo possa ser reescrito com
quote_literal:


AND t2.country_id = QUOTE_LITERAL(country_code)


Sim é isso, não conhecia QUOTE_LITERAL(), fica muito mais simples. 
Obrigado!

Eloi
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Re: [pgbr-geral] AJUDA COM FUNÇÃO (pgplsql)

2010-03-23 Thread JotaComm
Olá,

Em 23 de março de 2010 11:28, Jose Luis Ramos
escreveu:

> Gostaria de uma ajuda no seguinte: tenho várias tabelas com o mesmo
> prefixo:
>
> cdrger=# \dt
>  Lista de relações
>  Esquema |  Nome  |  Tipo  |   Dono
> -+++--
>  public  | cdrger20090227 | tabela | postgres
>  public  | cdrger20090306 | tabela | postgres
>  public  | cdrger20090311 | tabela | postgres
>  public  | cdrger20090319 | tabela | postgres
>  public  | cdrger20090320 | tabela | postgres
>  public  | cdrger20090324 | tabela | postgres
>  public  | cdrger20090325 | tabela | postgres
>  public  | cdrger20090326 | tabela | postgres
>  public  | cdrger20090327 | tabela | postgres
>  public  | cdrger20090328 | tabela | postgres
>  public  | cdrger20090329 | tabela | postgres
>  public  | cdrger20090330 | tabela | postgres
> (12 registros)
>
> Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo
> (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma
> tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e assim
> por diante. O objetivo é gerar uma base menor que a base que estou lendo.
> Depois tenho que exportar essa ou essas tabelas temp geradas e importar em
> uma base de um notebook para ser utilizada pela área comercial da empresa.
> Se alguém puder me ajudar eu agradeço. Conheço Oracle, mas estou começando
> com PostgreSQL esta semana ... Obrigado.
>

Fiquei confuso. Acho que um exemplo facilitaria o entendimento.

>
> --
> Jose Luis Ramos Jr
> Campinas - SP
> Oracle OCP DBA 8i, 9i,10g
> Fone: 19-37056793
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>

[]s
-- 
JotaComm
http://jotacomm.wordpress.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] AJUDA COM FUNÇÃO (pgplsql)

2010-03-23 Thread Osvaldo Kussama
Em 23 de março de 2010 11:28, Jose Luis Ramos
 escreveu:
> Gostaria de uma ajuda no seguinte: tenho várias tabelas com o mesmo prefixo:
>
> cdrger=# \dt
>  Lista de relações
>  Esquema |  Nome  |  Tipo  |   Dono
> -+++--
>  public  | cdrger20090227 | tabela | postgres
>  public  | cdrger20090306 | tabela | postgres
>  public  | cdrger20090311 | tabela | postgres
>  public  | cdrger20090319 | tabela | postgres
>  public  | cdrger20090320 | tabela | postgres
>  public  | cdrger20090324 | tabela | postgres
>  public  | cdrger20090325 | tabela | postgres
>  public  | cdrger20090326 | tabela | postgres
>  public  | cdrger20090327 | tabela | postgres
>  public  | cdrger20090328 | tabela | postgres
>  public  | cdrger20090329 | tabela | postgres
>  public  | cdrger20090330 | tabela | postgres
> (12 registros)
>
> Preciso fazer uma funçaõ que, para cada tabela do banco com esse prefixo
> (cdrger*), eu leia um registro, grave de alguma forma (por exemplo em uma
> tab temp), pulo x registros, gravo o próximo, pulo mais x registros, e assim
> por diante. O objetivo é gerar uma base menor que a base que estou lendo.
> Depois tenho que exportar essa ou essas tabelas temp geradas e importar em
> uma base de um notebook para ser utilizada pela área comercial da empresa.
> Se alguém puder me ajudar eu agradeço. Conheço Oracle, mas estou começando
> com PostgreSQL esta semana ... Obrigado.
>


Tente uma função do tipo:

CREATE OR REPLACE FUNCTION sua_função(prefixo text) RETURNS void AS $$
DECLARE
   tabela text;
   novatabela text;
   n int;
BEGIN
   FOR tabela IN EXECUTE 'SELECT table_name FROM
information_schema.tables WHERE table_name LIKE ' || prefixo || '%'
LOOP
  novatabela = 'novoprefixo' || substring(tabela,7);
  EXECUTE 'CREATE TABLE ' || novatabela || 'AS SELECT * FROM ' ||
tabela || ' WITH NO DATA';
  EXECUTE 'SELECT count(*)/10 FROM ' || tabela INTO n;
  FOR i = 1 to n LOOP
 EXECUTE 'INSERT INTO ' || novatabela || ' SELECT * FROM ' ||
tabela || ' LIMIT 1 OFFSET ' || (i-1)*10::text;
  END LOOP;
   END LOOP;
   RETURN;
END;
$$ LANGUAGE plpgsql;

Osvaldo
PS.: Não testada
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - Resolvido

2012-09-18 Thread Stclara
Salve, senhores.

Ficou assim:
CREATE TYPE saldo_caixa AS (
   saldo_anterior numeric(18,2),
   debito numeric(18,2),
   credito numeric(18,2),
   saldo numeric(18,2),
   inicio date,
   fim date
  );

CREATE OR REPLACE FUNCTION saldocaixa(date, date) RETURNS SETOF 
saldo_caixa AS
$body$
DECLARE
   debito_ant NUMERIC(18,2);
   credito_ant NUMERIC(18,2);
   debito_atual NUMERIC(18,2);
   credito_atual NUMERIC(18,2);
   linha saldo_caixa;

begin
   linha.saldo_anterior := 0;
   linha.debito := 0;
   linha.credito := 0;
   linha.saldo := 0;

   SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE 
(type_cash= 'D' and date_cash between $1 and $2);
   SELECT INTO credito_atual SUM(value_cash) FROM cashes WHERE 
(type_cash= 'C' and date_cash between $1 and $2);
   SELECT INTO credito_ant SUM(value_cash) FROM cashes WHERE (type_cash= 
'C' and date_cash < $1 );
   SELECT INTO debito_ant SUM(value_cash) FROM cashes WHERE (type_cash= 
'D' and date_cash < $1 );

   if credito_atual is null then credito_atual = 0; end if;
   if debito_atual is null then debito_atual = 0; end if;
   if credito_ant is null then credito_ant = 0; end if;
   if debito_ant is null then debito_ant = 0; end if;

   linha.saldo_anterior = (credito_ant - debito_ant);
   linha.debito = debito_atual;
   linha.credito = credito_atual;
   linha.saldo = linha.saldo_anterior - (credito_atual - debito_atual);
   linha.inicio = $1;
   linha.fim = $2;
   return next linha;
RETURN;
END
$body$
LANGUAGE 'plpgsql';

Aí chamo: select * from saldocaixa('2012-09-18', '2012-09-18').

Estou utilizando com rails em um projeto: http://siga.herokuapp.com/.
Breve coloco o código no github.

Obrigado a todos.

[]'s

Stclara.


Em 18-09-2012 17:06, Irineu escreveu:
> Em 18/09/2012 15:26, Stclara escreveu:
>> Salve, pessoal. Estou precisando desenvolver uma função para retornar
>> saldo e comecei desta maneira, mas não retorna dados:
>>
>> Criei um type:
>> CREATE TYPE saldo_caixa AS (
>>  debito numeric(18,2)
>> );
>>
>> A função:
>> CREATE OR REPLACE FUNCTION saldocaixa() RETURNS SETOF saldo_caixa AS
>> $body$
>> DECLARE
>>  debito_atual NUMERIC(18,2);
>>  linha saldo_caixa;
>> begin
>>  SELECT INTO debito_atual SUM(value_cash) FROM cashes WHERE
>> (type_cash= 'D');
>>  linha.debito = debito_atual;
>> RETURN;
>> END
>> $body$
>> LANGUAGE 'plpgsql';
>>
>>
> uma outra possibilidade:
>
> CREATE OR REPLACE FUNCTION saldocaixa()
>RETURNS SETOF saldo_caixa AS
> $body$
> DECLARE
>  debito_atual NUMERIC(18,2);
>  linha saldo_caixa;
> begin
>RETURN Query SELECT SUM(value_cash)::NUMERIC(18,2) FROM cashes WHERE 
> (type_cash= 'D');
> END
> $body$
> LANGUAGE 'plpgsql';
>
>
>

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função Incrementar Mes ..

2008-10-15 Thread Fábio Telles Rodriguez
2008/10/15 Tatu <[EMAIL PROTECTED]>

>  Necessito numa função, entrar com um data e um numero enteiro no segundo
> parametro que é a quantidade de meses a somar e retorna uma data...
> sei que existe a funcao date + interval ' x month'  mas nao estou
> conseguindo implementar esse "x" como uma variável.
> Ficaria grato se alguem me desse uma dica.
>
>

Você pode mostrar a sua consulta?


[]s


> Santiago
> NSR Informática.
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>


-- 
blog: http://www.midstorm.org/~telles/
e-mail / jabber: [EMAIL PROTECTED]
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função Incrementar Mes ..

2008-10-15 Thread Osvaldo Kussama
2008/10/15, Tatu <[EMAIL PROTECTED]>:
> Necessito numa função, entrar com um data e um numero enteiro no segundo
> parametro que é a quantidade de meses a somar e retorna uma data...
> sei que existe a funcao date + interval ' x month'  mas nao estou
> conseguindo implementar esse "x" como uma variável.
> Ficaria grato se alguem me desse uma dica.
>


Tente:

   sua_data + num_meses*'1 month'::interval

Osvaldo
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função Incrementar Mes ..

2008-10-15 Thread Jota
Olá, Tatu

Segue abaixo uma função. Poderia verificar se é isso que você precisa.

CREATE OR REPLACE FUNCTION soma_data(date,integer)
RETURNS date AS $soma_data$
SELECT $1+$2;
$soma_data$ LANGUAGE SQL IMMUTABLE;

SELECT soma_data('2008-10-13',20); //chamando a função

ou ainda de uma forma mais simples:

SELECT current_date + 10;

ou

SELECT '2008-10-15'::date + 13;

ou

SELECT '2008-10-15'::date + interval '13 days'; (assim apresenta a
data e a hora, porém a hora é truncada em 00:00:00).

Se quiser descartar a data pode usar a função to_char.

Espero ter ajudado.

[]s





2008/10/15 Tatu <[EMAIL PROTECTED]>:
> Necessito numa função, entrar com um data e um numero enteiro no segundo
> parametro que é a quantidade de meses a somar e retorna uma data...
> sei que existe a funcao date + interval ' x month'  mas nao estou
> conseguindo implementar esse "x" como uma variável.
> Ficaria grato se alguem me desse uma dica.
>
> Santiago
> NSR Informática.
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>



-- 
João Paulo
www.dextra.com.br/postgres
PostgreSQL
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com Função Incrementar Mes ..

2008-10-15 Thread Leonardo Cezar
2008/10/15 Tatu <[EMAIL PROTECTED]>:
> Necessito numa função, entrar com um data e um numero enteiro no segundo
> parametro que é a quantidade de meses a somar e retorna uma data...

$ PREPARE incrementador_de_dias(date,integer) AS SELECT $1 + $2;
$ EXECUTE incrementador_dedias(CURRENT_DATE,30);

> sei que existe a funcao date + interval ' x month'  mas nao estou
> conseguindo implementar esse "x" como uma variável.

Envie a forma como está tentando implementar para facilitar um pouco.

-Leo
-- 
Leonardo Cezar
http://pgcon.postgresql.org.br
http://www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-14 Thread Flavio Henrique Araque Gurgel
> Quando edito a geometria salta o seguinte erro:
>
> ERROR:  no existe el esquema «tg_table_schema»
> CONTEXTO:  sentencia SQL: «ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD
> COLUMN area bigint»

O erro é claro (embora em espanhol, língua que não domino):
Não existe o esquema "tg_table_schema".
Existe um esquema com esse nome?
A tabela está dentro do esquema certo?

[]s
Flavio Gurgel
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-14 Thread Tiago Adami
Em 12 de março de 2012 07:11, Eloi Ribeiro  escreveu:
> Ola a todos,
>
> Estou a fazer a seguinte função para que me actualize o campo 'area' cada
> vez que exista um INSERT ou UPDATE numa tabela.
> O problema está que o campo 'area' pode não existir e gostava que nesse caso
> o campo seja criado e preenchido para todos os registos.
> Como tenho salta-me o erro de que 'Nao existe o esquema «tg_table_schema»' e
> não encontro maneira de resolver isso.
> Como faço para adicionar um campo à tabela onde dispara a função e se
> preencha esse campo?

Se bem entendi, queres adicionar uma coluna à tabela quando ela não
existir. Já tentou mudar o seu ALTER TABLE explícito por:

EXECUTE IMMEDIATE 'ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD
COLUMN area bigint';

?

-- 
TIAGO J. ADAMI
http://www.adamiworks.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-14 Thread Eloi Ribeiro
Bem, já consegui alguns progressos com a função.
No entanto tenho o seguinte erro:

ERROR:  no se puede hacer ALTER TABLE en «postfire_study_area» porque está
siendo usada por consultas activas en esta sesión
CONTEXTO:  sentencia SQL: «ALTER TABLE sch_forestal.postfire_study_area ADD
COLUMN area bigint»

Fiz as seguintes alterações:



> CREATE OR REPLACE FUNCTION fun_dimensoes()
>   RETURNS trigger AS
> $BODY$
> DECLARE
>

esquemavarchar(20);
tabelavarchar(50);


> tipovarchar(20);
> sridinteger;
> BEGIN
>

esquema := TG_TABLE_SCHEMA;
tabela:= TG_TABLE_NAME;


> tipo := (SELECT "type" FROM geometry_columns
> WHERE f_table_schema = TG_TABLE_SCHEMA
> AND f_table_name = TG_TABLE_NAME);
> srid := (SELECT srid FROM geometry_columns
> WHERE f_table_schema = TG_TABLE_SCHEMA
> AND   f_table_name = TG_TABLE_NAME);
>
> IF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
> IF NOT EXISTS(SELECT column_name FROM information_schema.columns
> WHERE table_schema = TG_TABLE_SCHEMA
> AND table_name = TG_TABLE_NAME
> AND column_name='area') THEN
>

EXECUTE 'ALTER TABLE ' || quote_ident(esquema) || '.' ||
quote_ident(tabela) || ' ADD COLUMN area bigint';


> IF (srid = 23030 OR srid = 25830) THEN
>

EXECUTE 'UPDATE ' || quote_ident(esquema) || '.' || quote_ident(tabela) ||
' SET area = ST_Area(geom)::bigint';


> ELSIF (srid = 4326) THEN
>

EXECUTE 'UPDATE ' || quote_ident(esquema) || '.' || quote_ident(tabela) ||
' SET area = ST_Area(Geography(geom))::bigint';


> END IF;
> ELSE
> IF (srid = 23030 OR srid = 25830) THEN
> NEW.area = ST_Area(NEW.geom)::bigint;
> ELSIF (srid = 4326) THEN
> NEW.area = ST_Area(Geography(NEW.geom))::bigint;
> END IF;
> END IF;
> END IF;
>
> RETURN NEW;
> END;
> $BODY$
>   LANGUAGE 'plpgsql' VOLATILE
>   COST 100;
>
> CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes
> BEFORE INSERT OR UPDATE
> ON sch_forestal.postfire_study_area
> FOR EACH ROW
> EXECUTE PROCEDURE fun_dimensoes();
>
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-15 Thread Eloi Ribeiro
Antes de nada obrigada pela vossas respostas.

Efectivamente, Flavio, o esquema "tg_table_schema" não existe. Só depois
buscando um pouco mais encontrei que tinha de por a sentencia SQL ALTER
TABLE assim:

EXECUTE 'ALTER TABLE ' || quote_ident(esquema) || '.' ||
quote_ident(tabela) || ' ADD COLUMN area bigint';

E de esta maneira já reconhecia o esquema e nome da tabela.

Tiago, com EXECUTE IMMEDIATE da-me um erro de sintasis:

EXECUTE IMMEDIATE 'ALTER TABLE ' || quote_ident(esquema) || '.' ||
quote_ident(tabela) || ' ADD COLUMN area bigint';
ERROR: error de sintaxis en o cerca de «IMMEDIATE»

OK, agora sem o 'IMMEDIATE' a função é criada com êxito mas quando se
executa salta o seguinte erro:

ERROR:  no se puede hacer ALTER TABLE en «postfire_study_area» porque está
siendo usada por consultas activas en esta sesión
CONTEXTO:  sentencia SQL: «ALTER TABLE sch_forestal.postfire_study_
area ADD COLUMN area bigint»

Claro a função dispara quando faço um update ou insert na tabela e tem de
calcular a 'area' e o 'perimetro' para os registos afectados. Mas se estes
campos não existem deveriam ser criados e depois actualizados. O problema
parece ser que não se pode criar os campos tendo a tabela um insert ou
update em curso. Isto é mesmo assim ou existe uma maneira de contornar este
problema?

Obrigado!

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 15 de Março de 2012 00:49, Tiago Adami  escreveu:

> Em 12 de março de 2012 07:11, Eloi Ribeiro 
> escreveu:
> > Ola a todos,
> >
> > Estou a fazer a seguinte função para que me actualize o campo 'area' cada
> > vez que exista um INSERT ou UPDATE numa tabela.
> > O problema está que o campo 'area' pode não existir e gostava que nesse
> caso
> > o campo seja criado e preenchido para todos os registos.
> > Como tenho salta-me o erro de que 'Nao existe o esquema
> «tg_table_schema»' e
> > não encontro maneira de resolver isso.
> > Como faço para adicionar um campo à tabela onde dispara a função e se
> > preencha esse campo?
>
> Se bem entendi, queres adicionar uma coluna à tabela quando ela não
> existir. Já tentou mudar o seu ALTER TABLE explícito por:
>
> EXECUTE IMMEDIATE 'ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD
> COLUMN area bigint';
>
> ?
>
> --
> TIAGO J. ADAMI
> http://www.adamiworks.com
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-15 Thread Tiago Adami
Em 15 de março de 2012 07:19, Eloi Ribeiro  escreveu:
>
> ERROR:  no se puede hacer ALTER TABLE en «postfire_study_area» porque está
> siendo usada por consultas activas en esta sesión
>

A mensagem é clara: não se pode fazer um ALTER TABLE sobre uma tabela
que está sendo utilizada.

Para que o seu ALTER TABLE funcione é necessário encerrar com COMMIT
ou ROLLBACK toda e qualquer transação/conexão que esteja utilizando
esta tabela - exceto a transação/conexão que irá realizar efetivamente
o ALTER TABLE.

Cancelando as demais transações/conexões também resolve seu problema
*se, e somente se* isto não for um problema no seu cenário.

-- 
TIAGO J. ADAMI
http://www.adamiworks.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-16 Thread Flavio Henrique Araque Gurgel
> Cancelando as demais transações/conexões também resolve seu problema
> *se, e somente se* isto não for um problema no seu cenário.

Minha experiência com DDL dentro de funções é de resultado sempre inesperado.
Se a função é específica para ser executada em horário controlado,
geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
executando funções do que comandos mais complexos ou scripts.
Já se a função é para ser chamada automaticamente por causa de uma
necessidade de uma aplicação ou usuário, a chance de lock é
monstruosa, e é o que está ocorrendo com o colega.

[]s
Flavio Gurgel
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-16 Thread Eloi Ribeiro
O melhor será separar esta função em duas:
A primeira que verifique se os campos existem e se não os criam.
E a segunda como disparador para que se actualizem com os inserts e updates.
Obrigado pela ajuda!

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel <
fha...@gmail.com> escreveu:

> > Cancelando as demais transações/conexões também resolve seu problema
> > *se, e somente se* isto não for um problema no seu cenário.
>
> Minha experiência com DDL dentro de funções é de resultado sempre
> inesperado.
> Se a função é específica para ser executada em horário controlado,
> geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
> executando funções do que comandos mais complexos ou scripts.
> Já se a função é para ser chamada automaticamente por causa de uma
> necessidade de uma aplicação ou usuário, a chance de lock é
> monstruosa, e é o que está ocorrendo com o colega.
>
> []s
> Flavio Gurgel
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-17 Thread Matheus de Oliveira
Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não
ter lock "aumentam", mas não "desaparecem". Analisando por cima suas
necessidades, não acredito que a melhor solução seja realmente adicionar
uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
seja, sempre adicione a coluna (talvez junto com a execução do comando
CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
até fazer a verificação e dar um RAISE EXCEPTION caso não exista).

PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em
usar herança nessas tabelas para organizar melhor as coisas.

Atenciosamente,
--
Matheus de Oliveira

Bacharelado em Ciências de Computação
Laboratório de Computação de Alto Desempenho -
LCAD
Instituto de Ciências Matemáticas e de Computação -
ICMC
Universidade de São Paulo - USP 




On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro wrote:

> O melhor será separar esta função em duas:
> A primeira que verifique se os campos existem e se não os criam.
> E a segunda como disparador para que se actualizem com os inserts e
> updates.
> Obrigado pela ajuda!
>
>
> Eloi Ribeiro
> GIS Analyst
> 39,45º -0,40º
> flavors.me/eloiribeiro
>
>
> No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel <
> fha...@gmail.com> escreveu:
>
> > Cancelando as demais transações/conexões também resolve seu problema
>> > *se, e somente se* isto não for um problema no seu cenário.
>>
>> Minha experiência com DDL dentro de funções é de resultado sempre
>> inesperado.
>> Se a função é específica para ser executada em horário controlado,
>> geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
>> executando funções do que comandos mais complexos ou scripts.
>> Já se a função é para ser chamada automaticamente por causa de uma
>> necessidade de uma aplicação ou usuário, a chance de lock é
>> monstruosa, e é o que está ocorrendo com o colega.
>>
>> []s
>> Flavio Gurgel
>> ___
>> pgbr-geral mailing list
>> pgbr-geral@listas.postgresql.org.br
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-20 Thread Eloi Ribeiro
Obrigado a todos pelas vossas dicas.

Fiz isso, retirei a parte de criação de colunas da função e agora não salta
nenhum erro.
No entanto seria de esperar que quando um polígono fosse editado o campo
área fosse actualizado e isso não acontece.

Alguém me sabe dizer o que é que está mal?


CREATE OR REPLACE FUNCTION fun_dimensoes()
  RETURNS trigger AS
$BODY$
DECLARE
tipovarchar(20);
sridinteger;
BEGIN
tipo :=(SELECT "type" FROM geometry_columns
WHERE f_table_schema = TG_TABLE_SCHEMA
AND f_table_name = TG_TABLE_NAME);
srid :=(SELECT srid FROM geometry_columns
WHERE f_table_schema = TG_TABLE_SCHEMA
AND   f_table_name = TG_TABLE_NAME);
-- ponto
IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN
NEW.x = ST_X(NEW.geom);
NEW.y = ST_Y(NEW.geom);
-- linha
ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN
IF (srid = 23030 OR srid = 25830) THEN
NEW.longitude = ST_Length(NEW.geom)::bigint;
ELSIF (srid = 4326) THEN
NEW.longitude = ST_Length(Geography(NEW.geom))::bigint;
END IF;
-- poligono
ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
IF (srid = 23030 OR srid = 25830) THEN
NEW.area = ST_Area(NEW.geom)::bigint;
NEW.perimetro = ST_Perimeter(NEW.geom)::bigint;
ELSIF (srid = 4326) THEN
NEW.area = ST_Area(Geography(NEW.geom))::bigint;
NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint;
END IF;
END IF;
RETURN NEW;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

Obrigado,

Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 17 de Março de 2012 21:39, Matheus de Oliveira <
matioli.math...@gmail.com> escreveu:

> Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não
> ter lock "aumentam", mas não "desaparecem". Analisando por cima suas
> necessidades, não acredito que a melhor solução seja realmente adicionar
> uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
> seja, sempre adicione a coluna (talvez junto com a execução do comando
> CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
> até fazer a verificação e dar um RAISE EXCEPTION caso não exista).
>
> PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em
> usar herança nessas tabelas para organizar melhor as coisas.
>
> Atenciosamente,
> --
> Matheus de Oliveira
>
> Bacharelado em Ciências de Computação
> Laboratório de Computação de Alto Desempenho - 
> LCAD
> Instituto de Ciências Matemáticas e de Computação - 
> ICMC
> Universidade de São Paulo - USP 
>
>
>
>
>
> On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro wrote:
>
>> O melhor será separar esta função em duas:
>> A primeira que verifique se os campos existem e se não os criam.
>> E a segunda como disparador para que se actualizem com os inserts e
>> updates.
>> Obrigado pela ajuda!
>>
>>
>> Eloi Ribeiro
>> GIS Analyst
>> 39,45º -0,40º
>> flavors.me/eloiribeiro
>>
>>
>> No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel <
>> fha...@gmail.com> escreveu:
>>
>> > Cancelando as demais transações/conexões também resolve seu problema
>>> > *se, e somente se* isto não for um problema no seu cenário.
>>>
>>> Minha experiência com DDL dentro de funções é de resultado sempre
>>> inesperado.
>>> Se a função é específica para ser executada em horário controlado,
>>> geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
>>> executando funções do que comandos mais complexos ou scripts.
>>> Já se a função é para ser chamada automaticamente por causa de uma
>>> necessidade de uma aplicação ou usuário, a chance de lock é
>>> monstruosa, e é o que está ocorrendo com o colega.
>>>
>>> []s
>>> Flavio Gurgel
>>> ___
>>> pgbr-geral mailing list
>>> pgbr-geral@listas.postgresql.org.br
>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>
>>
>>
>> ___
>> pgbr-geral mailing list
>> pgbr-geral@listas.postgresql.org.br
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>>
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-20 Thread Matheus de Oliveira
A trigger é BEFORE? Caso contrário não atualiza mesmo.


--
Matheus de Oliveira

Bacharelado em Ciências de Computação
Laboratório de Computação de Alto Desempenho -
LCAD
Instituto de Ciências Matemáticas e de Computação -
ICMC
Universidade de São Paulo - USP 




On Tue, Mar 20, 2012 at 10:57 AM, Eloi Ribeiro wrote:

> Obrigado a todos pelas vossas dicas.
>
> Fiz isso, retirei a parte de criação de colunas da função e agora não
> salta nenhum erro.
> No entanto seria de esperar que quando um polígono fosse editado o campo
> área fosse actualizado e isso não acontece.
>
> Alguém me sabe dizer o que é que está mal?
>
>
>
> CREATE OR REPLACE FUNCTION fun_dimensoes()
>   RETURNS trigger AS
> $BODY$
> DECLARE
> tipovarchar(20);
> sridinteger;
> BEGIN
> tipo :=(SELECT "type" FROM geometry_columns
> WHERE f_table_schema = TG_TABLE_SCHEMA
> AND f_table_name = TG_TABLE_NAME);
> srid :=(SELECT srid FROM geometry_columns
> WHERE f_table_schema = TG_TABLE_SCHEMA
> AND   f_table_name = TG_TABLE_NAME);
>  -- ponto
> IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN
> NEW.x = ST_X(NEW.geom);
> NEW.y = ST_Y(NEW.geom);
> -- linha
> ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN
>
> IF (srid = 23030 OR srid = 25830) THEN
> NEW.longitude = ST_Length(NEW.geom)::bigint;
>
> ELSIF (srid = 4326) THEN
> NEW.longitude = ST_Length(Geography(NEW.geom))::bigint;
> END IF;
> -- poligono
> ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
>
> IF (srid = 23030 OR srid = 25830) THEN
> NEW.area = ST_Area(NEW.geom)::bigint;
> NEW.perimetro = ST_Perimeter(NEW.geom)::bigint;
>
> ELSIF (srid = 4326) THEN
> NEW.area = ST_Area(Geography(NEW.geom))::bigint;
> NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint;
> END IF;
> END IF;
>
> RETURN NEW;
> END;
> $BODY$
>   LANGUAGE 'plpgsql' VOLATILE
>   COST 100;
>
> Obrigado,
>
>
> Eloi Ribeiro
> GIS Analyst
> 39,45º -0,40º
> flavors.me/eloiribeiro
>
>
> No dia 17 de Março de 2012 21:39, Matheus de Oliveira <
> matioli.math...@gmail.com> escreveu:
>
> Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não
>> ter lock "aumentam", mas não "desaparecem". Analisando por cima suas
>> necessidades, não acredito que a melhor solução seja realmente adicionar
>> uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
>> seja, sempre adicione a coluna (talvez junto com a execução do comando
>> CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
>> até fazer a verificação e dar um RAISE EXCEPTION caso não exista).
>>
>> PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em
>> usar herança nessas tabelas para organizar melhor as coisas.
>>
>> Atenciosamente,
>> --
>> Matheus de Oliveira
>>
>> Bacharelado em Ciências de Computação
>> Laboratório de Computação de Alto Desempenho - 
>> LCAD
>> Instituto de Ciências Matemáticas e de Computação - 
>> ICMC
>> Universidade de São Paulo - USP 
>>
>>
>>
>>
>>
>> On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro wrote:
>>
>>> O melhor será separar esta função em duas:
>>> A primeira que verifique se os campos existem e se não os criam.
>>> E a segunda como disparador para que se actualizem com os inserts e
>>> updates.
>>> Obrigado pela ajuda!
>>>
>>>
>>> Eloi Ribeiro
>>> GIS Analyst
>>> 39,45º -0,40º
>>> flavors.me/eloiribeiro
>>>
>>>
>>> No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel <
>>> fha...@gmail.com> escreveu:
>>>
>>> > Cancelando as demais transações/conexões também resolve seu problema
 > *se, e somente se* isto não for um problema no seu cenário.

 Minha experiência com DDL dentro de funções é de resultado sempre
 inesperado.
 Se a função é específica para ser executada em horário controlado,
 geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
 executando funções do que comandos mais complexos ou scripts.
 Já se a função é para ser chamada automaticamente por causa de uma
 necessidade de uma aplicação ou usuário, a chance de lock é
 monstruosa, e é o que está ocorrendo com o colega.

 []s
 Flavio Gurgel
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

>>>
>>>
>>> ___
>>> pgbr-geral mailing list
>>> pgbr-geral@listas.postgresql.org.br
>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>
>>>
>>
>> ___
>> pgbr-geral maili

Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função

2012-03-20 Thread Eloi Ribeiro
Sim, não está bem assim?

CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes
BEFORE INSERT OR UPDATE
ON sch_forestal.postfire_study_area
FOR EACH ROW
EXECUTE PROCEDURE fun_dimensoes();


Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 20 de Março de 2012 15:09, Matheus de Oliveira <
matioli.math...@gmail.com> escreveu:

> A trigger é BEFORE? Caso contrário não atualiza mesmo.
>
>
>
> --
> Matheus de Oliveira
>
> Bacharelado em Ciências de Computação
> Laboratório de Computação de Alto Desempenho - 
> LCAD
> Instituto de Ciências Matemáticas e de Computação - 
> ICMC
> Universidade de São Paulo - USP 
>
>
>
>
> On Tue, Mar 20, 2012 at 10:57 AM, Eloi Ribeiro wrote:
>
>> Obrigado a todos pelas vossas dicas.
>>
>> Fiz isso, retirei a parte de criação de colunas da função e agora não
>> salta nenhum erro.
>> No entanto seria de esperar que quando um polígono fosse editado o campo
>> área fosse actualizado e isso não acontece.
>>
>> Alguém me sabe dizer o que é que está mal?
>>
>>
>>
>> CREATE OR REPLACE FUNCTION fun_dimensoes()
>>   RETURNS trigger AS
>> $BODY$
>> DECLARE
>> tipovarchar(20);
>> sridinteger;
>> BEGIN
>> tipo :=(SELECT "type" FROM geometry_columns
>> WHERE f_table_schema = TG_TABLE_SCHEMA
>> AND f_table_name = TG_TABLE_NAME);
>> srid :=(SELECT srid FROM geometry_columns
>> WHERE f_table_schema = TG_TABLE_SCHEMA
>> AND   f_table_name = TG_TABLE_NAME);
>>  -- ponto
>> IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN
>> NEW.x = ST_X(NEW.geom);
>> NEW.y = ST_Y(NEW.geom);
>> -- linha
>> ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN
>>
>> IF (srid = 23030 OR srid = 25830) THEN
>> NEW.longitude = ST_Length(NEW.geom)::bigint;
>>
>> ELSIF (srid = 4326) THEN
>> NEW.longitude = ST_Length(Geography(NEW.geom))::bigint;
>> END IF;
>> -- poligono
>> ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
>>
>> IF (srid = 23030 OR srid = 25830) THEN
>> NEW.area = ST_Area(NEW.geom)::bigint;
>> NEW.perimetro = ST_Perimeter(NEW.geom)::bigint;
>>
>> ELSIF (srid = 4326) THEN
>> NEW.area = ST_Area(Geography(NEW.geom))::bigint;
>> NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint;
>> END IF;
>> END IF;
>>
>> RETURN NEW;
>> END;
>> $BODY$
>>   LANGUAGE 'plpgsql' VOLATILE
>>   COST 100;
>>
>> Obrigado,
>>
>>
>> Eloi Ribeiro
>> GIS Analyst
>> 39,45º -0,40º
>> flavors.me/eloiribeiro
>>
>>
>> No dia 17 de Março de 2012 21:39, Matheus de Oliveira <
>> matioli.math...@gmail.com> escreveu:
>>
>> Se você passar a trigger para AFTER ao invés de BEFORE suas chances de
>>> não ter lock "aumentam", mas não "desaparecem". Analisando por cima suas
>>> necessidades, não acredito que a melhor solução seja realmente adicionar
>>> uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
>>> seja, sempre adicione a coluna (talvez junto com a execução do comando
>>> CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
>>> até fazer a verificação e dar um RAISE EXCEPTION caso não exista).
>>>
>>> PS: Caso a trigger seja genérica para várias tabelas, você pode pensar
>>> em usar herança nessas tabelas para organizar melhor as coisas.
>>>
>>> Atenciosamente,
>>> --
>>> Matheus de Oliveira
>>>
>>> Bacharelado em Ciências de Computação
>>> Laboratório de Computação de Alto Desempenho - 
>>> LCAD
>>> Instituto de Ciências Matemáticas e de Computação - 
>>> ICMC
>>> Universidade de São Paulo - USP 
>>>
>>>
>>>
>>>
>>>
>>> On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro 
>>> wrote:
>>>
 O melhor será separar esta função em duas:
 A primeira que verifique se os campos existem e se não os criam.
 E a segunda como disparador para que se actualizem com os inserts e
 updates.
 Obrigado pela ajuda!


 Eloi Ribeiro
 GIS Analyst
 39,45º -0,40º
 flavors.me/eloiribeiro


 No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel <
 fha...@gmail.com> escreveu:

 > Cancelando as demais transações/conexões também resolve seu problema
> > *se, e somente se* isto não for um problema no seu cenário.
>
> Minha experiência com DDL dentro de funções é de resultado sempre
> inesperado.
> Se a função é específica para ser executada em horário controlado,
> geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
> executando funções do que comandos mais complexos ou scripts.
> Já se a função é para ser chamada automaticamente por causa de uma
> necessidade de uma aplicação ou usuário, a chance de lock é
> monstruosa, e é o que está ocorrendo com o