我有2张桌子。表1和表2。只填充表1,然后通过触发器填充table2的值。
所以,我有这样的触发器,
CREATE OR REPLACE FUNCTION function_copy() RETURNS TRIGGER AS
$BODY$
BEGIN
INSERT INTO table2 (name) values ((select unnest(xpath('/attendee/bio/name/text()',data)) from table1));
RETURN new;
END;
$BODY$
language plpgsql;
触发功能
CREATE TRIGGER trig_copy
AFTER INSERT ON table1
FOR EACH ROW
EXECUTE PROCEDURE function_copy();
因此,当我向table1中插入多于一行时,我不断收到此错误
错误:用作表达式
的子查询返回多行
答案 0 :(得分:3)
不要使用lsvRequestParameters.Sorting = SortOrder.Ascending;
。使用insert . . . values
:
insert . . . select
INSERT INTO table2 (name)
select unnest(xpath('/attendee/bio/name/text()', data))
from table1;
子句假定只有一个值。您的查询表明要插入多行。
答案 1 :(得分:2)
@Gordon addresses your immediate SQL error。但整个方法都严重受损。您为每个插入的行处理整个表,这会创建一个稳定增加的重复流。 您稍后评论了如何修复冗余插入:
TRUNCATE TABLE2; INSERT INTO table2(name)...
有点......有创意。 :)但 不 。仅处理单个插入的行。 special variable NEW
正是出于此目的:
CREATE OR REPLACE FUNCTION function_copy()
RETURNS trigger AS
$func$
BEGIN
INSERT INTO table2 (name)
SELECT *
FROM unnest(xpath('/attendee/bio/name/text()', NEW.data))
RETURN NULL; -- irrelevant for AFTER trigger
END
$func$ LANGUAGE plpgsql;