[英]How to get value of $1 parameter from executed prepared statement (inside a trigger using a current_query())
[英]Execute dynamic prepared statement inside a trigger
我想将触发器用于记录目的-每次用户插入内容或进行更新时, history
表中都会出现一个新行。 我已经有一个触发器,效果很好。 现在,每次插入时它都会运行。 它是这样的:
CREATE OR REPLACE FUNCTION public.trigger_history_insert()
RETURNS trigger AS
$BODY$
DECLARE
...
BEGIN
... it does a lot of things here and works absolutely correctly
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.trigger_history_insert()
OWNER TO postgres;
现在,我想在此触发器中添加日志记录。 我尝试遵循这两个官方教程( [1] , [2] ),但是以失败告终。 这是我的第一次尝试:
DECLARE
...
BEGIN
... everything remains unchanged except this part
EXEC SQL BEGIN DECLARE SECTION;
const char *stmt = 'INSERT INTO history (field1) VALUES (?)';
EXEC SQL END DECLARE SECTION;
EXEC SQL PREPARE mystmt FROM :stmt;
EXEC SQL EXECUTE mystmt USING new.field1;
END;
在这种情况下,我得到语法错误指向以下代码行:
EXEC SQL BEGIN DECLARE SECTION;
^
这是我的第二次尝试:
BEGIN
... everything remains unchanged except this part
BEGIN DECLARE SECTION;
const char *stmt = 'INSERT INTO history (field1) VALUES (?)';
END DECLARE SECTION;
PREPARE mystmt FROM :stmt;
EXECUTE mystmt USING new.field1;
END;
现在,我收到一条错误消息,指向此行:
BEGIN DECLARE SECTION;
^
这是我的第三次尝试:
$BODY$
DECLARE
...
const char *stmt = 'INSERT INTO history (field1) VALUES (?)'
BEGIN
...
PREPARE mystmt FROM :stmt;
EXECUTE mystmt USING new.field1;
END
现在,我收到一条错误消息,指向此行:
const char *stmt = 'INSERT INTO history ...
^
这是我最后的尝试:
$BODY$
DECLARE
...
stmt text := 'INSERT INTO history (field1) VALUES (?)'
BEGIN
...
PREPARE mystmt FROM :stmt;
EXECUTE mystmt USING new.field1;
END
在最后一种情况下,错误消息指向以下行:
PREPARE mystmt FROM :stmt;
^
那么,我在做什么错,我该如何解决?
您正在将PL / pgSQL (一种用于在数据库中编写函数的语言)和ecpg (一种用于将数据库访问嵌入到C客户端代码中)混合在一起。
正确的解决方案如下所示:
INSERT INTO history (field1) VALUES (NEW.field1);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.