2

我有两个单独的Oracle(v9.2)PL/SQL包,我试图从过程中传递关联数组(即索引表) package1作为package2中过程的参数。这可能吗?当我编译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类型的一个变量)。

在包2,该过程被定义为:

procedure rollup_to_15(channels in list_tab) is 

我猜测,我的问题是,该类型是在每个包单独定义,因为我能通过`chanList”变量其它工序在第一包内没有任何问题。

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

Dave

回答

4

是的,这是可以肯定的。

很难解释为什么在没有包规范示例时收到错误,但通常需要将用户定义的类型作为参数传递给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

+0

谢谢!正是我需要的! – DaveKub 2011-04-25 13:43:01

1

“该阵列被定义为:...在两个 包的规范。”

这是问题的根源。 PL/SQL将两个单独的声明视为两个不同的对象,即使两种类型都具有相同的签名。因此发动机投掷当你调用这个:

package2.rollup_to_15(chanList) 

您的代码定义通过chanlist变量package1.list_tab但程序期待package2.list_tab类型的变量。

最简单的解决方法是在PACKAGE2中声明LIST_TAB,然后使用chnage PACKAGE1以便恰当声明chanList。