热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle存储过程调试出错:ORA-06550

Oracle存储过程调试:ORA-06550PLS-00103:出现符号END在需要下列之一时::.(@;符号:被替换为END后继续。CREATEORR
Oracle 存储过程调试:
ORA-06550
PLS-00103:出现符号"END"在需要下列之一时:
:=.(@;
符号":"被替换为"END"后继续。


CREATE OR REPLACE procedure BEFOR_VIP_RESET.CP_UPDATE_DTL_YHJ_SUM
is
cursor cur IS  SELECT TRIM(DC.INV_NUM) INV_NUM ,SUM(DC.REDEEMVALUE)  SUM_REDEEMVALUES FROM DINV_COUPON DC GROUP BY DC.INV_NUM;
INT_COUNT_DINV_COUPON_BY_INV number;
begin
    for RUR1 in cur LOOP
BEGIN
    SELECT COUNT(*) INTO INT_COUNT_DINV_COUPON_BY_INV FROM DINV_DTL_YHJ DDY WHERE TRIM(DDY.INV_NUM) =TRIM(RUR1.INV_NUM);
IF (INT_COUNT_DINV_COUPON_BY_INV !=0) THEN
    UPDATE DINV_DTL_YHJ D_D_Y SET D_D_Y.REDEEMWAY  =  (RUR1.SUM_REDEEMVALUES/INT_COUNT_DINV_COUPON_BY_INV);
ORA-06550
PLS-00103:出现符号"END"在需要下列之一时:
:=.(@;
符号":"被替换为"END"后继续。
    END IF ;
    END;
    END LOOP;
end CP_UPDATE_DTL_YHJ_SUM;


debug时发现INT_COUNT_DINV_COUPON_BY_INV、RUR1.INV_NUM 均有正常值

14 个解决方案

#1


这行到:

UPDATE DINV_DTL_YHJ D_D_Y SET D_D_Y.REDEEMWAY  =  (RUR1.SUM_REDEEMVALUES/INT_COUNT_DINV_COUPON_BY_INV);

这里出错。

#2


引用 1 楼 handsome1234 的回复:
这行到:

UPDATE DINV_DTL_YHJ D_D_Y SET D_D_Y.REDEEMWAY  =  (RUR1.SUM_REDEEMVALUES/INT_COUNT_DINV_COUPON_BY_INV);

这里出错。

语法没找到错,不知道是不是你的数据有问题,D_D_Y.REDEEMWAY  这个字段和要更改的值匹配吗(类型)?

#3


引用 楼主 handsome1234 的回复:
Oracle 存储过程调试:
ORA-06550
PLS-00103:出现符号"END"在需要下列之一时:
:=.(@;
符号":"被替换为"END"后继续。


CREATE OR REPLACE procedure BEFOR_VIP_RESET.CP_UPDATE_DTL_YHJ_SUM
is
cursor cur IS  SELECT TRIM(DC.INV_NUM) INV_NUM ,SUM(DC.REDEEMVALUE)  SUM_REDEEMVALUES FROM DINV_COUPON DC GROUP BY DC.INV_NUM;
INT_COUNT_DINV_COUPON_BY_INV number;
begin
    for RUR1 in cur LOOP
BEGIN
    SELECT COUNT(*) INTO INT_COUNT_DINV_COUPON_BY_INV FROM DINV_DTL_YHJ DDY WHERE TRIM(DDY.INV_NUM) =TRIM(RUR1.INV_NUM);
IF (INT_COUNT_DINV_COUPON_BY_INV !=0) THEN
    UPDATE DINV_DTL_YHJ D_D_Y SET D_D_Y.REDEEMWAY  =  (RUR1.SUM_REDEEMVALUES/INT_COUNT_DINV_COUPON_BY_INV);
ORA-06550
PLS-00103:出现符号"END"在需要下列之一时:
:=.(@;
符号":"被替换为"END"后继续。
    END IF ;
    END;
    END LOOP;
end CP_UPDATE_DTL_YHJ_SUM;


debug时发现INT_COUNT_DINV_COUPON_BY_INV、RUR1.INV_NUM 均有正常值

把你整个过程贴上来看看

#4


1、这就是整个存储过程。
2、

UPDATE DINV_DTL_YHJ D_D_Y SET D_D_Y.REDEEMWAY  =  (RUR1.SUM_REDEEMVALUES/INT_COUNT_DINV_COUPON_BY_INV);

这句如果改成:
        UPDATE DINV_DTL_YHJ D_D_Y
           SET D_D_Y.REDEEMWAY =66;
仍然报上面的错误。
看来是结构的问题?

#5


UPDATE  DINV_DTL_YHJ  D_D_Y SET D_D_Y.REDEEMWAY
红色跟蓝色之前有空格

#6


老大,是有空格,我是作为别名来用的。

#7


引用 6 楼 handsome1234 的回复:
老大,是有空格,我是作为别名来用的。


我好菜啊~~

#8


我单独执行:
        UPDATE DINV_DTL_YHJ D_D_Y
           SET D_D_Y.REDEEMWAY =66;

是没有问题的,执行返回1000多行。

#9


老大,谦虚了,老大是严谨的。值得我辈学习。

#10


引用 9 楼 handsome1234 的回复:
老大,谦虚了,老大是严谨的。值得我辈学习。


end CP_UPDATE_DTL_YHJ_SUM;
改为end;

#11


直接复制你的过程结构然后替换了一下我的表名,完全木有问题额!

#12


引用 10 楼 chenjiang89 的回复:
Quote: 引用 9 楼 handsome1234 的回复:

老大,谦虚了,老大是严谨的。值得我辈学习。


end CP_UPDATE_DTL_YHJ_SUM;
改为end;


我按照你说的方法,故障依旧。

#13


引用 12 楼 handsome1234 的回复:
Quote: 引用 10 楼 chenjiang89 的回复:

Quote: 引用 9 楼 handsome1234 的回复:

老大,谦虚了,老大是严谨的。值得我辈学习。


end CP_UPDATE_DTL_YHJ_SUM;
改为end;


我按照你说的方法,故障依旧。

把UPDATE 拿到外面单独执行,将拿出了UPDATE的procedure也单独执行,如果两者都正常,就实在没办法了

#14


问题解决了:
我的那个UPDATE 语句没有where条件,导致程序长时间执行,不知死活。
当然把上一个逗号去掉。
WHERE TRIM(DDY.INV_NUM) = TRIM(RUR1.INV_NUM);

顺便说一下用:
调试存储过程还是要在SQLGate或PLSQL里的PLSQL模块里面,其他模块误导,以为编译没问题,其实根本没编译成功。

还是要多试试。

推荐阅读
author-avatar
lixinleslee
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有