我们如何将varchar变量值分配给postgres ltree列?

时间:2014-03-17 06:17:19

标签: sql postgresql

如果我们创建一个如下所示的表格:

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     

1 个答案:

答案 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文档中有关触发器的部分。