Oracle调用带关联数组参数的包函数报表达式类型错误如何解决
错误原因
报错核心原因是包内定义的关联数组(Associative Array,即带INDEX BY的集合类型)属于PL/SQL专属类型,SQL引擎无法识别该类型。你在代码中使用SELECT ... FROM Dual调用函数的操作属于SQL上下文,SQL引擎解析到传入的arrTest是PL/SQL专属类型时,就会抛出expression is of wrong type错误。
解决方案
方案1:直接在PL/SQL上下文调用函数(最简便)
不需要走SQL的SELECT INTO逻辑,直接在PL/SQL块中给变量赋值即可,PL/SQL引擎可以正常识别包内定义的关联数组类型。仅需修改testingFunction包体中FunctionA的代码:
CREATE OR REPLACE PACKAGE BODY testingFunction AS FUNCTION FunctionA RETURN VARCHAR2 IS szResult VARCHAR2(2000); arrTest testingPackage.arrPhoneType; BEGIN arrTest(0).lfMobileNumber := 12345678; arrTest(0).lfPhoneNumber := 87654321; -- 去掉SELECT FROM Dual,直接在PL/SQL中赋值 szResult := NVL(testingPackage.ToDo('Kitty',arrTest),''); RETURN szResult; END FunctionA; END testingFunction; /
方案2:将类型改为SQL层面定义的集合类型(适用于必须在SQL上下文调用的场景)
如果业务逻辑确实需要在SQL语句中调用该函数,就不能使用PL/SQL专属的关联数组,需要把类型改到SQL层面定义,步骤如下:
- 先在SQL层面创建PHONE对象类型和对应的嵌套表类型:
CREATE OR REPLACE TYPE PHONE_OBJ AS OBJECT ( lfMobileNumber NUMBER, lfPhoneNumber NUMBER ); / CREATE OR REPLACE TYPE arrPhoneType IS TABLE OF PHONE_OBJ; /
- 修改
testingPackage包,删掉包内的PHONE和arrPhoneType定义,直接使用SQL层面的类型即可。 - 对应调整
FunctionA中的变量赋值逻辑,改为对象类型的初始化方式。
内容的提问来源于stack exchange,提问作者hccory
相关产品推荐
相关产品推荐

