在一个包中,我有:
- 一种数字表
- 以所述数字表类型作为参数的函数
- 需要使用数字表类型调用所述函数的过程
我知道类型有效,我知道功能有效。但是当我尝试在过程中调用函数时,出现以下编译错误:
错误(262,16):PLS-00306:调用中参数的数量或类型错误
到“[FUNCTION]”错误(262,16):PL/SQL:ORA-00904:
“[PACKAGE]”。“[FUNCTION]”:无效标识符错误(264,41):PLS-00642:
SQL 语句中不允许使用本地集合类型
包头:
CREATE OR REPLACE PACKAGE [PACKAGE] AS
TYPE NUMBER_LIST IS TABLE OF NUMBER;
FUNCTION [FUNCTION] (
[LIST_PARAM] NUMBER_LIST
) RETURN VARCHAR2;
PROCEDURE [PROCEDURE] (
RECORDS_AFFECTED OUT NUMBER
);
END [PACKAGE];
问题代码:
PROCEDURE [PROCEDURE](
RECORDS_AFFECTED OUT NUMBER
)AS
[ID_LIST] NUMBER_LIST;
BEGIN
...
SELECT [COLUMN]
BULK COLLECT INTO [ID_LIST]
FROM [TABLE]
INSERT INTO [TABLE]( [COLUMN] )
SELECT [FUNCTION]( LIST_PARAM => [ID_LIST] )
FROM [OTHER TABLE];
...
END [PROCEDURE];
错误围绕这一行:
SELECT [FUNCTION]( LIST_PARAM => [ID_LIST] )
我努力了:
[ID_LIST] NUMBER_LIST;
[ID_LIST] [PACKAGE].NUMBER_LIST;
SELECT [FUNCTION]( [ID_LIST] )
SELECT [FUNCTION]( LIST_PARAM => [ID_LIST] )
SELECT [PACKAGE].[FUNCTION]( [ID_LIST] )
SELECT [PACKAGE].[FUNCTION]( LIST_PARAM => [ID_LIST] )
但我觉得问题出在 [ID_LIST] 的传递方式上。
关于我将这个 Type TABLE OF NUMBER 参数传递给函数时做错了什么有什么想法吗?
问题不在于函数本身的参数列表,而在于您尝试在 SQL 语句中使用本地定义的类型 NUMBER_LIST(即 PLS-00642 错误)。 SQL 引擎对此类型一无所知。您必须创建一个数据库类型才能成功,例如:
CREATE OR REPLACE TYPE NUMBER_LIST IS TABLE OF NUMBER;
或者是这样的:
PROCEDURE [PROCEDURE](
RECORDS_AFFECTED OUT NUMBER
)AS
[ID_LIST] NUMBER_LIST;
fnc_ret VARCHAR2;
BEGIN
...
SELECT [COLUMN]
BULK COLLECT INTO [ID_LIST]
FROM [TABLE]
fnc_ret := [FUNCTION]( LIST_PARAM => [ID_LIST] );
INSERT INTO [TABLE]( [COLUMN] )
VALUES (fnc_ret);
...
END [PROCEDURE];
您可能需要修改它以适合您的实际代码,但这就是想法。如果不将 ID_LIST 设为数据库定义类型,则无法在 SQL 语句中使用 ID_LIST,因为 SQL 引擎看不到它。
PL/SQL 是 RDBMS 中的一个“引擎”。它有一个语句处理器,当它遇到一条SQL语句时,它就把它交给SQL“引擎”来处理。我想你可以明白为什么会导致这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)