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

Jak předat záznam funkci PL/pgSQL?

Existují různé možnosti v závislosti na úplném obrázku.
V zásadě by funkce vkládání mohla fungovat takto:

CREATE FUNCTION insert_thing (_thing flavored_view)
   RETURNS int AS
$func$
   INSERT INTO things (name) VALUES ($1.name) -- plus 30 more columns
   RETURNING id;
$func$ LANGUAGE sql;

Pomocí typu řádku zobrazení , protože NEW ve vašem spouštěči je tohoto typu.
Použijte jednoduchou funkci SQL, která může být vložena a může fungovat lépe.

Demo volání:

SELECT insert_thing('(1, foo, 1, bar)');

Uvnitř spouštěče flavored_trig () :

inserted_id := insert_thing(NEW);

Nebo v podstatě přepsáno:

IF TG_OP = 'INSERT' THEN
   INSERT INTO flavored_things(thing_id, flavor)
   VALUES (insert_thing(NEW), NEW.flavor);
   RETURN NEW;
ELSIF ...

record není platný typ mimo PL/pgSQL, je to pouze obecný zástupný symbol pro dosud neznámý typ řádku v PL/pgSQL), takže jej nemůžete použít pro vstupní parametr v deklaraci funkce.

Pro dynamičtější funkci akceptující různé typy řádků můžete použít polymorfní typ . Příklady:



  1. chyba mysqldump:Mám paket větší než max_allowed_packet'

  2. Smazat vybrané položky pomocí modálního potvrzení PHP

  3. Databáze MySQL s jedinečnými poli ignorovala koncové mezery

  4. Existuje důvod, proč MySQL nepodporuje FULL OUTER JOINS?