Има различни опции в зависимост от цялостната картина.
По принцип вашата функция за вмъкване може да работи по следния начин:
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;
Използване на типа ред на изгледа , защото NEW
във вашия тригер е от този тип.
Използвайте проста SQL функция, която може да бъде вградена и може да работи по-добре.
Демо разговор:
SELECT insert_thing('(1, foo, 1, bar)');
Във вашия тригер flavored_trig ()
:
inserted_id := insert_thing(NEW);
Или, основно пренаписано:
IF TG_OP = 'INSERT' THEN
INSERT INTO flavored_things(thing_id, flavor)
VALUES (insert_thing(NEW), NEW.flavor);
RETURN NEW;
ELSIF ...
не е валиден тип извън PL/pgSQL, това е просто общ заместител за все още неизвестен тип ред в PL/pgSQL), така че не можете да го използвате за входен параметър в декларация на функция.record
За по-динамична функция, приемаща различни типове редове можете да използвате полиморфен типа . Примери:
- Как да върна таблица по тип ред в PL/pgSQL
- Рефакторинг на PL/pgSQL функция, за да върне резултата от различни SELECT заявки
- Как да напиша функция, която връща текст или цели числа?