Ошибка: «Неверное число, типы или аргументы» при передаче массива в другую процедуру - PullRequest
0 голосов
/ 02 января 2019

Я хочу передать массив в качестве аргумента другой процедуре. Оба находятся в том же пакете. В этом сценарии ниже показан демонстрационный массив. Ошибка при получении: «PLS-00306 отображается неверное число или типы аргументов» ..

CREATE or REPLACE package WSH_Delivery_Detail_Shipment is

type Result IS VARRAY(8) OF INTEGER;
p_result Result:=Result();

PROCEDURE CreateShipment(p_delivery_detail_interface_id IN WSH_DEL_DETAILS_INTERFACE.DELIVERY_DETAIL_INTERFACE_ID%TYPE,p_status OUT String);
PROCEDURE CreateShipmentLines(p_result IN RESULT);

END WSH_Delivery_Detail_Shipment;
/


CREATE OR REPLACE package body WSH_Delivery_Detail_Shipment as

PROCEDURE CreateShipment(p_delivery_detail_interface_id IN WSH_DEL_DETAILS_INTERFACE.DELIVERY_DETAIL_INTERFACE_ID%TYPE,p_status OUT String)

IS

CURSOR wddi_cur IS SELECT * FROM WSH_DEL_DETAILS_INTERFACE WHERE DELIVERY_DETAIL_INTERFACE_ID=p_delivery_detail_interface_id;
wddi_record WSH_DEL_DETAILS_INTERFACE%ROWTYPE;

type Result IS VARRAY(8) OF INTEGER;
p_result Result:=Result(1,1,1,1,1,1,1,1);

BEGIN

OPEN wddi_cur;

LOOP

.. Some few select queries>>>>

WSH_Delivery_Detail_Shipment.CreateShipmentLines(p_result); // Calling procedure and passing array



END LOOP;
CLOSE wddi_cur;
END CreateShipment;

procedure CreateShipmentLines(p_result IN RESULT)

is

BEGIN

....Some select queries

END CreateShipmentLines;
END WSH_Delivery_Detail_Shipment;
/

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Из документации :

Тип коллекции, определенный в спецификации пакета, несовместим с идентично определенным локальным или автономным типом коллекции.

Хотя в вашем случае оба объявления находятся в пакете, второе является локальным для определения процедуры CreateShipment и поэтому все еще несовместимо с объявлением в спецификации пакета.Хотя они выглядят одинаково для вас, для компилятора Oracle они бывают разных типов.

Так что, как сказал @WilliamRobertson, вам просто нужно изменить процедуру, чтобы использовать тип, объявленный в спецификации:

CREATE OR REPLACE package body WSH_Delivery_Detail_Shipment as

PROCEDURE CreateShipment(p_delivery_detail_interface_id IN WSH_DEL_DETAILS_INTERFACE.DELIVERY_DETAIL_INTERFACE_ID%TYPE,p_status OUT String)
IS

  CURSOR wddi_cur IS SELECT * FROM WSH_DEL_DETAILS_INTERFACE WHERE DELIVERY_DETAIL_INTERFACE_ID=p_delivery_detail_interface_id;
  wddi_record WSH_DEL_DETAILS_INTERFACE%ROWTYPE;

  -- type Result IS VARRAY(8) OF INTEGER; -- remove this
  p_result Result:=Result(1,1,1,1,1,1,1,1); -- now uses type from specification

BEGIN
  ...

В качестве отдельной проблемы p_result Result:=Result(); в спецификации пакета также полностью отделен от переменной p_result, объявленной в этом определении процедуры.Из того, что вы показали, глобальный p_result никогда не используется, что делает его избыточным;но это также делает ваш пакет stateful , что вы, вероятно, не собирались - и это может привести к ненужным ошибкам «ORA-04068: существующее состояние пакетов было отброшено» позже.Таким образом, вы, вероятно, хотите удалить объявление глобальной переменной из спецификации.(Конечно, если вы используете эту глобальную переменную и необходимо, чтобы ваш пакет имел состояние, тогда игнорируйте эту часть ...)

0 голосов
/ 02 января 2019

Вы объявили два типа с именем Result. CreateShipmentLines ожидает первого, но вы передаете второй.

Удаление второго объявления (строка, начинающаяся с 'type Result is ...' в CreateShipment) должно исправить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...