Oracle PL/SQL中DECODE函数报错PLS-00382:表达式类型错误求助
解决PLS-00382类型不匹配错误
错误原因
你遇到的PLS-00382: expression is of wrong type(表达式类型错误),核心问题是SQL函数DECODE不支持PL/SQL的BOOLEAN类型。你定义了BOOLEAN变量b并赋值为p>=100,但在SQL语句中调用DECODE时传入这个BOOLEAN变量,而SQL环境中不存在BOOLEAN类型,因此触发类型不匹配错误。
修正方案
不需要额外定义BOOLEAN变量,直接在DECODE中通过数值判断替代BOOLEAN逻辑,以下是两种可行的修正方式:
修正后的代码(方案1:用SIGN函数转换条件)
CREATE OR REPLACE PROCEDURE two AS i number; j number; p number; msg varchar2(100); BEGIN i := &x; j := &y; p := i * j; -- 当p>=100时,p-100非负,SIGN返回1或0;否则返回-1 SELECT DECODE(SIGN(p - 100), -1, 'False', 'True') INTO msg FROM dual; dbms_output.put_line(msg); END; /
修正后的代码(方案2:用CASE表达式转换条件,更直观)
CREATE OR REPLACE PROCEDURE two AS i number; j number; p number; msg varchar2(100); BEGIN i := &x; j := &y; p := i * j; -- 用CASE将条件转换为DECODE可识别的数值 SELECT DECODE(CASE WHEN p >= 100 THEN 1 ELSE 0 END, 1, 'True', 'False') INTO msg FROM dual; dbms_output.put_line(msg); END; /
额外优化(无需查询DUAL表)
如果不想通过SELECT查询DUAL表,也可以直接在PL/SQL中用CASE表达式赋值,同样满足替代IF的要求:
CREATE OR REPLACE PROCEDURE two AS i number; j number; p number; msg varchar2(100); BEGIN i := &x; j := &y; p := i * j; msg := CASE WHEN p >= 100 THEN 'True' ELSE 'False' END; dbms_output.put_line(msg); END; /
内容的提问来源于stack exchange,提问作者Prajwal Dhage
相关产品推荐
相关产品推荐

