繁体   English   中英

在Pl / PgSQL中的变量中选择一个列默认值

[英]Select a column default value into a variable in Pl/PgSQL

我正在尝试实现一个通用的触发过程,以对表启用某种版本控制方案。 表均具有版本当前字段。 关于更新,在某些情况下基于条件,我想创建一行的新版本,而不是更新旧版本。 我在获取主键字段的默认值时遇到麻烦(总是id )。

这是我所做的:

CREATE FUNCTION version_trigger() RETURNS trigger AS $$
DECLARE
    id_default text;
    id_value text;

BEGIN
    IF version_condition() THEN
        old.current = false;

        -- I can read the default value
        SELECT column_default INTO id_default
               FROM  information_schema.columns
               WHERE table_name = TG_TABLE_NAME AND column_name = 'id';

        -- THIS DOESN'T WORK!
        EXECUTE 'SELECT $1' INTO id_value USING id_default;

        new.id = id_value;
        EXECUTE 'INSERT INTO ' || quote_ident(TG_TABLE_NAME) || ' SELECT ($1).*' USING new;
        RETURN old;
    END IF;

    -- regular UPDATE
    RETURN new;
END
$$ LANGUAGE plpgsql;

我只是错过了读取id的默认值的步骤(这只是nextval()调用)。 有人可以帮忙吗?

提前致谢!

您不能将占位符用于表达式。

如果DEFAULT没有引用来记录数据,则可以使用EXECUTE语句,但有一点不同

postgres=# DO $$
DECLARE x text; y text;
BEGIN
   x := (SELECT column_default
             FROM  information_schema.columns
             WHERE table_name = 'omega' AND column_name = 'a');
   EXECUTE 'SELECT ' || x INTO y;
   RAISE NOTICE '%', y;
END; 
$$;
NOTICE:  2
DO

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM