具有全局用户定义类型的 Oracle SQL TABLE 运算符显示 "expression is of wrong type"
Oracle SQL TABLE Operator with Global User-Defined Types showing "expression is of wrong type"
我有一个名为 testingPackage
的包裹。它有一个名为 ToDo
的函数,带有一个关联数组输入参数 arrPhoneType
。
做testingPackage.ToDo('Kitty',arrTest)
时,出现expression is of wrong type错误。
如何将关联数组值输入到用户自定义类型?
testingPackage.sql
CREATE OR REPLACE PACKAGE testingPackage
AS
TYPE PHONE IS RECORD
(
lfMobileNumber NUMBER,
lfPhoneNumber NUMBER
);
TYPE arrPhoneType IS TABLE OF PHONE INDEX BY BINARY_INTEGER;
INTS arrPhoneType;
FUNCTION ToDo
(
szName IN VARCHAR2,
szList IN arrPhoneType DEFAULT CAST(NULL AS arrPhoneType)
)
RETURN VARCHAR2;
END testingPackage;
/
testingFunction.sql
CREATE OR REPLACE PACKAGE testingFunction
...
END testingFunction;
/
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 NVL(testingPackage.ToDo('Kitty',arrTest),'')
INTO szResult
FROM Dual;
RETURN szResult;
END FunctionA;
END testingFunction;
/
从风格上讲,直接赋值实际上总是比从 dual
执行 select
更可取。由于您使用的是旧版本的 Oracle,这也将解决编译问题,因为旧的 SQL 引擎无法处理 PL/SQL.
中定义的集合
这是一个 dbfiddle 显示,如果您使用的是 Oracle 11g R2 并将行更改为
szResult := NVL(testingPackage.ToDo('Kitty',arrTest),'') ;
代码应该编译
我有一个名为 testingPackage
的包裹。它有一个名为 ToDo
的函数,带有一个关联数组输入参数 arrPhoneType
。
做testingPackage.ToDo('Kitty',arrTest)
时,出现expression is of wrong type错误。
如何将关联数组值输入到用户自定义类型?
testingPackage.sql
CREATE OR REPLACE PACKAGE testingPackage
AS
TYPE PHONE IS RECORD
(
lfMobileNumber NUMBER,
lfPhoneNumber NUMBER
);
TYPE arrPhoneType IS TABLE OF PHONE INDEX BY BINARY_INTEGER;
INTS arrPhoneType;
FUNCTION ToDo
(
szName IN VARCHAR2,
szList IN arrPhoneType DEFAULT CAST(NULL AS arrPhoneType)
)
RETURN VARCHAR2;
END testingPackage;
/
testingFunction.sql
CREATE OR REPLACE PACKAGE testingFunction
...
END testingFunction;
/
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 NVL(testingPackage.ToDo('Kitty',arrTest),'')
INTO szResult
FROM Dual;
RETURN szResult;
END FunctionA;
END testingFunction;
/
从风格上讲,直接赋值实际上总是比从 dual
执行 select
更可取。由于您使用的是旧版本的 Oracle,这也将解决编译问题,因为旧的 SQL 引擎无法处理 PL/SQL.
这是一个 dbfiddle 显示,如果您使用的是 Oracle 11g R2 并将行更改为
szResult := NVL(testingPackage.ToDo('Kitty',arrTest),'') ;
代码应该编译