PLSQL存储过程条件检查计数异常及ORA-02291报错问题咨询
问题根因
- 核心故障点是存储过程入参名和表字段名重名。Oracle 解析 SQL 标识符时,列名的优先级高于存储过程入参/局部变量,你写的查询条件
WHERE BRANDID = brandId AND ACTIVITYCODE = activityCode实际被解析为表的BRANDID字段等于自身、ACTIVITYCODE字段等于自身,相当于没有过滤条件,因此COUNT返回全表行数4,逻辑判断错误进入插入分支。这也解释了你单独执行带常量的COUNT查询结果正确,只有存储过程内查询结果异常的现象。 - 额外注意报错日志里的调用入参是
AOS而非你预期的A05,存在输入笔误问题,就算修复了参数名冲突,输入不存在的活动编码也会触发外键约束报错。
修复方案
给存储过程入参加统一前缀(例如p_),避免和表字段名冲突即可,修改后的存储过程参考如下:
create or replace PROCEDURE add_re_rule ( p_brandId IN VARCHAR2, p_activityCode IN VARCHAR2, p_points IN NUMBER, ret OUT INT ) AS SAMERULECOUNT INT; ACTYPECOUNT INT; BEGIN SELECT COUNT(BRANDID) INTO ACTYPECOUNT FROM BRANDACTIVITYTYPE WHERE BRANDID = p_brandId AND ACTIVITYCODE = p_activityCode; SELECT COUNT(BRANDID) INTO SAMERULECOUNT FROM RERULE WHERE BRANDID = p_brandId AND ACTIVITYCODE = p_activityCode; Dbms_Output.Put_Line(ACTYPECOUNT); IF SAMERULECOUNT > 0 THEN ret := 0; ELSIF ACTYPECOUNT = 0 THEN ret := 2; ELSE INSERT INTO RERULE(BRANDID, ACTIVITYCODE, POINTS, VERSIONNO) values (p_brandId, p_activityCode, p_points, 1); ret := 1; END IF; END; /
内容的提问来源于stack exchange,提问作者Setu Kumar Basak
相关产品推荐
相关产品推荐

