在PostgreSQL中计算批量查询受影响的行数

4
首先,是的,我已经阅读了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参数。
我该如何在PostgreSQL中实现它?我正在使用npgsql提供程序,但如果有帮助,可以迁移到devard。
2个回答

9

DO语句块适合执行动态SQL语句,但不适合返回值。需要使用plpgsql function来实现。

你需要的关键语句是:

GET DIAGNOSTICS integer_var = ROW_COUNT;

手册中的详细信息。

示例代码:

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

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

然而,npgsql返回所有UPDATE查询更新的所有行的总和。因此,我只需要调用command.ExecuteNonQuery()并获取结果,无需任何变量。比在Oracle中更容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接