Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL-返回用于更新抛出的游标;取出顺序错误“;_Oracle_Select_Stored Procedures_Plsql_Cursor - Fatal编程技术网

Oracle PL/SQL-返回用于更新抛出的游标;取出顺序错误“;

Oracle PL/SQL-返回用于更新抛出的游标;取出顺序错误“;,oracle,select,stored-procedures,plsql,cursor,Oracle,Select,Stored Procedures,Plsql,Cursor,我有以下SP,但我想在使用该SP更新记录后将光标作为OUT参数。结果,抛出一个ORA-01002:fetch-out-sequence。自动提交在默认情况下是关闭的,所以这显然没有问题 create or replace PROCEDURE MY_PROC( my_cursor OUT SYS_REFCURSOR ) AS myId my_table.id%type; BEGIN OPEN my_cursor FOR SELECT id FROM my_

我有以下SP,但我想在使用该SP更新记录后将光标作为OUT参数。结果,抛出一个ORA-01002:fetch-out-sequence。自动提交在默认情况下是关闭的,所以这显然没有问题

create or replace
PROCEDURE MY_PROC( 
    my_cursor OUT SYS_REFCURSOR
) AS 
    myId my_table.id%type;
BEGIN
    OPEN my_cursor FOR 
      SELECT id FROM my_table
      FOR UPDATE SKIP LOCKED;
    LOOP 
        FETCH my_cursor INTO myId;
        EXIT WHEN my_cursor%NOTFOUND;
        UPDATE my_table SET lastSelected = SYSTIMESTAMP
        WHERE id = myId;
    END LOOP;
END MY_PROC;
我在这件事上花了太多的时间,但没有成功,所以我认为这件事不能用这种方式解决。如果你给我一个暗示,我会很高兴的


提前谢谢你,Gergely除了你的问题的实际答案(出于对Ed Gibbs的礼貌,我在此不再重复)之外,我认为你的SP需要修改

打开光标检索表中的每个ID时,对于找到的每个记录,更新所有表:

UPDATE my_table SET lastSelected = SYSTIMESTAMP;
你想做的可能是:

UPDATE my_table SET lastSelected = SYSTIMESTAMP WHERE id = myId;
希望有帮助。
S.

光标只能在行中向前移动。您的过程正在读取所有光标行,因此当您返回它时,它处于EOF。由于光标仅向前移动,因此无法将其设置回BOF。如果您确信将得到相同的结果集,那么可以在循环/更新之后尝试重新执行游标查询。或者,您可以根据
lastSelected
时间戳值查询返回光标。还请注意,您可能需要定义两个游标—一个用于循环/更新,另一个用于返回值。为什么不在进程内创建另一个游标来遍历和更新数据,然后在更新后打开游标。当然,如果你不想在更新数据之前得到数据的快照,这就可以了?伙计们,回答得很好,非常感谢。这是我假设的:EOF,但我没有找到证明来源。你为什么不正常地回答。。。那我就可以接受了再次感谢你,你救了我谢谢你的留言。是我的错。我也使用了“WHERE”-子句,只是忘了在这里复制。(刚刚更新)