Из документации :
Тип коллекции, определенный в спецификации пакета, несовместим с идентично определенным локальным или автономным типом коллекции.
Хотя в вашем случае оба объявления находятся в пакете, второе является локальным для определения процедуры 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: существующее состояние пакетов было отброшено» позже.Таким образом, вы, вероятно, хотите удалить объявление глобальной переменной из спецификации.(Конечно, если вы используете эту глобальную переменную и необходимо, чтобы ваш пакет имел состояние, тогда игнорируйте эту часть ...)