postgresql – 使用动态字段名称触发
发布时间:2020-12-13 16:04:30 所属栏目:百科 来源:网络整理
导读:我在更新表上创建PostgreSQL(9.3)触发器时遇到问题. 我想在循环中设置新值 EXECUTE 'NEW.'|| fieldName || ':=''some prepend data'' || NEW.' || fieldName || ';'; 其中fieldName是动态设置的.但是这个字符串引发错误 06001 我该如何实现这一目标? 解决方
我在更新表上创建PostgreSQL(9.3)触发器时遇到问题.
我想在循环中设置新值 EXECUTE 'NEW.'|| fieldName || ':=''some prepend data'' || NEW.' || fieldName || ';'; 其中fieldName是动态设置的.但是这个字符串引发错误
我该如何实现这一目标? 解决方法
您可以使用hstore运算符#=相当方便地实现它:
确保在search_path中包含的模式中正确安装了附加模块(每个数据库一次): > How to use % operator from the extension pg_trgm? 触发功能: CREATE OR REPLACE FUNCTION tbl_insup_bef() RETURNS TRIGGER AS $func$ DECLARE _prefix CONSTANT text := 'some prepend data'; -- your prefix here _prelen CONSTANT int := 17; -- length of above string (optional optimization) _col text := quote_ident(TG_ARGV[0]); _val text; BEGIN EXECUTE 'SELECT $1.' || _col USING NEW INTO _val; IF left(_val,_prelen) = _prefix THEN -- do nothing: prefix already there! ELSE NEW := NEW #= hstore(_col,_prefix || _val); END IF; RETURN NEW; END $func$ LANGUAGE plpgsql; 触发器(为多个表重用相同的func): CREATE TRIGGER insup_bef BEFORE INSERT OR UPDATE ON tbl FOR EACH ROW EXECUTE PROCEDURE tbl_insup_bef('fieldName'); -- unquoted,case-sensitive column name 与更多解释和建议密切相关: > Assignment of a column with dynamic column name (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |