2011-08-15 31 views
15

Actualmente estoy escribiendo una función en postgresql 9.04 en la que intento utilizar una variable que se utilizará en una declaración de selección y luego devuelvo los resultados.función devuelve varias columnas como una sola columna en lugar de varias columnas

La declaración que he encontrado es simple y funciona; sin embargo, todas las columnas están produciendo en una sola columna en lugar de columnas múltiples.

aquí es mi función:

create or replace function foo(IN pID integer, OUT project_id integer, OUT project_name text, OUT project_type text, OUT project_description text, OUT project_status text) 
returns setof record as 

$$ 
select project_id, project_name, project_type, project_description, project_status from  t_projects 
where project_id = $1; 
$$ 

LANGUAGE SQL; 


select foo(6) -- runs function 

la salida de corriente se ve así:

"(6,"test project","inbound","inbound test","processing")" 

cómo puedo hacer que sea lo que los resultados no se concatenan juntos y volver cada elemento de la columna por separado?

gracias de antemano.

+1

¿Por qué tiene un tipo de devolución de 'setof record' mientras también declara' OUT' las columnas que coinciden con ' SELECCIONAR'? ¿Pretendes devolver registros o llenar los parámetros 'OUT'? Debes elegir un enfoque, no los dos. – cdhowie

+0

postgresql todavía es nuevo para mí, ya que estoy acostumbrado a trabajar en microsoft sql erver. Idealmente, me gustaría devolver los resultados de la declaración seleccionada. En mis búsquedas de google encontré que las personas crearían un tipo con la salida designada o colocarían las salidas en la función. Actualmente, todavía estoy en la fase de comprensión de postgresql :) – richh

Respuesta

27

que necesita llamar a la función como esta:

select * from foo(6); 

que devolverá algo como esto:

project_id | project_name | project_type | project_description | project_status 
-----------|--------------|--------------|---------------------|---------------- 
     6 | test project |  inbound |  inbound test |  processing 

es un capricho de postgres que puede ser llamado en ambos sentidos y darle una resultado. Es posible que desee comprobar los documentos en las funciones de devolución del juego un poco más, hay otras formas de hacer esto también. Ah, hay una página wiki escrita para plpgsql, pero la mayoría también se aplica a las funciones sql: http://wiki.postgresql.org/wiki/Return_more_than_one_row_of_data_from_PL/pgSQL_functions

+0

Eso lo hizo ... muchas gracias. :) – richh

+0

Eso es realmente peculiar. – mvexel

+0

¿Por qué 'select * from foo (6)' es un error al definir foo() con 'create o replace function foo (int) devuelve setof record como $$ SELECT $ 1 como a, 'xx' como b; $$ LANGUAGE SQL; '?? –

Cuestiones relacionadas