Vous êtes sur la page 1sur 2

Retornando registros de consultas genricas com RETURN QUERY

Recentemente, recebi uma dvida sobre o RETURN QUERY, funcionalidade implementada na verso 8.3 do PostgreSQL, que permite o retorno de conjuntos de linhas e colunas de uma funo. A dvida do Patrick bastante comum e at pouco tempo eu no teria uma resposta adequada:

"Patrick Espake disse... Eu estou tentando usar isso, para retorna uma linha que vem de um inner join de diversas tabelas. O que eu coloco para o RETURNS SETOF? Visto que os meus dados vem de uma juno de diversas tabelas. Obrigado."

A soluo do problema do Patrick relativamente simples. O Return Query aceita o tipo RECORD como valor de retorno. Portanto, fica fcil retornar resultados de consultas genricas. Para ilustrar, segue um exemplo de cdigo Pl/ PgSQL abaixo. A tabela indivduo ser utilizada para o teste do RETURN QUERY retornando uma consulta qualquer. CREATE TABLE individuo ( cod integer PRIMARY KEY, nome varchar(50)); INSERT INTO individuo VALUES (1,'Teste'); INSERT INTO individuo VALUES (2,'Teste 2'); Agora, a funo RET_ROWS mostra como utilizar o retorno de tipos RECORD para funes: --Retornando consulta de vrias linhas CREATE OR REPLACE FUNCTION ret_rows () RETURNS SETOF RECORD AS $$ BEGIN RETURN QUERY SELECT * FROM individuo; -- Acrescenta um conjunto de linhas ao retorno da funo RETURN ; -- Retorna as linhas END; $$ LANGUAGE plpgsql; A grande diferena desta forma de programar est na chamada da funo. Ao utilizar valor de retorno do tipo RECORD, deve ser indicada a lista de campos a serem retornados e seus tipos. Esta pode ser vista como uma limitao, embora na prtica tambm seja uma forma de se garantir a confiabilidade dos resultados retornados na execuo de comandos SQL dentro de funes pela validao dos valores retornados. SELECT * from ret_rows() as (c1 integer, c2 varchar(50)) ; --Declarao dos campos do record

Falta considerar a execuo de uma juno dentro da funo, que nossa questo original. Para tanto, ser criada uma tabela com os filhos dos indivduos para sofrer juno com a de indivduos. O exemplo abaixo executou sem qualquer problema na verso 8.3: CREATE TABLE filhos ( cod integer PRIMARY KEY, filhos integer); INSERT INTO filhos VALUES (1,1); INSERT INTO filhos VALUES (2,3); --Retornando Resultado de Juno CREATE OR REPLACE FUNCTION ret_filhos (psql integer) RETURNS SETOF RECORD AS $$ BEGIN RETURN QUERY SELECT individuo.nome, filhos.filhos FROM individuo, filhos WHERE individuo.cod = filhos.cod AND individuo.cod = $1; -- Consulta RETURN ; -- Retorna as linhas END; $$ LANGUAGE plpgsql; SELECT * from ret_filhos(1) as (c1 varchar(50), c2 integer) ; --Declarao dos campos de retorno SELECT * from ret_filhos(2) as (c1 varchar(50), c2 integer) ; Outras Solues Outras solues para o retorno de registros em funes so a consolidao e retorno dos dados dentro de um campo texto ou XML.

Vous aimerez peut-être aussi