PostgreSQL中SQL%ROWCOUNT无法获取受影响行数问题求助
问题原因及解决方法
问题根源
你写的SQL%ROWCOUNT是Oracle PL/SQL的专属语法,PostgreSQL的PL/pgSQL并不支持这个变量,这就是报错的直接原因。
两种修正方案
方案1:使用GET DIAGNOSTICS获取受影响行数
这是PostgreSQL中获取DML语句受影响行数的标准方式:
CREATE OR REPLACE FUNCTION func_0025() RETURNS integer AS $$ DECLARE r integer := 0; BEGIN INSERT INTO t(a,b,c) VALUES (8,8,8); GET DIAGNOSTICS r = ROW_COUNT; -- 替换原有的SQL%ROWCOUNT写法 RETURN r; END; $$ LANGUAGE plpgsql; SELECT func_0025();
方案2:结合INSERT ... RETURNING简化实现
如果仅需要返回插入的行数,也可以用更简洁的方式实现:
CREATE OR REPLACE FUNCTION func_0025() RETURNS integer AS $$ DECLARE r integer := 0; BEGIN WITH inserted AS ( INSERT INTO t(a,b,c) VALUES (8,8,8) RETURNING 1 ) SELECT COUNT(*) INTO r FROM inserted; RETURN r; END; $$ LANGUAGE plpgsql; SELECT func_0025();
补充说明
PostgreSQL的PL/pgSQL中还有FOUND布尔变量,可用于判断是否有行被影响,但它只能返回true/false,无法获取具体行数。如果需要精确的受影响行数,必须使用GET DIAGNOSTICS r = ROW_COUNT语法。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

