Oracle 规范中声明的PL-SQL类型与主体过程的参数不兼容
我在我的包规范中定义了此类型:Oracle 规范中声明的PL-SQL类型与主体过程的参数不兼容,oracle,plsql,Oracle,Plsql,我在我的包规范中定义了此类型: TYPE NUMLIST IS TABLE OF NUMBER INDEX BY VARCHAR2(50); 以及规范中定义的全局变量: G_SERVICES NUMLIST; 我想在我的体内调用一个定义如下的过程: PROCEDURE filterAandB( pin_filter_type IN NUMBER , piota_initial_gservices IN OUT NU
TYPE NUMLIST IS TABLE OF NUMBER INDEX BY VARCHAR2(50);
以及规范中定义的全局变量:
G_SERVICES NUMLIST;
我想在我的体内调用一个定义如下的过程:
PROCEDURE filterAandB( pin_filter_type IN NUMBER
, piota_initial_gservices IN OUT NUMLIST)
像这样:
filterAandB( pin_filter_type => I_FILTER
, pita_initial_gservices => liota_initial_gservices);
需要指出的是,该过程是私有的,因此定义在正文中
PROCEDURE filterAandB( pin_filter_type IN NUMBER
, piota_initial_gservices IN OUT NUMLIST);
我要走了
错误:PLS-00306:调用中的参数数量或类型错误
“过滤器和B”行:2731
我也试着把它称为块,但仍然是相同的错误
查看类似的问题,我发现您需要将参数的类型声明为
pkgcomsupport_service.NUMLIST;
由于一些不兼容,请看线程,所以
liota_initial_gservices pkgcomsupport_service.NUMLIST;
是这样声明的,并且过程声明中的参数类型为
pkgcomsupport_service.NUMLIST代码>
但还是一样的错误。从你所说的,我看没有问题。但是,您的解释不是很清楚-如果您可以生成一个示例包(spec+body),它可以复制您得到的错误,这将更有帮助
这是我设计的一个程序包,试图模仿您所描述的内容:
create or replace package test as
TYPE NUMLIST IS TABLE OF NUMBER INDEX BY VARCHAR2(50);
G_SERVICES NUMLIST;
PROCEDURE test2(in_numlist numlist);
END TEST;
/
CREATE OR REPLACE PACKAGE BODY TEST AS
PROCEDURE test1 (in_number NUMBER,
in_numlist numlist)
IS
BEGIN
dbms_output.put_line('this works!');
END;
PROCEDURE test2(in_numlist numlist)
IS
v_num NUMBER := 1;
BEGIN
test1(v_num, in_numlist);
END;
END TEST;
/
要调用它,我运行以下命令:
DECLARE
v_numlist test.numlist;
BEGIN
test.test2(v_numlist);
END;
/
这是我得到的输出:
this works!
所以,没有问题。如果上面的测试用例不能准确地反映您的情况,我建议您编辑您的问题,以包含一个完整的测试用例来演示您的问题,这样我们就有更好的机会诊断问题。什么是I_FILTER
的数据类型?另外,包含对FilterAndB的调用的过程是否与FilterAndB在同一个包体中?NUMBER
,我很确定不是I\u FILTER
问题是将v\u numlist
作为参数从块发送到过程我已经编辑了我的答案以包含您的建议,但仍然没有遇到任何问题。可以看到,在调用test.test2过程的匿名块中,我将v_numlist变量声明为test.numlist数据类型。这是因为这就是test.test2所期望的数据类型。是的,我犯了一个愚蠢的错误,在过程定义中调用了过程参数pita\u initial\u gservices
,对不起,谢谢