以前、配列を where句における in の条件式として使用するというエントリを書きましたが、update文にて、この書き方をすると、ORA-00902: データ型が無効です。
というエラーが発生します。
ですので、update文の where 条件にて、配列を引数に取るには、forall を使ってバルク処理をする事になります。
<記述例>
type TYPE_NUM_LIST is table of number index by binary_integer;
PROCEDURE MY_PROCEDURE_02_1 ( IN_NUM_LIST_PARAM_1 IN TYPE_NUM_LIST ,OUT_RETURN_CODE OUT NUMBER ) IS -- 【※重要※】 .NETの配列を引数に渡したとき、インデックスは1から開始する headerIndex number := 1; BEGIN --登録データがなかった場合、-1を返して終了する IF (IN_NUM_LIST_PARAM_1.COUNT <= 0) THEN OUT_RETURN_CODE := -1; RETURN; END IF; --トランザクション開始 SET TRANSACTION NAME 'TRANSACTION_MY_PROCEDURE_02_1'; --更新(まとめてupdate) forall i in headerIndex..IN_NUM_LIST_PARAM_1.count update TABLE1 set COLUMN2 = 9 ,COLUMN3 = 'Param1' where 1=1 and ID = IN_NUM_LIST_PARAM_1(i) ; COMMIT; EXCEPTION WHEN OTHERS THEN OUT_RETURN_CODE := -1; ROLLBACK; END MY_PROCEDURE_02_1;
上記では、配列のインデックスを 1 から開始しています。
ODP.NET Managed Driver を使用し、.NET から Oracle に引数を渡して実行していますが、その時、配列のインデックスが 1 から開始するという、謎の挙動に頭を悩ませたからです。
インデックスを 0から開始させる方法を見つけきれなかったので、苦肉の策として上記のようなコードを書きました。