在一个包中,我有:
我知道Type工作,我知道函数有效。但是当我尝试在Procedure中调用Function时,我得到以下编译错误:
错误(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参数传递给函数的任何想法?
答案 0 :(得分:2)
问题不在于函数本身的参数列表,而是您尝试在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];
您可能需要修改此内容以适合您的实际代码,但这是个主意。你不能在SQL语句中使用ID_LIST而不使其成为数据库定义类型,因为SQL引擎无法看到它。
PL / SQL是一个"引擎"在RDBMS中。它有一个语句处理器,当遇到SQL语句时,它将它交给SQL"引擎"用于处理。我想你可以看出导致问题的原因。