sql >> Database >  >> RDS >> PostgreSQL

Hoe geef ik een record door aan een PL/pgSQL-functie?

Er zijn verschillende opties, afhankelijk van het volledige plaatje.
Kortom, uw invoegfunctie zou als volgt kunnen werken:

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;

Het rijtype van de weergave gebruiken , omdat NEW in uw trigger is van dit type.
Gebruik een eenvoudige SQL-functie, die inline kan worden geplaatst en mogelijk beter presteert.

Demo-oproep:

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

Binnen je trigger flavored_trig () :

inserted_id := insert_thing(NEW);

Of eigenlijk herschreven:

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

record is geen geldig type buiten PL/pgSQL, het is gewoon een generieke tijdelijke aanduiding voor een nog onbekend rijtype in PL/pgSQL), dus je kunt het niet gebruiken voor een invoerparameter in een functiedeclaratie.

Voor een meer dynamische functie die verschillende rijtypes accepteert je zou een kunnen gebruiken polymorf type . Voorbeelden:



  1. Hoe automatisch verhogen binnen een subset van de tabel MYSQL

  2. Waarom kan het PHP-script niet in de MySQL-database worden ingevoegd?

  3. Groeperen op X of Y?

  4. DBaaS-failoveroplossingen vergelijken met handmatige herstelconfiguraties