2012-02-06 8 views
5

Estoy usando la base de datos PostgreSQL.SELECCIONAR DE una función que devuelve un registro con arbirary número de columnas

Tengo un plpgsql FUNCTION que devuelve un solo record con un número arbitrario de columnas.
Debido a esta arbitrariedad que tendría que utilizar algo como:

SELECT * FROM my_function(97) 

Pero esto no funciona como Postgres me da el siguiente error:

a column definition list is required for functions returning "record"

Pero si lo hago:

SELECT my_function(97) 

Puedo ver el resultado esperado pero encapsulado en una sola columna.

¿Hay alguna manera de obtener el resultado esperado como un conjunto de columnas según lo previsto por la función y no una sola columna que las encapsula?

Respuesta

0

Con el fin de devolver un "conjunto de columnas" tendrá que definir un tipo de retorno como TABLE o SETOF en cuyo caso se vuelven en realidad un conjunto de registros que debe ser capaz de SELECT partir.

Para obtener más información acerca de las funciones que retornan SETOF echar un vistazo a this link to documentation

+1

El problema es que la mesa espera un conjunto fijo de columnas de todos modos, por lo que no resolvería el problema de todos modos, mi problema es cómo buscar a partir de una función que no puede devolver un registro con un número arbitrario de columnas, digamos que una vez devuelve un registro con 3 columnas, otro registro de tiempo con 2 columnas. –

+2

@ flash.tato En ese caso, ¿cómo propone seleccionar algo si no sabe cómo se vería su salida? – Karlson

+0

Creo que el motor debería inspeccionar el REGISTRO y obtener los metadatos de los campos –

2

Usted tiene algunas opciones aquí:

  1. devolver un REFCURSOR a buscar a partir de ese cursor en la aplicación. Tenga en cuenta que en realidad puede devolver varios REFCURSORS si necesita devolver múltiples conjuntos de resultados.

  2. Devuelva un documento XML y analícelo en la aplicación.

  3. Use un montón de variables OUT, RECORD volver, y determinar cuál de estos para seleccionar de

El problema básico es que los resultados de retorno reales necesitan ser conocidas en planificación tiempo por lo que no puede simplemente devolver un número arbitrario de columnas. El planificador necesita saber qué se devolverá.

5

Cuando una función simplemente RETURNS record o SETOF record (y no hay OUT parámetros para ir con ella), PostgreSQL no saben los nombres y tipos de sus elementos y que están obligados a proporcionar una lista de definición de columnas con cada llamada.

Evitar que si es posible y devolver un conocido tipo en su lugar. Además del workarounds @Chris provided, hay varias formas de declarar el tipo de devolución.Escribí respuestas relacionadas integrales recientemente:

Hay un buen número de preguntas relacionadas en ya SO. Recuerdo haber respondido a muchos de ellos.
Try a search!

1

Cuando se utiliza un conjunto de regresar de función (setof) en la lista de selección, en el lado izquierdo de la DE, la función devuelve un composite type. Usar una función en la lista de selección puede ser difícil de evitar cuando se usa una tabla como entrada para una función.

una manera de seleccionar los artículos en una sola columna de tipo compuesto siguiente:

SELECT 
    (my_function).field1, 
    (my_function).field2, 
    (my_function).field3 
FROM 
(SELECT my_function(*) 
FROM sometable) t 
-1

No estoy seguro de que yo sigo lo que está buscando, pero hace este trabajo?

SELECT (my_function(97)).my_column 
Cuestiones relacionadas