Sql 执行更新始终设置为FALSE

Sql 执行更新始终设置为FALSE,sql,postgresql,triggers,plpgsql,insert-update,Sql,Postgresql,Triggers,Plpgsql,Insert Update,我写了下面的触发器 CREATE OR REPLACE FUNCTION tbl_scdr_insert_trigger() RETURNS TRIGGER AS $$ << fk >> DECLARE rowcount int; myrec RECORD; BEGIN EXECUTE 'UPDATE sc_'|| to_char(NEW.start_datetime, 'YYYY_MM') ||' SET a = a + ($1).a, b =

我写了下面的触发器

CREATE OR REPLACE FUNCTION tbl_scdr_insert_trigger() RETURNS TRIGGER AS $$
<< fk >>
DECLARE
    rowcount int;
    myrec RECORD;
BEGIN
    EXECUTE 'UPDATE sc_'|| to_char(NEW.start_datetime, 'YYYY_MM') ||' SET a = a + ($1).a, b = b + ($1).b WHERE (e_id = ($1).e_id AND start_datetime = ($1).start_datetime AND c_id = ($1).c_id'
    USING NEW;
    GET DIAGNOSTICS rowcount = ROW_COUNT;
    RAISE NOTICE 'found %', rowcount;
    IF not found THEN
        RAISE NOTICE 'not found';
    ELSIF found THEN
        RAISE NOTICE 'found';
        RETURN NULL;
    END IF;
END;
$$
LANGUAGE plpgsql;
CREATE或REPLACE函数tbl\u scdr\u insert\u trigger()将触发器返回为$$
>
声明
行计数int;
myrec记录;
开始
执行'UPDATE sc||to_char(NEW.start_datetime,'YYYY_MM')|设置a=a+($1).a,b=b+($1).b其中(e_id=($1).e_id和start_datetime=($1).start_datetime和c_id=($1).c_id'
采用新技术;
获取诊断行数=行数;
提出通知“找到%”,行数;
如果没有找到的话
提出“未找到”通知;
埃尔西夫找到了
提出“发现”通知;
返回NULL;
如果结束;
结束;
$$
语言plpgsql;
调用此函数时,始终将零作为行计数返回,因为语句尚未提交,并且即使存在具有相同where子句列值的记录,FOND也始终为False。

如下所示:

执行更改GET DIAGNOSTICS的输出,但未找到更改


这意味着在您的情况下,find将始终为FALSE,因为您使用的是EXECUTE而不是static UPDATE语句。

我已经阅读了此文档,没有关于EXECUTE UPDATE的明确语句,但为什么rowcount始终为零。因为触发器在单个事务上工作,无法提交它。在该ca中,事务并不重要您应该在执行查询后立即进行正确的诊断。您是否可以将整个查询字符串分配给一个变量,然后将其作为通知发出,然后在控制台中执行该更新,并查看它是否实际更新了某些内容?