如果我们创建一个如下所示的表格:
create table tbl(
col1 varchar,
col2 ltree)
如果有col1的插入,我们如何用col1值更新col2?
下面的函数是在CAST抛出错误吗?
CREATE OR REPLACE FUNCTION insert_col2()
RETURNS TRIGGER AS
$BODY$ DECLARE
col11 varchar;
new_lable_path ltree;
BEGIN
col11 = new.col1;
perform replace(col11, '/', '.');
select CAST(col11 as ltree);
new_lable_path = col11;
UPDATE tbl SET col2 = new_lable_path WHERE tbl.col1 = new.col1;
COMMIT TRANSACTION;
END;
$BODY$ LANGUAGE plpgsql;
CREATE TRIGGER insert_col2 AFTER INSERT ON tbl
FOR EACH ROW EXECUTE PROCEDURE insert_col2();
错误:
ERROR: syntax error at position 4
CONTEXT: PL/pgSQL function insert_col2() line 8 at assignment
答案 0 :(得分:1)
你的功能有一些问题,一般来说,依靠自动投射可以简单得多:
CREATE OR REPLACE FUNCTION insert_col2() RETURNS TRIGGER AS $BODY$
BEGIN
NEW.col2 = replace(NEW.col1, '/', '.');
RETURN NEW;
END;
$BODY$ LANGUAGE plpgsql;
CREATE TRIGGER insert_col2 BEFORE INSERT ON tbl
FOR EACH ROW EXECUTE PROCEDURE insert_col2();
您必须从成功结束的RETURN NEW
触发器中始终 INSERT
。没有RETURN
语句会抛出错误,没有限定符的RETURN
将取消插入。另请注意,触发器会被触发BEFORE
,以便正确设置col2
列。
每个函数都是一个隐式事务块,不需要显式COMMIT
。
我建议您阅读plpgsql文档中有关触发器的部分。