PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Definire dinamicamente i tipi di riga di ritorno in base a una determinata tabella passata in plpgsql?

Se per "basato su una tabella nota" intendi "esattamente come una tabella nota", allora .

SQL è un linguaggio rigorosamente tipizzato e le funzioni devono essere create con un tipo restituito ben definito. Puoi ricorrere a record anonimi come hai fatto ovviamente (con RETURNS SETOF record ), ma poi ti viene richiesto di aggiungere un elenco di definizioni di colonna per ogni chiamata, come ti dice il messaggio di errore. Qualcosa come:

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

E questo non è affatto dinamico.

La tua domanda lascia spazio all'interpretazione, ma "basata su una tabella nota" indicherebbe una funzione polimorfica potrebbe fare il trucco. Il tipo restituito può essere basato su qualsiasi tipo di riga registrato in modo dinamico e ce n'è uno per ogni tabella nel sistema automaticamente. Esempio di codice 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;

Chiama:

SELECT * FROM my_function(NULL::my_table);

Istruzioni dettagliate in questa risposta correlata (guarda l'ultimo capitolo "Vari tipi di tabelle complete" ):