本文介绍调用 PL 对象时出现 Invalid argument num 错误的原因和解决方法。
适用版本
OceanBase 数据库所有版本
问题现象
调用 PL 对象时,出现
Invalid argument num
的错误,但调用时使用的参数数量是正确的。
obclient> SELECT cus_concat(‘a’,‘b’); ORA-00600: internal error code, arguments: -4161, Invalid argument num
可能原因
出现
Invalid argument num
的错误,实际上是由于 PL 内部调用的某个表达式传参错误,例如执行以下 SQL 语句创建的函数中,调用了
CONCAT(a,b,‘1’)
,虽然创建函数的语句会执行成功,但由于 CONCAT 函数允许的参数数量是 2 个,因此在执行时会出现以上错误。
obclient> CREATE OR REPLACE FUNCTION cus_concat(a VARCHAR2,b VARCHAR2) RETURN VARCHAR2 AS c VARCHAR2(32); BEGIN c := CONCAT(a,b,‘1’); RETURN c; END; /
实际上,在调用 PL 时出现的传参数目不对会返回错误码 5555,错误信息为
Incorrect number of arguments
,调用示例如下。
obclient> SELECT cus_concat(‘a’,‘b’,‘c’); ORA-00600: internal error code, arguments: -5555, Incorrect number of arguments
解决方式
修改 PL 中表达式的传参方式,例如可以将上述函数修改为以下格式。
obclient> CREATE OR REPLACE FUNCTION cus_concat(a VARCHAR2,b VARCHAR2) RETURN VARCHAR2 AS d VARCHAR2(32); c VARCHAR2(32); BEGIN c := CONCAT(a,b); d := CONCAT(c,‘1’); RETURN d; END; / obclient> SELECT cus_concat(‘a’,‘b’) FROM DUAL; ±--------------------+ | CUS_CONCAT(‘A’,‘B’) | ±--------------------+ | ab1 | ±--------------------+ 1 row in set (0.01 sec)