PL/SQL中IF条件使用OR运算符失效,如何正确实现条件合并?
问题描述
原PL/SQL代码通过分支判断分别调用两个函数,满足对应条件时将type赋值为'A',代码运行正常:
IF(rec_.invoice_id IS NOT NULL) THEN IF (Tax_API.Tax_Items_Taxable_Exist(rec_.company, Tax_Source_API.DB_INVOICE, TO_CHAR(rec_.invoice_id), TO_CHAR(rec_.item_id), '*', '*', '*') = 'TRUE')THEN type := 'A'; END IF; ELSE IF(Report_Type_API.Is_Taxable_Db(rec_.company, rec_.report_code, rec_.account_date)='TRUE') THEN type := 'A'; END IF; END IF;
但直接用OR合并两个条件后,代码无法正常运行:
IF ((Tax_API.Tax_Items_Taxable_Exist(rec_.company, Tax_Source_API.DB_INVOICE, TO_CHAR(rec_.invoice_id), TO_CHAR(rec_.item_id), '*', '*', '*') = 'TRUE') OR (Report_Type_API.Is_Taxable_Db(rec_.company, rec_.report_code, rec_.account_date)='TRUE'))THEN type := 'A'; END IF;
问题原因
原代码的逻辑是互斥执行两个函数:
- 仅当
rec_.invoice_id IS NOT NULL时,才调用第一个函数做判断 - 仅当
rec_.invoice_id IS NULL时,才调用第二个函数做判断
而合并后的OR条件会强制计算两个函数的返回值,不管rec_.invoice_id是否为空。这会导致两种异常情况:
- 当
rec_.invoice_id IS NULL时,第一个函数的参数TO_CHAR(rec_.invoice_id)会传入NULL,若Tax_Items_Taxable_Exist函数未处理NULL参数,会直接抛出错误 - 即使函数能处理NULL,也会出现不符合原逻辑的判断(比如invoice_id为空时,不该执行第一个函数的判断,但OR会执行,可能返回不符合预期的结果)
正确的合并方式
要保留原逻辑的互斥性,需要在每个条件前加上对应的前置判断,确保只有符合条件时才调用对应函数:
IF ( (rec_.invoice_id IS NOT NULL AND Tax_API.Tax_Items_Taxable_Exist(rec_.company, Tax_Source_API.DB_INVOICE, TO_CHAR(rec_.invoice_id), TO_CHAR(rec_.item_id), '*', '*', '*') = 'TRUE') OR (rec_.invoice_id IS NULL AND Report_Type_API.Is_Taxable_Db(rec_.company, rec_.report_code, rec_.account_date)='TRUE') ) THEN type := 'A'; END IF;
这种写法既合并了外层的IF分支,又保证两个函数不会被错误调用,完全符合原代码的逻辑。
内容的提问来源于stack exchange,提问作者RMD
相关产品推荐
相关产品推荐

