PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Definieren Sie dynamisch zurückgegebene Zeilentypen basierend auf einer übergebenen angegebenen Tabelle in plpgsql?

Wenn Sie mit „basierend auf einer bekannten Tabelle“ „genau wie eine bekannte Tabelle“ meinen, dann ja .

SQL ist eine streng typisierte Sprache, und Funktionen müssen mit einem gut definierten Rückgabetyp erstellt werden. Sie können auf anonyme Aufzeichnungen zurückgreifen so wie du es offensichtlich getan hast (mit RETURNS SETOF record ), aber dann müssen Sie für jeden Aufruf eine Spaltendefinitionsliste hinzufügen, wie die Fehlermeldung Ihnen sagt. Etwas wie:

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

Und das ist kaum dynamisch.

Ihre Frage lässt Raum für Interpretationen, aber "basiert auf einer bekannten Tabelle" würde darauf hindeuten, dass es sich um eine polymorphe Funktion handelt könnte den Trick machen. Der Rückgabetyp kann dynamisch auf jedem registrierten Zeilentyp basieren, und es gibt automatisch einen für jede Tabelle im System. Barebone-Codebeispiel:

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;

Aufruf:

SELECT * FROM my_function(NULL::my_table);

Detaillierte Anweisungen in dieser verwandten Antwort (siehe letztes Kapitel "Verschiedene vollständige Tabellentypen"). ):