日期:2014-05-17  浏览次数:20998 次

怎么PLSQL编译过程总不行,一会还报锁住
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;

------最佳解决方案--------------------
commit要放到循环end loop;外
------其他解决方案--------------------
我觉得你那条语句要么返回0行,要么返回>1行,报异常的时候需要看错误信息是什么。
或者你改为SELECT MAX(KPI_VALUE1) INTO TOTALEVERY FROM DM.DM_KPI_DIFF_M@CUJFBA T  
------其他解决方案--------------------
为什么我单步执行  执行到
SELECT KPI_VALUE1 INTO TOTALEVERY FROM DM.DM_KPI_DIFF_M@CUJFBA T
这里的时候  直接到了异常呢 我找了半天也找不到 先谢谢你commit的帮助 一会分数给你  请帮忙在解决下吧
------其他解决方案--------------------
都是查询为什么要加commit呢?不过这个不应该是引起无法编译的问题,编译时有什么错误吗?
------其他解决方案--------------------