Oracle环境下仓库容量校验用Check_ein_Lager存储过程(隐式游标)编译执行报错
Oracle存储过程校验仓库容量的问题排查
需求说明
编写Oracle存储过程,校验指定编号的仓库是否达到满容量。
初始实现代码
SET SERVEROUTPUT ON Create or Replace Procedure Check_ein_Lager(lagernummer int) AS summe int := 0; capacityy int; Begin for v_rec in (Select lager.stueckkap into capacityy from lager where lagernummer = lager.lnr) loop summe := summe + v_rec.stueck; if(summe<0) then DBMS_OUTPUT.PUT_LINE('Negativ'||' '||lagernummer||' '||summe); end if; if (summe > capacityy) then DBMS_OUTPUT.PUT_LINE('Höher'||' ' ||lagernummer||' '||summe); end if; end loop; end Check_ein_Lager; / execute Check_ein_Lager(15);
执行报错信息(原德文内容翻译)
- 编译器日志提示错误
- 命令
execute Check_ein_Lager(15)在第130行启动失败 - 错误详情:
- ORA-06550: 第1行第7列
- PLS-00905: 用户IF4EBIHORACM下的CHECK_EIN_LAGER对象处于无效状态
- ORA-06550: 第1行第7列
- PL/SQL: 语句被忽略
- 错误码说明:06550. 00000 - "%s行,%s列:\n%s"
- 触发原因:PL/SQL编译阶段出现语法错误,导致对象无法正常生效
- 关联提示:存储过程CHECK_EIN_LAGER编译未通过
核心编译错误点
- 游标定义语法错误:将
into capacityy写入游标select子句中,Oracle游标不支持在定义阶段使用into赋值语法,直接触发编译失败 - 游标查询字段缺失:原游标仅查询了仓库容量字段
stueckkap,循环中引用的库存字段stueck未被纳入查询列,触发字段不存在的编译错误 - 逻辑结构错误:仓库额定容量是固定单值,不属于游标逐行遍历的集合数据,原写法将容量赋值嵌入游标循环的结构完全不符合语法要求
修正后可编译的参考代码
SET SERVEROUTPUT ON CREATE OR REPLACE PROCEDURE Check_ein_Lager(lagernummer IN INT) AS summe INT := 0; capacityy INT; BEGIN -- 获取目标仓库的额定容量 SELECT stueckkap INTO capacityy FROM lager WHERE lnr = lagernummer; -- 汇总目标仓库的总库存数量 SELECT NVL(SUM(stueck),0) INTO summe FROM lager WHERE lnr = lagernummer; -- 库存校验输出 IF summe < 0 THEN DBMS_OUTPUT.PUT_LINE('Negativ'||' '||lagernummer||' '||summe); END IF; IF summe > capacityy THEN DBMS_OUTPUT.PUT_LINE('Höher'||' ' ||lagernummer||' '||summe); END IF; END Check_ein_Lager; / -- 执行指定仓库校验 EXEC Check_ein_Lager(15);
内容的提问来源于stack exchange,提问作者Tom D.
相关产品推荐
相关产品推荐

