我有两个单独的Oracle(v9.2)PL / SQL包,我试图从package1中的过程传递一个关联数组(即索引表),作为一个过程的参数包2。这可能吗?编译package1时,我不断获得PLS-00306: wrong number or types of arguments in call to 'ROLLUP_TO_15'
。
数组定义为:
type list_tab is table of number(10)
index by binary_integer;
在两个包的规格中。在package1中的过程中,我将第二个包调用为package2.rollup_to_15(chanList);
这就是我得到编译错误的行(chanList
是list_tab
类型的变量。)
在package2中,该过程定义为:
procedure rollup_to_15(channels in list_tab) is
我猜我的问题是类型是在每个包中单独定义的,因为我可以将`chanList'变量传递给第一个包中的其他过程而没有任何问题。
那么,是否可以在包之间传递关联数组?如果是这样,怎么样?
戴夫
答案 0 :(得分:5)
是的,可以肯定。
很难解释为什么没有包规范样本会收到错误,但通常要将用户定义的类型作为参数传递给define type DDL,或者在包规范中定义类型。
我想你想要后一种变体:)
所以这是一个例子:
create or replace package TestPackage_1
as
type TTestType is table of varchar2(1) index by varchar2(1);
end TestPackage_1;
/
create or replace package TestPackage_2
as
procedure Dummy(aParam TestPackage_1.TTestType);
end TestPackage_2;
/
您可以在任何PL / SQL块中使用TTestType
类型,但在SQL中使用不是。
答案 1 :(得分:1)
“数组定义为:......两者都有 包的规格。“
这是您的问题的根源。 PL / SQL将两个单独的声明视为两个不同的对象,即使这两个类型具有相同的签名。因此,当你打电话给这个引擎时,引擎就会出现:
package2.rollup_to_15(chanList)
您的代码已将chanList变量定义为package1.list_tab
,但该过程期望变量类型为package2.list_tab
。
最简单的解决方案是在PACKAGE2中声明LIST_TAB,然后选择PACKAGE1以便正确声明chanList。