Передача ассоциативного массива в качестве параметра между пакетами

#oracle #stored-procedures #parameter-passing #associative-array

#Oracle #хранимые процедуры #передача параметров #ассоциативный массив

Вопрос:

У меня есть два отдельных пакета Oracle (версия 9.2) PL / SQL, и я пытаюсь передать ассоциативный массив (т. Е. таблицу с индексацией) из процедуры в 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’ другим процедурам в первом пакете без каких-либо проблем.

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

Дэйв

Ответ №1:

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

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

Ответ №2:

«Массив определяется как: … в спецификации обоих пакетов.»

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

 package2.rollup_to_15(chanList)
  

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

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