CREATE OR REPLACE PACKAGE BODY PNPC_DMS_PKG is
  PROCEDURE PNPC_SP_INSERT_CUST (pCT_CODE    SIMS_CUST.CT_CODE%TYPE)
  AS
    CNT         INTEGER DEFAULT 0;
    CURSOR      C_TMP IS SELECT * FROM PNPC_SALES WHERE WS_CODE = pCT_CODE ORDER BY SEQ;
  BEGIN INSERT INTO PNPC_SALES VALUES ('TEST');
        COMMIT();    FOR C IN C_TMP LOOP
       DBMS_OUTPUT.PUT_LINE('执行游标循环');
    END LOOP
  EXCEPTION WHEN OTHERS THEN NULL;
    INSERT INTO PNPC_LOG VALUES ( '['||TO_CHAR(SYSDATE,'YYYY-MM-DD HH:MI:SS')||']PNPC_SP_INSERT_CUST==>EXCEPTION  '||pCT_CODE||', '||pCT_NAME||', '||pCT_ADDRESS );
  END PNPC_SP_INSERT_CUST; 
  
大致代码如上,PNPC_SALES表中没有数据,为什么我执行exec PNPC_SP_INSERT_CUST('TEST')后,
DBMS_OUTPUT.PUT_LINE('执行游标循环')还能打出来我有点不明白是否FOR...IN...LOOP是否在执行的时候会在去调用一次
语句来查下,而不是使用先前的结果集来遍历

解决方案 »

  1.   

    CREATE OR REPLACE PACKAGE BODY PNPC_DMS_PKG is
      PROCEDURE PNPC_SP_INSERT_CUST (pCT_CODE    SIMS_CUST.CT_CODE%TYPE)
      AS
        CNT        INTEGER DEFAULT 0;
        CURSOR      C_TMP IS SELECT * FROM PNPC_SALES WHERE WS_CODE = pCT_CODE ORDER BY SEQ;
      BEGININSERT INTO PNPC_SALES VALUES ('TEST');
            COMMIT();    FOR C IN C_TMP LOOP
          DBMS_OUTPUT.PUT_LINE('执行游标循环');
        END LOOP
      EXCEPTION WHEN OTHERS THEN NULL;
        INSERT INTO PNPC_LOG VALUES ( '['||TO_CHAR(SYSDATE,'YYYY-MM-DD HH:MI:SS')||']PNPC_SP_INSERT_CUST==>EXCEPTION  '||pCT_CODE||', '||pCT_NAME||', '||pCT_ADDRESS );
      END PNPC_SP_INSERT_CUST; 楼主在procedure 中插入TEST数据了,所以使用C_TMP游标的时候当然能查询到数据FOR...IN...LOOP游标不会重新打开
      

  2.   


    对,我就是想测试FOR..IN..LOOP才插数据的,那么是不是说在使用FOR...IN...LOOP的时候会重新使用一次
    SELECT * FROM PNPC_SALES WHERE WS_CODE = pCT_CODE ORDER BY SEQ来查询一次库,而不是说代码顺序执行,C_TMP第一次进来查不到数据结果集是空的然后我又插了一次数据库,FOR C IN C_TMP LOOP使用的是最新的结果集
    是这样吗
      

  3.   

    CURSOR      C_TMP IS SELECT * FROM PNPC_SALES WHERE WS_CODE = pCT_CODE ORDER BY SEQ; 只是定义了游标,并没有打开,就是一个定义而已真正隐式打开游标的是for... in cursor_name loop