Em 1/9/2011 17:49, Pedro Cavalheiro escreveu:
Opa!

Segue a função atual:

Ela pode receber todo tipo de consulta, desde select, insert,
delete... enfim, qualquer comando, sendo que também é possível que ela
receba mais de 1 ao mesmo tempo. ex. "insert into tabela (coluna)
values ('valor'); select * from tabela;"
Neste caso, o que importa para o retorno é apenas o select (não sei se
isso faz diferença para a complexidade).
Os outros parâmetros são gravados em uma tabela que é consultada em
uma trigger disparada em INSERT, UPDATE, ou DELETE. (essa parte está
funcionando perfeitamente)

CREATE OR REPLACE FUNCTION log_user (
   sql text,
   id_user integer,
   cod_deck integer
)
RETURNS text AS
$body$
DECLARE
   USUARIO INTEGER := id_user;
   DECK INTEGER := cod_deck;
BEGIN
     PERFORM ul.id FROM log_usuario ul LIMIT 1 FOR UPDATE;
     UPDATE log_usuario SET id=USUARIO, id_deck=DECK;
     execute sql;
     return 'ops ^^';
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 100;


Desde já, agradeço pela ajuda.

Atenciosamente,
Pedro Cavalheiro

O seu retorno seria os registros do "select"? E se alguém passar um passar um comando "select * from tabela; insert into tabela..." ? O retorno seria o que?

O retorno como está não funciona para trazer vários registros, para isso você deve usar um setof com record ou type.

Uma record para você não adianta porque na chamada você precisa saber o retorno da pl.

Já um type é mais flexível mas você precisaria definir ele antes, então você poderia criar ele antes usando a estrutura do select, mas isso é algo bem complicado, vai ter que pensar muito bem, tratar erros, saber os tipos de campos ou talvez consultar no catálogo.

Eu uso uma pl que escreve os comandos, mas faço diferente, passo os campos e os conteúdos por array, o nome da tabela e a ação, daí ela monta a query e executa.

Dá uma olhada na documentação:

http://www.postgresql.org/docs/9.0/interactive/plpgsql-control-structures.html

Abraço,
Fabiano Machado Dias

 * Português - detectado
 * Inglês
 * Português

 * Inglês
 * Português

<javascript:void(0);>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a