#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 был объявлен соответствующим образом.