将关联数组作为包之间的参数传递

时间:2011-04-25 13:10:02

标签: oracle stored-procedures parameter-passing associative-array

我有两个单独的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);这就是我得到编译错误的行(chanListlist_tab类型的变量。)

在package2中,该过程定义为:

procedure rollup_to_15(channels in list_tab) is

我猜我的问题是类型是在每个包中单独定义的,因为我可以将`chanList'变量传递给第一个包中的其他过程而没有任何问题。

那么,是否可以在包之间传递关联数组?如果是这样,怎么样?

戴夫

2 个答案:

答案 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。