sql >> Databasteknik >  >> RDS >> PostgreSQL

Dynamiskt definiera returnerande radtyper baserat på en godkänd given tabell i plpgsql?

Om du med "baserat på en känd tabell" menar "exakt som en känd tabell", så ja .

SQL är ett strikt skrivet språk och funktioner måste skapas med en väldefinierad returtyp. Du kan falla tillbaka till anonyma poster som du uppenbarligen gjorde (med RETURNS SETOF record ), men då måste du lägga till en kolumndefinitionslista för varje samtal, som felmeddelandet säger. Något i stil med:

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

Och detta är knappast dynamiskt.

Din fråga lämnar utrymme för tolkning, men "baserat på en känd tabell" skulle indikera att en polymorf funktion kan göra susen. Returtypen kan baseras på valfri registrerad radtyp dynamiskt, och det finns en automatiskt för varje tabell i systemet. Barebone-kodexempel:

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;

Ring:

SELECT * FROM my_function(NULL::my_table);

Detaljerade instruktioner i det här relaterade svaret (se det sista kapitlet "Olika kompletta tabelltyper" ):




  1. Skapar du en länkad lista eller liknande kö i MySQL?

  2. Är det bra att använda en huvudtabell för delade kolumner för en hel databas?

  3. Kan en underfråga användas i en Oracle ALTER-sats?

  4. Aggregera funktioner på flera sammanfogade tabeller