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

Responder a