PL/SQL块if条件中OR运算符逻辑判断失效问题
PL/SQL多分支名校验逻辑异常修复
初始正常版本
初始需求为仅允许分支名为surat时插入账户数据,可正常运行的代码如下:
declare myex exception; no account.ano %type; b account.bal%type; branch account.Bname%type; begin no:=:no; b:=:b; branch:=:branch; if branch <> 'surat' then raise myex; end if; insert into account values(no,b,branch); commit; dbms_output.put_line('record inserted successfully...'); exception when myex then dbms_output.put_line('invalid branch name '); end;
异常场景
尝试使用OR运算符新增多个允许的分支名后,代码运行逻辑异常:即便是输入surat、vadodra这类预设的合法分支名,也会触发myex自定义异常。异常代码如下:
declare myex exception; no account.ano %type; b account.bal%type; branch account.Bname%type; begin no:=:no; b:=:b; branch:=:branch; if branch <> 'surat' or branch <>'vadodra' or branch <>'ahmedabad' then raise myex; end if; insert into account values(no,b,branch); commit; dbms_output.put_line('record inserted successfully...'); exception when myex then dbms_output.put_line('invalid branch name '); end;
问题根因
异常由布尔逻辑判断错误导致:
OR运算符的规则是:只要连接的任意一个条件为真,整个表达式结果就为真- 不存在任何一个分支名能同时等于
surat、vadodra、ahmedabad三个值,因此无论输入哪个合法分支名,至少会满足2个「不等于某合法分支」的条件,整个if判断永远返回真,必然触发自定义异常。
修正方法
两种正确写法可实现需求:
- 将判断条件中的
OR替换为AND,逻辑为:当分支名不等于所有允许的分支时,判定为非法分支抛错 - 用
NOT包裹等于条件的OR组合,可读性更强,逻辑为:当分支名不在允许列表中时抛错
修正后的完整代码(采用第二种可读性更高的写法):
declare myex exception; no account.ano %type; b account.bal%type; branch account.Bname%type; begin no:=:no; b:=:b; branch:=:branch; if not (branch = 'surat' or branch = 'vadodra' or branch = 'ahmedabad') then raise myex; end if; insert into account values(no,b,branch); commit; dbms_output.put_line('record inserted successfully...'); exception when myex then dbms_output.put_line('invalid branch name '); end;
如果采用第一种AND写法,判断条件可写为:
if branch <> 'surat' and branch <> 'vadodra' and branch <> 'ahmedabad' then
两种写法运行效果完全一致。
内容的提问来源于stack exchange,提问作者Riddhi Vekariya
相关产品推荐
相关产品推荐

