Em quinta-feira, 1 de setembro de 2011 22:04:55, Pedro Cavalheiro escreveu: > Boa noite a todos! > > Fabiano, > >> 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? > > Sim, o retorno deve ser os registros do select. No caso de alguém > passar uma query multipla, acredito que o mais fácil seria levar em > conta apenas a última (ignorando os retornos anteriores). Até por isso > comentei que pode funcionar de um jeito ou de outro (retornando tudo > ou apenas a última consulta, o que for mais fácil para definir). No > caso de insert, update ou delete, não é necessário retornar nada. > >> O retorno como está não funciona para trazer vários registros, para isso >> você deve usar um setof com record ou type. > > Sim, estou ciente disso. Justamente por isso que entrei em contato com > o grupo, não sei como prosseguir. Tentei definir de diversos modos
> diferentes a combinação de setof, record, entre outros, mas sempre > recebia algum erro. > Não entendi bem a sintaxe que precisa ser definida para receber o > retorno em tabela. > Queria algo como adicionar os resultados da query numa variável, e > retornar essa variável (isso é apenas uma explicação, não sei se é > possível em pgplsql). > > Infelizmente, não tenho como criar uma função para criação das querys. > Já existe um sistema em funcionamento, com diversos consultas > "gigantescas" que tornam a ideia inviável. > O único modo de fazer isto é definindo retorno por type? Quais as > exigências deste tipo? Não existe algum modo mais prático, sem nenhum > tipo de "filtro", para retornar uma tabela de uma consulta? > > Desde já, agradeço pela ajuda. > > Abraços a todos. > > Atenciosamente, > Pedro Cavalheiro > > Em 1 de setembro de 2011 20:01, Fabiano Machado Dias > <[email protected]> escreveu: >> Em 1/9/2011 17:49, Pedro Cavalhe iro 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; >> retur n '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 co nteú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 >> >> _______________________________________________ >> pgbr-geral mailing list >> [email protected] >> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral >> >> > _______________________________________________ > pgbr-geral mailing list > [email protected] > https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral Pelo que vi você quer logar o acesso à certas tabelas, correto? Ao invés de usar uma função mega hiper complexa, por que não usa rules? Você pode adicionar um rule para insert, delete, update E select, facilitando muito sua vida. E claro, qualquer acesso á tabel a que nao pela sua função nao será logado, mas pela rule sim. _______________________________________________ pgbr-geral mailing list [email protected] https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
