Передача ассоциативного массива в качестве параметра между пакетами - PullRequest
2 голосов
/ 25 апреля 2011

У меня есть два отдельных пакета PL / SQL Oracle (v9.2), и я пытаюсь передать ассоциативный массив (т. Е. Таблицу index-by) из процедуры в package1, как параметр процедуры вpackage2.Это возможно?Я продолжаю получать PLS-00306: wrong number or types of arguments in call to 'ROLLUP_TO_15', когда я компилирую package1.

Массив определяется как:

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 'другим процедурам в первом пакете без каких-либопроблемы.

Итак, возможно ли передать ассоциативный массив между пакетами?И если да, то как?

Дейв

Ответы [ 2 ]

5 голосов
/ 25 апреля 2011

Да, это возможно наверняка.

Трудно объяснить, почему вы получаете ошибку без примеров спецификаций пакета, но в целом, чтобы передать пользовательский тип в качестве параметра, вы должны либо с помощью определить тип 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;
/

Вы можете использовать тип TTestType в любом блоке PL / SQL, но не в SQL.

1 голос
/ 25 апреля 2011

"Массив определен как: ... в спецификации обоих пакетов."

Это источник вашей проблемы.PL / SQL рассматривает два отдельных объявления как два разных объекта, даже если оба типа имеют одинаковую подпись.Следовательно, двигатель вызывает сбои при вызове этого:

package2.rollup_to_15(chanList)

Ваш код определил переменную chanList как package1.list_tab, но процедура ожидает переменную типа package2.list_tab.

ПростейшийРешение состоит в том, чтобы объявить LIST_TAB только в PACKAGE2 и изменить PACKAGE1 так, чтобы chanList был объявлен соответствующим образом.

...