Oracle 19C PL/SQL函数IF条件使用报PLS-00103错误如何解决?
错误原因梳理
- 所有
IF分支结束后缺少END IF;闭合语句,PL/SQL要求每个IF块必须显式用END IF;收尾,缺分号就是你报PLS-00103的直接原因 - NULL值判断语法错误:Oracle中不能用
!= NULL判断非空,必须用IS NOT NULL,所有和NULL的等值/不等值判断结果都是UNKNOWN,不会触发IF分支 - 返回类型不匹配:函数定义返回
VARCHAR2,但实际返回的是数值类型的exrate,会出现隐式转换甚至报错 - 缺少异常处理:如果传入的oid在mexchange表中不存在,会抛出NO_DATA_FOUND运行时错误,建议加容错处理
- 内层IF判断冗余,可简化为CASE语句提升可读性
修正后的完整代码
CREATE OR REPLACE NONEDITIONABLE FUNCTION getexchangerate ( oid IN VARCHAR2 ) RETURN NUMBER IS -- 修正返回类型为数值,和exrate类型匹配 exchangeoid VARCHAR2(36 BYTE) := NULL; currency VARCHAR2(10 BYTE); exrate NUMBER(10, 4) := 0.0; l_ratethb NUMBER(10, 2); l_rateusd NUMBER(10, 2); l_rateeur NUMBER(10, 2); BEGIN -- 修正NULL判断语法,加END IF闭合 IF oid IS NOT NULL THEN exchangeoid := regexp_substr(oid, '[^;]+', 1, 1); currency := regexp_substr(oid, '[^;]+', 1, 2); END IF; IF exchangeoid IS NOT NULL THEN SELECT ratethb, rateusd, rateeur -- 去掉没必要的oid查询赋值,exchangeoid已经有值了 INTO l_ratethb, l_rateusd, l_rateeur FROM mexchange WHERE oid = exchangeoid; END IF; IF currency IS NOT NULL THEN -- 用CASE简化多分支判断,不用写多个IF CASE currency WHEN 'THB' THEN exrate := l_ratethb; WHEN 'USD' THEN exrate := l_rateusd; WHEN 'EUR' THEN exrate := l_rateeur; ELSE exrate := 0.0; -- 不识别的币种默认返回0,可按需修改 END CASE; END IF; RETURN exrate; EXCEPTION -- 加异常处理,查不到汇率/参数格式错误时返回默认值,避免函数运行直接报错 WHEN NO_DATA_FOUND THEN RETURN 0.0; WHEN OTHERS THEN RETURN 0.0; END getexchangerate; /
调用示例
SELECT getexchangerate('534534554xxxxx;USD') FROM dual;
内容的提问来源于stack exchange,提问作者Harina Ada
相关产品推荐
相关产品推荐

