У меня есть эта процедура в Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64-битная производственная БД, но у меня возникает эта ошибка каждый раз, когда я пытаюсь ее перекомпилировать. Процедура представляет собой копирование и вставку из другой БД, поэтому теперь возникает ошибка, потому что в другой БД пакет работает правильно... тем не менее я получил эту ошибку:
Error(1,35): PLS-00304: cannot compile body of 'P_COUNTRY_PLATS' without its specification
.
create or replace PACKAGE "P_COUNTRY_PLATS" is
procedure createNew (p_msisdn IN lopes.country_plats.recipient_msisdn%TYPE
,p_channel IN lopes.country_plats.channel%TYPE
,p_message IN lopes.country_plats.message%TYPE
);
procedure createNew (p_msisdn IN lopes.country_plats.recipient_msisdn%TYPE
,p_channel IN lopes.country_plats.channel%TYPE
,p_message IN lopes.country_plats.message%TYPE
,p_request_date IN lopes.country_plats.request_date%TYPE
,p_action_history_id IN lopes.country_plats.action_history_id%TYPE
);
procedure createNew (p_msisdn IN lopes.country_plats.recipient_msisdn%TYPE
,p_channel IN lopes.country_plats.channel%TYPE
,p_message IN lopes.country_plats.message%TYPE
,p_request_date IN lopes.country_plats.request_date%TYPE
,p_action_history_id IN lopes.country_plats.action_history_id%TYPE
,p_ac_scheduled_action_id IN lopes.country_plats.ac_scheduled_action_id%TYPE
);
procedure getNextMsgToSend (p_channel IN lopes.country_plats.channel%TYPE
,p_ip_address IN OUT VARCHAR2
,p_message IN OUT lopes.country_plats.message%TYPE
,p_msg_id IN OUT lopes.country_plats.country_plats_id%TYPE
);
procedure getNextMsgToSendByImei(p_imei IN VARCHAR2, p_message IN OUT VARCHAR2, p_msg_id IN OUT NUMBER);
procedure setStatus(p_msg_id IN NUMBER, p_status IN VARCHAR2);
procedure cancel_scheduled_actions;
procedure cancel_scheduled_actions(p_msg_id IN number);
end;
/
create or replace PACKAGE BODY "P_COUNTRY_PLATS" is
procedure createNew (p_msisdn IN lopes.country_plats.recipient_msisdn%TYPE
,p_channel IN lopes.country_plats.channel%TYPE
,p_message IN lopes.country_plats.message%TYPE
)
is
begin
createNew(p_msisdn, p_channel, p_message, sysdate, null, null);
end;
procedure createNew (p_msisdn IN lopes.country_plats.recipient_msisdn%TYPE
,p_channel IN lopes.country_plats.channel%TYPE
,p_message IN lopes.country_plats.message%TYPE
,p_request_date IN lopes.country_plats.request_date%TYPE
,p_action_history_id IN lopes.country_plats.action_history_id%TYPE
)
is
begin
createNew(p_msisdn, p_channel, p_message, p_request_date, p_action_history_id, null);
end;
procedure createNew (p_msisdn IN lopes.country_plats.recipient_msisdn%TYPE
,p_channel IN lopes.country_plats.channel%TYPE
,p_message IN lopes.country_plats.message%TYPE
,p_request_date IN lopes.country_plats.request_date%TYPE
,p_action_history_id IN lopes.country_plats.action_history_id%TYPE ,
p_ac_scheduled_action_id IN lopes.country_plats.ac_scheduled_action_id%TYPE
)
is
PsdRetryNbroutgoing_psd number;
begin
PsdRetryNbr := of_owner.p_ru.getPsdRetryNbr(p_msisdn);
of_owner.p_db_trc.trc(1007, '-'||p_channel||'-'||p_msisdn||'-'||p_message||'-'||p_request_date||'-'||p_action_history_id||'-'||p_ac_scheduled_action_id||'-'||PsdRetryNbr);
insert into lopes.country_plats
(country_plats_id,channel,recipient_msisdn,message,request_date,status,action_history_id, ac_scheduled_action_id, remaining_retry_nbr) values (
lopes.SEQ_COUNTRY_PLATS_ID.nextval
,p_channel
,p_msisdn
,p_message
, p_request_date
,'R'
,p_action_history_id
,p_ac_scheduled_action_id
,PsdRetryNbr
);
end;
procedure getNextMsgToSend(p_channel IN lopes.country_plats.channel%TYPE
,p_ip_address IN OUT VARCHAR2
,p_message IN OUT lopes.country_plats.message%TYPE
,p_msg_id IN OUT lopes.country_plats.country_plats_id%TYPE
)
is
begin
select op.country_plats_id, op.message, of_owner.p_ru.getRemoteUnitCurrentIP(recipient_msisdn)
into p_msg_id, p_message, p_ip_address
from lopes.country_plats op
where ( (op.status ='R')
or ( (op.status = 'P')
and (op.outgoing_date+(of_owner.p_ru.getPsdRetryDelay(op.recipient_msisdn)/(60*24)) <= sysdate)
)
)
and rownum=1
order by request_date asc;
update lopes.country_plats
set outgoing_date = sysdate
, status = decode(remaining_retry_nbr, 0, 'F', 'P')
, remaining_retry_nbr = remaining_retry_nbr-1
where country_plats_id = p_msg_id;
exception when no_data_found then
p_msg_id := -1;
p_ip_address:= '';
p_message := '';
end;
procedure getNextMsgToSendByImei(p_imei IN VARCHAR2,
p_message IN OUT VARCHAR2,
p_msg_id IN OUT NUMBER
) is
p_vehicle_id number(10);
p_msisdn varchar2(50);
begin
p_msg_id := -1;
p_message := '';
select msisdn, vehicle_id
into p_msisdn, p_vehicle_id
from of_owner.remote_unit, of_owner.vehicle
where remote_unit.imei = p_imei
and remote_unit.remote_unit_id = vehicle.remote_unit_id(+);
begin
select op.country_plats_id, op.message
into p_msg_id, p_message
from lopes.country_plats op
where ( (op.status ='R')
or ( (op.status = 'P')
and (op.outgoing_date+(of_owner.p_ru.getPsdRetryDelay(op.recipient_msisdn)/(60*24)) <= sysdate)
)
)
and op.recipient_msisdn = p_msisdn
and rownum=1
order by request_date asc;
update lopes.country_plats
set outgoing_date = sysdate
, status = decode(remaining_retry_nbr, 0, 'F', 'P')
, remaining_retry_nbr = remaining_retry_nbr-1
where country_plats_id = p_msg_id;
exception when others then
null;
end;
-- Check if garmin message to send
if (p_msg_id=-1) and (p_vehicle_id is not null) then
p_msg_id := of_owner.p_gu_message.getNextMessageToSend(p_vehicle_id, p_message);
if (p_msg_id is null) then
p_msg_id:=-1;
end if;
end if;
exception when no_data_found then
p_msg_id := -1;
p_message := '';
end;
procedure setStatus(p_msg_id IN NUMBER, p_status IN VARCHAR2)
is
begin
update lopes.country_plats
set status = decode(p_status, 'S', 'S', decode(remaining_retry_nbr, 0, 'F', 'P'))
where country_plats_id = p_msg_id;
end;
procedure cancel_scheduled_actions is
begin
delete from lopes.country_plats
where status = 'R'
and ac_scheduled_action_id is not null;
end;
procedure cancel_scheduled_actions(p_msg_id IN number) is
begin
delete from lopes.country_plats
where country_plats_id = p_msg_id;
end;
end P_COUNTRY_PLATS;
/
/
в новую строку после оператораEND;
, завершающего спецификацию пакета. Затем в конце тела пакета измените его наend PLATS;
и поместите еще один/
на следующую новую строку. - person MT0   schedule 13.10.2017