对于DO语句首先,是我读过的文档:) http://www.postgresql.org/docs/9.1/static/sql-do.html
所以我的问题:
我需要执行一些代码动态块包含UPDATE语句,并计算所有受影响的行数。 我使用Ado.Net
提供商。
在Oracle的解决方案将有4个步骤:
- 添加的inputOutput参数“N”到命令
- 添加BEGIN ... END; 命令
- 添加:N:=:N + SQL%的行数的每个语句之后。
- 完成! 我们可以读取命令N参数,后执行它。
我怎样才能在PostgreSQL做呢? 我使用的是供应商Npgsql的,但可以迁移到devard是否有帮助。
DO
语句块是好的执行动态SQL。 他们没有很好的返回值。 使用PLPGSQL 功能为。
你需要的关键语句是:
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();
我的解决方法很简单。 在Oracle我需要使用变量来计算更新的行的总和,因为command.ExecuteNonQuery()
返回只受该批次中的最后一次更新的行数。
然而, npgsql
返回所有UPDATE查询更新所有行的总和。 所以我只需要调用command.ExecuteNonQuery()
和得到的结果没有任何变数。 远远高于与Oracle容易。