5

私の.NETコードは現在、ODP.NETを使用してストアドプロシージャを何度も呼び出し、多くのテーブルのさまざまな行を操作しています。.NET コードには、変更する行の配列があります。各呼び出しで変更されるパラメーターは 1 つだけです。配列を .NET から PL/SQL に渡して、複数の行を操作したいと考えています (行数が変更されます)。

以下を使用して、配列を .NET から PL/SQL に正常に渡しました。

type number_arr is table of number(10) index by pls_integer;
PROCEDURE "BLAH" (foo IN number_arr);

number_arr は VARRAY と呼ばれていると思いますが、それについては肯定的ではありません。誰かが私を修正したい場合は、(コメントとして)修正してください。ただし、これは私の混乱の原因になる可能性があります。

しかし、現在、PL/SQL には、次のような多くの更新ステートメントがあります。

UPDATE t SET a = b WHERE a = foo;

foo が配列でない場合。私は今書きたい:

UPDATE t SET a = b WHERE a IN (foo);

しかし、この構文は機能していないようです。また、VARRAY と 'IN' (または 'ANY' など) を組み合わせて使用​​する Oracle の例を見つけることができませんでした。SQL Server でこれを行う方法についていくつかの回答を見てきましたが、それを Oracle に変換する方法がわかりません。

もちろん、これを行うために .NET からストアド プロシージャに配列を取得する他の方法があれば、それも私の質問に答えます。私は IN で効率を上げようとしているので、PL/SQL で配列を反復処理する (UPDATE ステートメントを個別に呼び出す) ことはおそらく役に立たないでしょう。

4

1 に答える 1

8

使用している配列は連想配列であり、VARRAY ではありません。VARRAY と NESTED TABLE は SQL で使用できますが、連想配列は使用できません。ただし、そもそも PL/SQL でこれを実行しようとしているので、バルク バインドを使用できます (連想配列で機能します)。

PROCEDURE BLAH (foo IN number_arr) is
i number;
begin
   forall i in foo.first .. foo.last
   UPDATE t SET a = b WHERE a = foo(i);
end blah;

number_arr を連想配列ではなく VARRAY としてデータベースに作成した場合は、代わりに表関数を使用できます。

create type number_arr as varray(10) of number;

CREATE PROCEDURE BLAH (foo IN number_arr) is
begin
   UPDATE t SET a = b WHERE a in (select * from table(foo));
end blah;

この場合、タイプはパッケージではなくデータベースで定義する必要があることに注意してください。また、この方法は必ずしも を使用するよりも高速ではありませんforall

于 2011-07-15T20:04:56.153 に答える