在使用语句创建包体的时候提示如下:
Warning: Package body created with compilation errors具体的代码太多,无法详细列出请原谅,请问,这个错误时如何产生的!还有:如何在sqlplus中调用这个包体内的函数?求解:!

解决方案 »

  1.   

    你执行一个show errors看看有啥错误啊
    错误如何产生的,得根据你的错误提示信息来看。。
    包体内的函数:
    包名.函数名 就行
      

  2.   

    create or replace package pkg_app_lock is
       
      -- Author  : F46167
      -- Created : 2011/12/2 14:58:31
      -- Purpose : test lock  -- Public constant declarations
      --PrimaryHost constant varchar2(64) := '10.164.134.136'; --主节点
      -- WaitTimeOut constant number := 20; --超时时间定义,单位分钟
      
      StatusFAILED constant number := 0; --请求加锁失败
      StatusOK constant number := 1;     --请求加锁成功
      StatusWAIT constant number := 2;   --请求加锁成功,但需要等待当前持有者释放
      
      
      -- Public variable declarations  -- Public function and procedure declarations
      --PrimaryHost:主节点,WaitTimeOut:超时时间定义,单位秒
      function F_GetAppLock(AppName varchar2,PrimaryHost varchar2,WaitTimeOut number)  return number;end pkg_app_lock;
      

  3.   

    create or replace package body pkg_app_lock is  -- Function and procedure implementations
      function F_GetAppLock(AppName varchar2,PrimaryHost varchar2,WaitTimeOut number) return number is
        HostHasLock Varchar2(4000); --当前持有锁的节点
        TimeHasLock Date;           --当前持有锁的节点获得锁的时间
        TimeWaitLock Date;          --抢占锁等待时间
        LockStatus  number;    --锁的状态 1:正常 2:抢占
      
        v_host   varchar2(64);      --前来申请锁的节点
        v_time   number;            --当前时间与上次申请锁时间的时间差,单位秒
        v_waittime   number;            --当前时间与上次申请锁时间的时间差,单位秒
        v_status number;       --返回申请结果:0--请求加锁失败,1--请求加锁成功,2--请求加锁成功,但需要等待当前持有者释放
      
        v_retcode number;           --返回值
      begin
        --grant execute,debug on sys.dbms_pipe to public;
        --从PIPE中取相关信息
        v_retcode := dbms_pipe.receive_message(AppName, 10);
      
        if v_retcode = 0 then
          dbms_pipe.unpack_message(HostHasLock);
          dbms_pipe.unpack_message(TimeHasLock);
          dbms_pipe.unpack_message(TimeWaitLock);
          dbms_pipe.unpack_message(LockStatus);
        else
          --对获得锁的时间进行初始化
          TimeHasLock := trunc(sysdate - 1);
          LockStatus  := '0';
          v_retcode   := dbms_pipe.create_pipe('ANDY_LOCK', 8192, true);
          if v_retcode != 0 then
            return StatusFAILED;
          end if;
        end if;
      
        --取节点IP地址
        select SYS_CONTEXT('USERENV','IP_ADDRESS') into v_host from dual;
        
        if v_host = PrimaryHost then 
          --主节点前来申请锁
          if (v_host = HostHasLock AND LockStatus != StatusWAIT) then 
            --当前主节点持有锁
            HostHasLock := v_host;
            TimeHasLock := sysdate;
            TimeWaitLock := sysdate;
            LockStatus  := StatusOK;
            v_status    := StatusOK;
          else
            --1天为86400秒,提前算好减少CPU计算
            v_time := (sysdate - TimeHasLock) * 86400;
            v_waittime := (sysdate - TimeWaitLock) * 86400;
            
            --当前其他节点持有锁或者主节点正在抢占锁
            if v_time >= WaitTimeOut OR v_waittime >= WaitTimeOut then
              --当前锁已经过期或者抢占锁等待时间已过
              HostHasLock := v_host;
              TimeHasLock := sysdate;
              TimeWaitLock := sysdate;
              LockStatus  := StatusOK;
              v_status    := StatusOK;
            else
      

  4.   

    if HostHasLock != v_host then
                HostHasLock := v_host;
              end if;
              if LockStatus!=StatusWAIT then
                TimeWaitLock := sysdate;
              end if;
              LockStatus := StatusWAIT;
              v_status   := StatusWAIT;
              TimeHasLock := sysdate;
            end if;
          
          end if;
        elsif v_host = HostHasLock then
          --持有锁的节点前来申请
          TimeHasLock := sysdate;
          TimeWaitLock := sysdate;
          LockStatus  := StatusOK;
          v_status    := StatusOK;
        elsif HostHasLock is null OR v_time >= WaitTimeOut then
          --当前没有节点持有锁或者之前持有的锁已经失效
          HostHasLock := v_host;
          TimeHasLock := sysdate;
          TimeWaitLock := sysdate;
          LockStatus  := StatusOK;
          v_status    := StatusOK;
        else
          v_status := StatusFAILED;
        end if;
      
        --将相关信息放入PIPE
        dbms_pipe.purge(AppName);
        dbms_pipe.pack_message(HostHasLock);
        dbms_pipe.pack_message(TimeHasLock);
        dbms_pipe.pack_message(TimeWaitLock);
        dbms_pipe.pack_message(LockStatus);
        v_retcode := dbms_pipe.send_message(AppName);
        if v_retcode != 0 then
          v_status := StatusFAILED;
        end if;
      
        --dbms_output.put_line('host:' || v_host || ',PrimaryHost:' || PrimaryHost ||',HostHasLock:' || HostHasLock || '|' ||to_char(TimeHasLock, 'YYYY-MM-DD HH24:MI:SS') || '|' ||v_status);
               
        return(v_status);
      end;begin
      -- Initialization
      null;
    end pkg_app_lock;
      

  5.   

    我用plussql执行的,没有错误的提示信息,只有一个warning信息,信息是:Warning: Package body created with compilation errors
    而且,我创建完包之后再plussql里面怎么调用啊,是使用select 包名.函数名(参数列表) from dual;来调用么?在proc程序里面应该怎么调用?
      

  6.   

    可以详细的说明不?可以使用dbms_output.putline,我逐渐添加的,发现当使用到:
    create or replace function z_F_GetAppLock(AppName varchar2,PrimaryHost varchar2,WaitTimeOut number) return number is
        HostHasLock Varchar2(4000); --当前持有锁的节点
        TimeHasLock Date;           --当前持有锁的节点获得锁的时间
        TimeWaitLock Date;          --抢占锁等待时间
        LockStatus  number;    --锁的状态 1:正常 2:抢占
      
        v_host   varchar2(64);      --前来申请锁的节点
        v_time   number;            --当前时间与上次申请锁时间的时间差,单位秒
        v_waittime   number;            --当前时间与上次申请锁时间的时间差,单位秒
        v_status number;       --返回申请结果:0--请求加锁失败,1--请求加锁成功,2--请求加锁成功,但需要等待当前持有者释放
      
        v_retcode number;           --返回值
    begin
    v_retcode := dbms_pipe.receive_message(AppName, 10);return v_retcode;
    end z_F_GetAppLock;
    这里面时就出现错误,不知道是什么原因!