Em quinta-feira, 1 de setembro de 2011 23:25:54, George R. C. Silva 
escreveu:
> 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 p
or 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 d
e 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 muit
o 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 à cer
tas 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.

Pf, esquece minha sugestão, não é isso que você precisa. Desculpem pelo 
barulho..
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a