かきスタンプ

福岡でフリーランスの物流系のエンジニアやってます。

PL/SQL:update文の where条件に、 配列を使用する

以前、配列を 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から開始させる方法を見つけきれなかったので、苦肉の策として上記のようなコードを書きました。