【发布时间】:2020-12-27 14:55:23
【问题描述】:
我一直在尝试创建一个函数,该函数旨在为声明的变量赋值,并根据该值采取相应的行动。
我使用EXECUTE format(<SQL statement>) 将值分配给cnt。
CREATE OR REPLACE FUNCTION my_function() RETURNS TRIGGER AS $$
DECLARE
cnt bigint;
BEGIN
IF NEW.field1 = 'DECLINED' THEN
cnt := EXECUTE format('SELECT count(*) FROM table1 WHERE field2 = $1 AND field1 != $2 AND id != $3;') USING NEW.field2, NEW.field1, NEW.id INTO cnt;
IF cnt = 0 THEN
EXECUTE format('UPDATE table1 SET field1 = %1$s WHERE id = $2') USING 'DECLINED', NEW.field2;
END IF;
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER my_trigger BEFORE
UPDATE OF field1 ON table1 FOR EACH ROW WHEN (NEW.field1 = 'DECLINED') EXECUTE FUNCTION my_function();
但是,我收到以下错误:
ERROR: syntax error at or near "("
LINE 7: cnt := EXECUTE format('SELECT count(*) FROM...
不确定是否相关,但id 是文本列,field1 是 ENUM,field2 也是文本列。这可能是SELECT 语句中的问题吗?
有什么我可能会遗漏的想法吗?
【问题讨论】:
-
我错过了什么吗?我看不到有关这些陈述的任何动态。为什么你使用
EXECUTE而不是直接触发语句? -
@stickybit 如果
cnt等于0,我只想触发第二个EXECUTE语句。这就是我使用第一个EXECUTE的原因。还有其他方法吗? -
我在问你为什么使用
EXECUTE format(SELECT ...而不仅仅是SELECT ...... -
在这种情况下,如果没有
format(),我如何将变量传递给WHERE子句? -
随便写?
... WHERE field2 = new.field2 ...变量可以在语句中用于值(但不能用于标识符,那是你需要动态 SQL 而不是值的时候)。
标签: sql postgresql triggers plpgsql