我们必须使用 Load From cursor 来加载大量的大表。由于要指定列名,因此形成的查询是动态查询。我们在一个过程中使用下面的代码做同样的事情
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;
第一轮循环执行得很好。但是当涉及到第二个时,它会出现以下错误。
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
所有游标都是隐式游标(如果我错了请纠正我)。不清楚正在引用哪个游标以及究竟是什么问题。
这是因为Commit while using Cursor。
将WITH HOLD添加到游标定义解决了问题。