【问题标题】:Error(3,34): PLS-00201: identifier XXX must be declared错误(3,34):PLS-00201:必须声明标识符 XXX
【发布时间】:2018-03-25 12:43:23
【问题描述】:

我在 Oracle Database 12c 企业版版本 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; 并在下面的换行符上放另一个 /
  • 嗯?标题:Error(3,34): PLS-00201: identifier XXX must be declared 在消息正文中:Error(1,35): PLS-00304: cannot compile body of 'P_COUNTRY_PLATS ' 没有它的规范。不同的错误代码(201 与 304),不同的错误消息 - 显然这两个错误的性质不同,在代码中的位置不同(第 3 行,位置 34 与第 1 行,位置 35)。所以:它是哪个?这是怎么发生的? (“这”是指您发布关于一个错误的消息,如正文中所述,并给出一个完全不同的错误的标题。)
  • @en Lopes - 那么我们应该解决哪一个 - PL-00201 或 PLS-00304 ?

标签: sql database oracle plsql oracle12c


【解决方案1】:

/ 字符是 PL/SQL 块的终止符,您的脚本缺少它们。

变化:

end;


create or replace PACKAGE BODY                     "P_COUNTRY_PLATS" is

收件人:

end;
/

create or replace PACKAGE BODY                     "P_COUNTRY_PLATS" is

并更改决赛:

end;PLATS

到:

end P_COUNTRY_PLATS;
/

【讨论】:

  • 你注意到这个人的头衔和邮件正文不匹配了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-17
相关资源
最近更新 更多