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

Dynamisk definere returnerende rækketyper baseret på en bestået given tabel i plpgsql?

Hvis du med "baseret på en kendt tabel" mener "præcis som en kendt tabel", så ja .

SQL er et strengt skrevet sprog, og funktioner skal oprettes med en veldefineret returtype. Du kan falde tilbage til anonyme poster som du tydeligvis gjorde (med RETURNS SETOF record ), men så er du forpligtet til at tilføje en kolonnedefinitionsliste for hvert opkald, som fejlmeddelelsen fortæller dig. Noget som:

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

Og det er næppe dynamisk.

Dit spørgsmål giver plads til fortolkning, men "baseret på en kendt tabel" ville indikere, at en polymorf funktion kan gøre tricket. Returtypen kan baseres på enhver registreret rækketype dynamisk, og der er automatisk en for hver tabel i systemet. Barebone kode eksempel:

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 til:

SELECT * FROM my_function(NULL::my_table);

Detaljerede instruktioner i dette relaterede svar (se det sidste kapitel "Forskellige komplette tabeltyper" ):




  1. Mine SQL-fletningsrækker

  2. Hvordan forespørger jeg en streng fra JSON baseret på en anden streng i JSON i PostgreSQL?

  3. Sådan rettes Microsoft SQL Server Error 926? - Løst

  4. Generer tabelrelationsdiagram fra eksisterende skema (SQL-server)