4

まず第一に、はい、DO ステートメントのドキュメントを読みました:) http://www.postgresql.org/docs/9.1/static/sql-do.html

だから私の質問:

UPDATE ステートメントを含むコードの動的ブロックを実行し、影響を受けるすべての行の数を計算する必要があります。Ado.Netプロバイダーを使用しています。

Oracle では、ソリューションには 4 つのステップがあります。

  1. コマンドに入出力パラメータ「N」を追加
  2. BEGIN ... ENDを追加します。命じる
  3. 各ステートメントの後に:N := :N + sql%rowcountを追加します。
  4. 終わった!コマンドを実行した後、コマンドから N パラメータを読み取ることができます。

PostgreSQL でそれを行うにはどうすればよいですか? npgsql プロバイダーを使用していますが、役立つ場合は devard に移行できます。

4

2 に答える 2

9

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();
于 2012-04-16T13:32:49.490 に答える
1

私の解決策は非常に簡単です。Oracle では、変数を使用して更新された行の合計を計算する必要がありますcommand.ExecuteNonQuery()。これは、バッチ内の最後の UPDATE によって影響を受けた行の数のみが返されるためです。

ただし、npgsqlすべての UPDATE クエリによって更新されたすべての行の合計を返します。したがってcommand.ExecuteNonQuery()、変数を使用せずに呼び出して結果を取得するだけです。Oracle よりもはるかに簡単です。

于 2012-04-17T12:18:31.600 に答える