sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Definir dinámicamente los tipos de filas que regresan en función de una tabla dada pasada en plpgsql?

Si por "basado en una tabla conocida" quiere decir "exactamente como una tabla conocida", entonces .

SQL es un lenguaje estrictamente tipado y las funciones deben crearse con un tipo de retorno bien definido. Puede recurrir a registros anónimos como obviamente lo hiciste (con RETURNS SETOF record ), pero luego debe agregar una lista de definición de columna para cada llamada, como le indica el mensaje de error. Algo como:

SELECT *
FROM   my_function('foo') AS foo (
          colum_name1 integer  -- name and data type for every column
        , colum_name2 text
        , colum_name3 real);

Y esto es difícilmente dinámico.

Su pregunta deja espacio para la interpretación, pero "basado en una tabla conocida" indicaría que una función polimórfica podría hacer el truco. El tipo de devolución se puede basar en cualquier tipo de fila registrada dinámicamente, y hay una para cada tabla en el sistema automáticamente. Ejemplo de código barebone:

CREATE OR REPLACE FUNCTION my_function(_rowtype anyelement)
  RETURNS SETOF anyelement AS
$func$
BEGIN
   RETURN QUERY EXECUTE format(
     'SELECT * FROM %s LIMIT 10'
    , pg_typeof(_rowtype)  -- pg_typeof() returns regtype, quoted where necessary
      );
END
$func$ LANGUAGE plpgsql;

Llamar:

SELECT * FROM my_function(NULL::my_table);

Instrucciones detalladas en esta respuesta relacionada (consulte el último capítulo "Varios tipos de tablas completas" ):