CREATE OR REPLACE PROCEDURE TEMP_LIKE0914(V_RETCODE OUT VARCHAR2,
                                                                              V_RETINFO OUT VARCHAR2) AS
  V_SQL      LONG;
  V_SQL1     LONG;
  I          NUMBER := 1;
  J          NUMBER := 1;
  TOTAL1     NUMBER := 0;
  TOTAL2     NUMBER := 0;
  TOTALEVERY NUMBER := 0;
BEGIN
  V_SQL  := 'OLD_357=UAGP2405+OLD_066+MWGG2001+OLD_087';
  V_SQL1 := REGEXP_REPLACE(V_SQL, '[a-zA-Z]+=', '');
LOOP
    SELECT INSTR(V_SQL1, '+', 1, J) INTO I FROM DUAL ;
    SELECT KPI_VALUE1  INTO TOTALEVERY FROM DM.DM_KPI_DIFF_M@CUJFBA T 
WHERE T.KPI_CODE = REGEXP_SUBSTR(V_SQL1, '[^+]+', 1, J)
 AND T.ACCT_DATE = '201201'
AND T.PROV_ID = '011';
    EXIT WHEN I = 0;
 J := J + 1;
    DBMS_OUTPUT.PUT_LINE(REGEXP_SUBSTR(V_SQL1, '[^+]+', 1, J)||'='||TOTALEVERY);
    TOTAL1 := TOTAL1 + TOTALEVERY;
   COMMIT;
END LOOP;
      SELECT KPI_VALUE1
      INTO TOTAL2
      FROM DM.DM_KPI_DIFF_M@CUJFBA T 
WHERE T.KPI_CODE = SUBSTR(V_SQL, 1, (INSTR(V_SQL, '=', 1, J) - 1))
AND T.ACCT_DATE = '201201'
AND T.PROV_ID = '011';
DBMS_OUTPUT.PUT_LINE(SUBSTR(V_SQL, 1, (INSTR(V_SQL, '=', 1, J) - 1))||'='||TOTAL2);
IF TOTAL1<>TOTAL2 THEN 
DBMS_OUTPUT.PUT_LINE('错误');
ELSE 
DBMS_OUTPUT.PUT_LINE('正确');
END IF;
 V_RETCODE := 'SUCCESS ';
   V_RETINFO := ' 结束 ';
EXCEPTION WHEN OTHERS THEN
V_RETCODE := 'FAIL';
V_RETINFO := '失败';
END;

解决方案 »

  1.   

    commit要放到循环end loop;外
      

  2.   

    为什么我单步执行  执行到
    SELECT KPI_VALUE1 INTO TOTALEVERY FROM DM.DM_KPI_DIFF_M@CUJFBA T
    这里的时候  直接到了异常呢 我找了半天也找不到 先谢谢你commit的帮助 一会分数给你  请帮忙在解决下吧
      

  3.   

    都是查询为什么要加commit呢?不过这个不应该是引起无法编译的问题,编译时有什么错误吗?
      

  4.   

    DM.DM_KPI_DIFF_M@CUJFBA 是在另一个数据库?你先保证查询这个数据库没问题
      

  5.   

    编译没有错 加上COMMIT的确对了  但是我单步执行的时候执行到
    SELECT KPI_VALUE1 INTO TOTALEVERY FROM DM.DM_KPI_DIFF_M@CUJFBA T  
    的时候  直接抛出异常 不知道为什么  我的where语句对啊 没有错啊
      

  6.   

    你select的列的类型和你定义的变量类型不匹配?或者看看出的什么异常
      

  7.   

    我觉得你那条语句要么返回0行,要么返回>1行,报异常的时候需要看错误信息是什么。
    或者你改为SELECT MAX(KPI_VALUE1) INTO TOTALEVERY FROM DM.DM_KPI_DIFF_M@CUJFBA T  
      

  8.   

    EXCEPTION
       WHEN OTHERS THEN
         
         dbms_output.put_line('Error: ' || SQLERRM);