读书人

如何PLSQL编译过程总不行一会还报锁

发布时间: 2012-12-17 09:31:40 作者: rapoo

怎么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呢?不过这个不应该是引起无法编译的问题,编译时有什么错误吗?
------其他解决方案--------------------


DM.DM_KPI_DIFF_M@CUJFBA 是在另一个数据库?你先保证查询这个数据库没问题
[其他解释]
编译没有错 加上COMMIT的确对了 但是我单步执行的时候执行到
SELECT KPI_VALUE1 INTO TOTALEVERY FROM DM.DM_KPI_DIFF_M@CUJFBA T
的时候 直接抛出异常 不知道为什么 我的where语句对啊 没有错啊
[其他解释]
没有问题 我已经试了
[其他解释]
你select的列的类型和你定义的变量类型不匹配?或者看看出的什么异常
[其他解释]
EXCEPTION
WHEN OTHERS THEN

dbms_output.put_line('Error: '
[其他解释]
SQLERRM);

读书人网 >oracle

热点推荐