9

ODP.Net は、連想配列を params として C# から Oracle ストアド プロシージャに渡す機能を公開します。その連想配列に含まれるデータをSQLクエリで使用しようとしない限り、これは素晴らしい機能です。

その理由は、コンテキスト スイッチが必要だからです。SQL ステートメントには SQL 型が必要であり、このように PL/SQL に渡される連想配列は実際には PL/SQL 型として定義されます。PL/SQL パッケージ/プロシージャ/関数内で定義された型はすべて PL/SQL 型であり、これらのオブジェクトの外部で作成された型は SQL 型であると考えています (それについてより明確にすることができる場合は、そうしてください。ただし、これは目的ではありません)。質問)。

したがって、問題は、PL/SQL 連想配列パラメーターを、プロシージャー内で次のような SQL ステートメントで使用できるものに変換するために使用する方法は何ですか?

OPEN refCursor FOR
SELECT T.*
FROM   SOME_TABLE T,
       ( SELECT COLUMN_VALUE V
         FROM   TABLE( associativeArray )
       ) T2
WHERE  T.NAME = T2.V;

この例では、「associativeArray」は、PLS_INTEGER によってインデックス付けされた varchar2(200) の単純なテーブルです。C# では、associativeArry パラメータに string[] が入力されます。

連想配列を使用する以外に、これを行う他の方法について自由に議論してください。それでも、私は他のオプションを見ることに興味があります。

4

2 に答える 2

12

次のようなデータベースタイプを作成します。

create type v2t as table of varchar2(30);
/

そして、手順では:

FOR i IN 1..associativeArray.COUNT LOOP
    databaseArray.extend(1);
    databaseArray(i) := associativeArray(i);
END LOOP;

OPEN refCursor FOR
SELECT T.*
FROM   SOME_TABLE T,
       ( SELECT COLUMN_VALUE V
         FROM   TABLE( databaseArray )
       ) T2
WHERE  T.NAME = T2.V;

(databaseArrayはv2t型であると宣言されています。)

于 2009-11-11T16:10:12.120 に答える