sql >> Databáze >  >> RDS >> PostgreSQL

Dynamicky definovat vracející se typy řádků na základě předané dané tabulky v plpgsql?

Pokud výrazem „na základě známé tabulky“ myslíte „přesně jako u známé tabulky“, pak ano .

SQL je striktně typovaný jazyk a funkce musí být vytvořeny s dobře definovaným návratovým typem. Můžete se vrátit k anonymním záznamům jako jste to zjevně udělali (se záznamem RETURNS SETOF record ), ale pak musíte pro každé volání přidat seznam definic sloupců, jak vám říká chybová zpráva. Něco jako:

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

A to je sotva dynamické.

Vaše otázka ponechává prostor pro interpretaci, ale "na základě známé tabulky" by znamenalo, že jde o polymorfní funkci mohl udělat trik. Návratový typ může být založen na libovolném registrovaném typu řádku dynamicky a pro každou tabulku v systému je automaticky jeden. Příklad bosého kódu:

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;

Volejte:

SELECT * FROM my_function(NULL::my_table);

Podrobné pokyny v této související odpovědi (podívejte se na poslední kapitolu "Různé kompletní typy tabulek" ):




  1. Sekvence v rámci SQL Select

  2. Objednejte více sloupců ASC

  3. SQLite - Vytvořte databázi

  4. Důležitá změna Extended Events v SQL Server 2012