【发布时间】:2021-11-26 19:02:09
【问题描述】:
当我执行下面的代码时,我得到了ORA-01001: invalid cursor 和ORA-06512 错误。情况并非总是如此。我以为我通过引用将光标传递给MY_READ 过程并可以在那里关闭它。但是当我突然开始遇到上面的错误时,我得出结论,也许我没有传递引用而是光标的副本。我对吗? MY_READ函数中是否可以读取关闭光标?
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PROCEDURE REP_HELPER1 (myIdx IN BINARY_INTEGER, from_d IN DATE, rep_table IN OUT rep_table_T) IS
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
myCUR1 SYS_REFCURSOR;
BEGIN
OPEN myCUR1 FOR SELECT myField1,
myField2,
myField3,
myField4,
myField5,
myField6,
myField7,
myField8,
myField9,
myField10,
myField11,
myField12,
myField13,
myField14,
myField15,
myField16,
myField17,
myField18,
myField19,
myField20,
myField21,
myField22,
myField23,
myField24,
myField25,
myField26,
myField27,
myField28,
myField29,
myField30,
myField31
FROM myTable;
MY_READ(myIdx , myCUR1, rep_table)
END REP_HELPER1;
--Am I passing here a copy of a cursor and not a reference?
PROCEDURE MY_READ(myIdx IN BINARY_INTEGER, cur IN SYS_REFCURSOR, rep_table IN OUT rep_table_T) IS
BEGIN
FETCH cur INTO rep_table(myIdx).day1, rep_table(myIdx).day2, rep_table(myIdx).day3, rep_table(myIdx).day4, rep_table(myIdx).day5,
rep_table(myIdx).day6, rep_table(myIdx).day7, rep_table(myIdx).day8, rep_table(myIdx).day9, rep_table(myIdx).day10,
rep_table(myIdx).day11, rep_table(myIdx).day12, rep_table(myIdx).day13, rep_table(myIdx).day14, rep_table(myIdx).day15,
rep_table(myIdx).day16, rep_table(myIdx).day17, rep_table(myIdx).day18, rep_table(myIdx).day19, rep_table(myIdx).day20,
rep_table(myIdx).day21, rep_table(myIdx).day22, rep_table(myIdx).day23, rep_table(myIdx).day24, rep_table(myIdx).day25,
rep_table(myIdx).day26, rep_table(myIdx).day27, rep_table(myIdx).day28, rep_table(myIdx).day29, rep_table(myIdx).day30,
rep_table(myIdx).day31;
IF cur%NOTFOUND THEN -- here comes ORA-06512 in a stack
dbms_output.put_line('ERROR' || nIndex);
END IF;
CLOSE cur;
END MY_READ;
当我在 REP_HELPER1 中执行 FETCH 并关闭时,我没有收到错误消息。
【问题讨论】:
-
您确定,您的光标总是恰好返回一条记录吗?你从哪里得到
ORA-01001? -
@WernfriedDomscheit 无论如何,FETCH 只会返回一条记录?
-
也许见stackoverflow.com/questions/11341166/… 反正你的整体设计对我来说有点奇怪,你可以回顾一下。
-
游标已经在将被访问的最高级别初始化为非空。它不能解决问题。
-
你能把你的代码变成一个小的、可重现的例子吗?很难根据代码片段进行调查。
标签: oracle plsql database-cursor