2009-08-27 8 views
0

ユーザー入力に基づいてレコードのセットを挿入する必要があるテーブルがあります。 IE:選択する項目のリストから選択します。この例では、intのコレクションだとしましょう。.NETからPL/SQLパッケージプロシージャまたはファンクションにデータのコレクションを渡しますか?

インターネット上ではよくない例がたくさんあります。 There's only one related question here on SOですが、答えもありません(両方の回答がデッドエンドです)。

  1. .NETからのパッケージへの呼び出しをどのように設定しますか?
  2. コレクションを受け取るためにパッケージプロシージャまたはファンクションを設定するにはどうすればよいですか?
  3. プロシージャまたはファンクションの内部でコレクションを一度処理する方法はありますか?

答えて

1

私がOracleから.NETで作業しなければならなかった最後のことは、Pro .NETのOracleプログラミングであるMark A. Williamsにかなり慣れていました。それは4年以上経っていますが、私はそれがよく書かれ、非常に有用であることがわかりました。

0

私は.NETの観点から話すことはできませんが、私はJavaコードで同様の問題を抱えています。おそらく、この解決策はいくつかの使用になります...

要素のコレクションを格納できるデータベースに新しいTYPEを作成することから始めます。

CREATE TYPE my_array_type IS TABLE OF NUMBER 
    INDEX BY BINARY_INTEGER; 

あなたはその後、タイプMY_ARRAY_TYPEのパラメータを受け入れることができるプロシージャを作成します:私は、一般的にTABLEタイプを使用

CREATE PROCEDURE process_array(my_array MY_ARRAY_TYPE) IS 
    i BINARY_INTEGER; 
    my_array_element NUMBER; 
BEGIN 
    i := my_array.FIRST; 
    WHILE my_array.EXISTS(i) LOOP 
    my_array_element := my_array(i); 
    /* do something with my_array_element... */ 
    i := my_array.NEXT(i); 
    END LOOP; 
END; 

次のトリックを動的にあなたの中で無名PL/SQLブロックを構築することですプログラミング言語を選択して(私はVB.NETやC#を想定しています)、実行してください。私は.NETに多くを話すが、ここでは、Javaの例であることはできません。

int[] myArray = ...; 

StringBuilder plsql = new StringBuilder(); 
plsql.append("DECLARE"); 
plsql.append(" my_array MY_ARRAY_TYPE;"); 
plsql.append("BEGIN"); 
for (int i = 0; i < myArray.length; i++) { 
    plsql.append(" my_array(" + i + ") := ?;"); 
} 
plsql.append(" PROCESS_ARRAY(my_array);"); 
plsql.append("END"); 

CallableStatement statement = connection.prepareCall(plsql.toString()); 
for (int i = 0; i < myArray.length; i++) { 
    statement.setInt(i + 1, myArray[i]); 
} 

statement.execute(); 

特にジャワ/ JDBCの世界でどこ唯一、私はより良い方法がある知っているが、これは最も信頼性の高いように見えましたOracleのJDBCドライバ(!)のすべてのサブセットがコレクション型をサポートしています。

+0

ユーザー入力を連結しますか?それはどこで行うのですか?唯一の連結は 'i'変数です。ユーザの入力は、文パラメータを介して割り当てられます。 –

+0

@アダム:あなたは正しいですアダム、私はバインドが見えませんでしたか? " –

1

odp.netのOracle technet how toセクションを参照してください。配列をバインドする例があります。しかし、その手順はn回と呼ばれます。 plsqlプロシージャのパラメータはプレーン型(valuetype)です。

array at onceを渡す別の例があります。 plsqlプロシージャのパラメータはplsql表です。処理コレクション(= plsqlテーブル)はherと記述されています。それはあなたの問題にもっと適しているかもしれません。

関連する問題