我用方法一写了一个储存过程 就是用reorg命令CREATE OR REPLACE PROCEDURE CRB_TEST2()LANGUAGE SQLBEGIN declare sqlcode integer default 0; -- de...
显示全部我用方法一写了一个储存过程 就是用reorg命令
CREATE OR REPLACE PROCEDURE CRB_TEST2
()
LANGUAGE SQL
BEGIN
declare sqlcode integer default 0; --
declare v_notfound integer default 0; --
declare v_tname varchar(50);--
declare v_delete_col varchar(30); --
declare v_delete_rows integer;--
declare v_delete_log varchar(100);--
declare v_delete_period integer;--
declare sqlStr varchar(300);--
declare condition1 varchar(100);--
declare n_is_partition integer;--
declare fetchSeqCursor cursor with hold for
select tname,delete_col,delete_period,IS_PARTITION from tsy_delete_manage where tname='TDF_RECEIVED_FILE' order by tname;--
declare CONTINUE handler for NOT FOUND set v_notfound = 100; --
set v_notfound = 0;--
open fetchSeqCursor;--
fetch fetchSeqCursor into v_tname, v_delete_col,v_delete_period,n_is_partition;--
WHILE v_notfound=0 DO
set sqlStr='delete '||v_tname||'_'||to_char(current_date-90 days,'mm')||to_char(current_date-90 days,'dd');--
execute immediate sqlstr ;--
set sqlstr='reorg table '||v_tname||'_'||to_char(current_date-90 days,'mm')||to_char(current_date-90 days,'dd');--
call SYSPROC.ADMIN_CMD(sqlstr);--
set v_notfound = 0;--
fetch fetchSeqCursor into v_tname, v_delete_col,v_delete_period,n_is_partition;--
end WHILE;--
close fetchSeqCursor;--
END
call crb_test2
SQL0501N FETCH 语句或 CLOSE
语句中指定的游标尚未打开,或者游标标量函数引用中的游标变量尚未打开。
SQLSTATE=24501
SQL0501N FETCH 语句或 CLOSE 语句中指定的游标尚未打开,或者游标标量函数引用中的游标变量尚未打开。
说明:
程序试图执行下列其中一项操作:
* 当指定的游标未打开时,试图使用该游标进行访存(FETCH)。
* 当指定的游标未打开时,试图关闭(CLOSE)该游标。
* 在 OPEN 语句中引用游标变量,但该游标变量尚未打开。
* 引用游标标量函数(例如 CURSOR_ROWCOUNT 函数),但该游标变量尚未打开。
无法处理该语句。
用户响应:
检查先前的消息 (SQLCODE),它可能关闭了游标。注意,在关闭游标后,任何访
存或关闭游标语句都接收到 SQLCODE -501。
如果未发出任何先前的 SQLCODE,那么更正应用程序,确保游标在执行 FETCH 或
CLOSE 语句时是打开的。
如果在游标标量函数中引用游标变量,那么请验证该游标是否不为空、已定义并
且已打开,否则将该游标变量替换为处于该状态的游标变量。
sqlcode:-501
sqlstate:24501
抱了这个错,如果把reorg这一段去掉,储存过程是可以执行的,真是奇怪了?
收起