计算PostgreSQL中受批处理查询影响的行数

时间:2012-04-16 13:27:54

标签: postgresql plpgsql dynamic-sql

首先,是的,我已经阅读了DO声明的文档:) http://www.postgresql.org/docs/9.1/static/sql-do.html

所以我的问题:

我需要执行一些包含UPDATE语句的动态代码块,并计算所有受影响行的数量。我正在使用Ado.Net提供商。

在Oracle中,解决方案将包含4个步骤:

  1. 将InputOutput参数“N”添加到命令
  2. BEGIN ... END; 添加到命令
  3. 在每个语句后添加:N:=:N + sql%rowcount
  4. 完成了!我们可以在执行后从命令中读取N参数。
  5. 如何使用PostgreSQL做到这一点?我正在使用npgsql提供程序,但如果有帮助,可以迁移到devard。

2 个答案:

答案 0 :(得分:7)

DO语句块可以很好地执行动态SQL。回报价值并不好。请使用plpgsql function

您需要的关键声明是:

GET DIAGNOSTICS integer_var = ROW_COUNT;

Details in the manual.

示例代码:

CREATE OR REPLACE FUNCTION f_upd_some()
  RETURNS integer AS
$func$
DECLARE
   ct int;
   i  int;
BEGIN
   EXECUTE 'UPDATE tbl1 ...';       -- something dynamic here
   GET DIAGNOSTICS ct = ROW_COUNT;  -- initialize with 1st count

   UPDATE tbl2 ...;                 -- nothing dynamic here 
   GET DIAGNOSTICS i = ROW_COUNT;
   ct := ct + i;                    -- add up

   RETURN ct;
END
$func$  LANGUAGE plpgsql;

呼叫:

SELECT * FROM f_upd_some();

答案 1 :(得分:1)

我的解决方案非常简单。在Oracle中,我需要使用变量来计算更新行的总和,因为command.ExecuteNonQuery()仅返回批处理中上一个UPDATE影响的行数。

但是,npgsql返回所有UPDATE查询更新的所有行的总和。所以我只需要调用command.ExecuteNonQuery()并获得没有任何变量的结果。比使用Oracle容易得多。