sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur skickar man en post till en PL/pgSQL-funktion?

Det finns olika alternativ, beroende på hela bilden.
I grund och botten kan din infogningsfunktion fungera så här:

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;

Använda radtypen för vyn , eftersom NEW i din utlösare är av den här typen.
Använd en enkel SQL-funktion, som kan infogas och kanske fungerar bättre.

Demosamtal:

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

Inuti din trigger flavored_trig () :

inserted_id := insert_thing(NEW);

Eller, i princip omskriven:

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

record är inte en giltig typ utanför PL/pgSQL, det är bara en generisk platshållare för en ännu okänd radtyp i PL/pgSQL) så du kan inte använda den för en indataparameter i en funktionsdeklaration.

För en mer dynamisk funktion som accepterar olika radtyper du kan använda en polymorf typ . Exempel:



  1. Vad är LEN() i SQL Server?

  2. Är det möjligt att göra en rekursiv SQL-fråga?

  3. Hur hämtar man värden lagrade i JSON-arrayen i själva MySQL-frågan?

  4. Kan jag få tillbaka standardvärden för kolumnnamn i en MySQL-tabell?