PostgreSQL使用RAISE NOTICE记录UPDATE结果报语法错误如何解决?
语法错误原因
你使用的is_updated := UPDATE ...赋值写法不符合PL/pgSQL语法规范:UPDATE语句不会直接返回受影响行数作为可直接赋值的结果,因此SQL解析器处理到UPDATE语句内schema名前的.符号时无法识别语法结构,抛出了42601语法错误。
实现更新结果记录的方案
推荐两种常用的稳定实现方式:
方式1:通过GET DIAGNOSTICS获取影响行数
这是适配所有DML操作的通用写法,直接读取系统诊断信息里的行数统计结果:
do $BODY$ DECLARE is_updated int; BEGIN UPDATE my_schema.my_table SET support_email = 'support@gmail.com' WHERE id = '9e7080d9-97d9-4d8b-90c5-c02bf5f04ecd'; -- 读取最近一次DML操作影响的行数 GET DIAGNOSTICS is_updated = ROW_COUNT; IF is_updated > 0 THEN RAISE NOTICE 'Row got updated'; ELSE RAISE NOTICE 'No Row is updated'; END IF; END $BODY$;
方式2:通过RETURNING结合内置变量判断
如果只需要判断是否有行被更新,可以用更简洁的内置FOUND变量实现:
do $BODY$ DECLARE tmp int; BEGIN SELECT 1 INTO tmp FROM UPDATE my_schema.my_table SET support_email = 'support@gmail.com' WHERE id = '9e7080d9-97d9-4d8b-90c5-c02bf5f04ecd' RETURNING 1; -- FOUND是PL/pgSQL内置变量,自动标记上一次查询是否返回了结果 IF FOUND THEN RAISE NOTICE 'Row got updated'; ELSE RAISE NOTICE 'No Row is updated'; END IF; END $BODY$;
内容的提问来源于stack exchange,提问作者Sujeet
相关产品推荐
相关产品推荐

