Oracle 在存储过程中只选择一次记录,并对所选记录进行操作

Oracle 在存储过程中只选择一次记录,并对所选记录进行操作,oracle,select,stored-procedures,code-duplication,Oracle,Select,Stored Procedures,Code Duplication,我两次选择同一组记录,一次返回REF_CURSOR,然后选择相同的记录来构建CSV,这样我就可以更新IN子句中的所有记录了。。。。我可以改变我的程序,只选择一次而不是两次选择相同的记录吗 PROCEDURE LOADBATCH( inBUCKET_SIZE IN NUMBER, OUTCURSOR OUT REF_CURSOR ) AS V_HANDLE VARCHAR2(2000); V_LOCK_RESULT INTEGER;

我两次选择同一组记录,一次返回REF_CURSOR,然后选择相同的记录来构建CSV,这样我就可以更新IN子句中的所有记录了。。。。我可以改变我的程序,只选择一次而不是两次选择相同的记录吗

      PROCEDURE LOADBATCH(
      inBUCKET_SIZE IN NUMBER,
      OUTCURSOR OUT REF_CURSOR )
  AS
    V_HANDLE      VARCHAR2(2000);
    V_LOCK_RESULT INTEGER;
    IDs           VARCHAR2(2000);
  BEGIN
    BEGIN
      V_HANDLE      := GET_LOCK_HANDLE('BATCH');              
      V_LOCK_RESULT := DBMS_LOCK.REQUEST(V_HANDLE, TIMEOUT => 1); 
      DBMS_OUTPUT.PUT_LINE(V_LOCK_RESULT);
      IF V_LOCK_RESULT <> 1 THEN
        OPEN OUTCURSOR FOR SELECT BATCH_ID,INSTRUCTION_ID,INSTRUCTION_DUMP,BATCH_MSG_TYPE,BATCH_AMOUNT,BATCH_CURRENCY,RECIEVED_DATETIME,MODIFIED_DATETIME,SETTLEMENT_DATE,BATCH_STATUS,FROM_MMBID,BATCH_DATE,MODIFICATION_DATETIME,PARENTBATCH_ID,INSTR_REASON FROM
        ( SELECT DISTINCT BI.*,
          BM.*,
          BM.AMOUNT          AS BATCH_AMOUNT,
          BM.CURRENCY        AS BATCH_CURRENCY,
          BI.PARENT_BATCH_ID AS PARENTBATCH_ID,
          BI.REASON          AS INSTR_REASON
        FROM ACT.BATCH_INSTRUCTIONS BI
        INNER JOIN ACT.BATCH_MESSAGES BM
        ON BI.BATCH_ID  =BM.ID
        WHERE (BI.STAGE = 'NEW'
        OR (BI.STAGE    = 'PICKED'
        AND (SYSDATE    > (BI.LAST_PICKED_AT + interval '65' second))))
        AND (BM.STAGE  <> 'COMPLETED')
        ORDER BY LAST_PICKED_AT ASC
        ) WHERE ROWNUM <=inBUCKET_SIZE ;
        
        SELECT listagg(INSTRUCTION_ID, ',') WITHIN GROUP (
        ORDER BY INSTRUCTION_ID) AS concatenation
        INTO IDs
        FROM
          (SELECT DISTINCT *
          FROM ACT.BATCH_INSTRUCTIONS BI
          INNER JOIN ACT.BATCH_MESSAGES BM
          ON BI.BATCH_ID  =BM.ID
          WHERE (BI.STAGE = 'NEW'
          OR (BI.STAGE    = 'PICKED'
          AND (SYSDATE    > (BI.LAST_PICKED_AT + interval '65' second)))
          )
          AND (BM.STAGE  <> 'COMPLETED')
          ORDER BY LAST_PICKED_AT ASC
          )
        WHERE ROWNUM <=inBUCKET_SIZE ;
        DBMS_OUTPUT.PUT_LINE('IDs are:');
        DBMS_OUTPUT.PUT_LINE(IDs);
        IF( IDs IS NOT NULL) THEN
          UPDATE ACT.BATCH_INSTRUCTIONS
          SET LAST_PICKED_AT    =sysdate,
            STAGE               = 'PICKED'
          WHERE INSTRUCTION_ID IN
            (SELECT INSTRUCTION_ID
            FROM ACT.BATCH_INSTRUCTIONS
            WHERE INSTRUCTION_ID IN
              (SELECT regexp_substr(IDs,'[^,]+', 1, level)
              FROM dual
                CONNECT BY regexp_substr(IDs, '[^,]+', 1, LEVEL) IS NOT NULL
              )
            );
          COMMIT;
        END IF;
      END IF;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
      NULL;
    END;
    --                        DBMS_OUTPUT.PUT_LINE('releasing lock:');
    V_LOCK_RESULT := DBMS_LOCK.RELEASE(V_HANDLE);
  END LOADBATCH;

无法使用一个select,因为select into不接受动态SQL或游标。

如何实现这种情况,然后请将您的表定义ddl和示例数据以文本形式发布-无图像,或者更好的是a,以及该数据的预期结果。另外,您希望的数据量是多少。目前还不确定,但是可以对ID进行批量收集,然后对查询和ref游标使用TABLE函数,而不是重复相同的子查询。