web-dev-qa-db-ja.com

カーソルからのDB2動的ロード

Load Fromカーソルを使用して、多数の巨大なテーブルをロードする必要があります。同じように形成されたクエリは、列名が指定されるため、動的クエリです。手順で以下のコードを使用して同じことを行います

For Mcnt As Mcur Cursor For 
  Select Di_tablename From file_mapping  Order By Id      
  Do


   For Mcnt1 As Mcur1 Cursor For Select Column_name  From Sysibm.Columns  Where Table_name=di_tablename 
   Do
       Set v_colquery = v_colquery || Column_name || ',' ;   
   End For;           

   Set v_colquery = Substr(v_colquery, 1, Length(v_colquery)-1);

 set v_sql ='LOAD FROM (SELECT '|| v_colquery || ' FROM ' || Di_tablename  || ' ) OF CURSOR INSERT INTO ' || Di_tablename || '_LOG  ( ' || v_colquery || ') NONRECOVERABLE';
call admin_cmd(v_sql);   
commit;

 END for;

ループの最初のラウンドは問題なく実行されます。しかし、2番目になると、以下のエラーが発生します。

The cursor specified in a FETCH statement or CLOSE statement is not open or a cursor variable in a cursor scalar function reference is not open.. SQLCODE=-501, SQLSTATE=24501, DRIVER=4.18.60

すべてのカーソルは暗黙的なカーソルです(間違っている場合は修正してください)。参照されているカーソルと正確には何が問題なのか不明。

3
rrrohanb

これは、CommitCursorを使用しているためです。

WITH HOLDをカーソル定義に追加すると、問題が解決しました。

1
rrrohanb