sql >> Database >  >> RDS >> PostgreSQL

Dynamisch terugkerende rijtypen definiëren op basis van een opgegeven tabel in plpgsql?

Als u met "gebaseerd op een bekende tabel" bedoelt "precies als een bekende tabel", dan ja .

SQL is een strikt getypeerde taal en functies moeten worden gemaakt met een goed gedefinieerd retourtype. U kunt terugvallen op anonieme records zoals je duidelijk deed (met RETURNS SETOF record ), maar dan moet u voor elke aanroep een kolomdefinitielijst toevoegen, zoals de foutmelding aangeeft. Iets als:

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

En dit is nauwelijks dynamisch.

Uw vraag laat ruimte voor interpretatie, maar "gebaseerd op een bekende tabel" zou aangeven dat een polymorfe functie zou kunnen lukken. Het retourtype kan dynamisch worden gebaseerd op elk geregistreerd rijtype en er is er automatisch een voor elke tabel in het systeem. Barebone-code voorbeeld:

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;

Bel:

SELECT * FROM my_function(NULL::my_table);

Gedetailleerde instructies in dit gerelateerde antwoord (kijk naar het laatste hoofdstuk "Verschillende complete tabeltypes" ):




  1. veilig specificeren van de 'order by'-clausule van gebruikersinvoer in python / postgresql / psycopg2

  2. Welke Time-Series Database is beter:TimescaleDB vs InfluxDB

  3. wat is Oracle data-integrator?

  4. Mysql-query bouwen om specifieke gegevens onder dezelfde tabel/rij te tellen