You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 12:15:39