gpt4 book ai didi

postgresql - 我可以在 PostgreSQL 触发器函数中迭代 NEW 吗?

转载 作者:行者123 更新时间:2023-11-29 12:20:19 25 4
gpt4 key购买 nike

我编写了一个触发器函数,希望遍历 NEW 并检查它的所有值。

CREATE OR REPLACE FUNCTION fix_nulls() RETURNS TRIGGER AS $_$
BEGIN
FOR val IN NEW
LOOP
IF val = '{x:Null}'
val := '';
ENDIF;
ENDLOOP;
RETURN NEW;
END $_$ LANGUAGE 'plpgsql';

CREATE TRIGGER prevent_nulls_siteinfo
BEFORE UPDATE OR INSERT ON siteinfo
FOR EACH ROW
EXECUTE PROCEDURE fix_nulls();

但是我得到一个语法错误:

ERROR:  syntax error at or near "NEW"
LINE 3: FOR val IN NEW
^

是否可以遍历 NEW 中的所有值?我可以轻松地编写一堆 if 语句来检查每一列,但我更希望这个函数是通用的,这样我将来可以将它用于其他表。

最佳答案

简单案例的静态代码

对于一些给定的专栏,我会拼写出来。

CREATE OR REPLACE FUNCTION fix_nulls()
RETURNS TRIGGER AS
$func$
BEGIN
IF NEW.val1 = '{x:Null}' THEN NEW.val1 := ''; END IF;
IF NEW.val2 = '{x:Null}' THEN NEW.val2 := ''; END IF;
IF NEW.va31 = '{x:Null}' THEN NEW.val3 := ''; END IF;

RETURN NEW;
END
$func$ LANGUAGE plpgsql;
  • 不要引用语言名称plpgsql,它是一个标识符。

并且只在相关时触发触发器:

CREATE TRIGGER prevent_nulls_siteinfo
BEFORE UPDATE OR INSERT ON siteinfo
FOR EACH ROW
<b>WHEN ('{x:Null}' IN (NEW.val1, NEW.val2, NEW.val3))</b>
EXECUTE PROCEDURE fix_nulls();

动态代码

如果有许多 列或(更好的理由)列(名称)更改很多,则可能需要动态方法。然而,虽然 plpgsql FOR 循环可以遍历集合(表)中的或数组中的元素,但它可以 对一行中的列执行相同操作。
为什么?

关于postgresql - 我可以在 PostgreSQL 触发器函数中迭代 NEW 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29546319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com