调用下面存储过程 出现 读取顺序错误的 提示,
大家帮忙看下 谢谢~~!PROCEDURE RetrieveNonblockingInstanceIds
(
p_OWNER_ID IN INSTANCE_STATE.OWNER_ID%TYPE := NULL
,p_OWNED_UNTIL IN INSTANCE_STATE.OWNED_UNTIL%TYPE := NULL
,p_NOW IN DATE
,p_WORKFLOW_IDS OUT RefCursor
)
AS
BEGIN
OPEN p_WORKFLOW_IDS FOR
SELECT
INSTANCE_ID
FROM
INSTANCE_STATE
WHERE
BLOCKED = 0
AND STATUS NOT IN (c_STATUS_COMPLETED, c_STATUS_SUSPENDED, c_STATUS_TERMINATED)
AND (OWNER_ID IS NULL OR OWNED_UNTIL < p_NOW)
FOR UPDATE; IF NVL(SQL%ROWCOUNT, 0) > 0
THEN
UPDATE INSTANCE_STATE
SET
OWNER_ID = p_OWNER_ID
,OWNED_UNTIL = p_OWNED_UNTIL
WHERE
BLOCKED = 0
AND STATUS NOT IN (c_STATUS_COMPLETED, c_STATUS_SUSPENDED, c_STATUS_TERMINATED)
AND (OWNER_ID IS NULL OR OWNED_UNTIL < p_NOW);
END IF;
END;

解决方案 »

  1.   

    弱弱的提个疑问:
    假如for update这里锁了3条,在if的时候,有别的会话插了一条刚好满足条件,则下面的更新会不会有4条啊。
      

  2.   

    open for自动打开,自动关闭,你的SQL%ROWCOUNT,没意义。cursor c_cursorname is
       select ………
    begin
       open c_cursorname;
       ………end;
      

  3.   

    Cause In a host language program, a FETCH call was issued out of sequence. A successful parse-and-execute call must be issued before a fetch. This can occur if an attempt was made to FETCH from an active set after all records have been fetched. This may be caused by fetching from a SELECT FOR UPDATE cursor after a commit. A PL/SQL cursor loop implicitly does fetches and may also cause this error.  
    Action:Parse and execute a SQL statement before attempting to fetch the data.  
      

  4.   

    SQL%ROWCOUNT不能这样使用 因为它里面的内容是不会执行的
      

  5.   

    exit when p_WORKFLOW_IDS%notfound