在使用语句创建包体的时候提示如下:
Warning: Package body created with compilation errors具体的代码太多,无法详细列出请原谅,请问,这个错误时如何产生的!还有:如何在sqlplus中调用这个包体内的函数?求解:!
Warning: Package body created with compilation errors具体的代码太多,无法详细列出请原谅,请问,这个错误时如何产生的!还有:如何在sqlplus中调用这个包体内的函数?求解:!
解决方案 »
- oracle 11.2.0 $emca -config dbcontrol db -repos create; 报错
- 什么是oracle企业管理器的独立部署模式和分布式部署模式?
- nested loop join 、hash join 问题
- 急求助大侠:oracle 中的事务处理的小问题,先谢过了.....
- 问一个低级的JS问题
- [求助] oracle 自动关闭,在线等,急!!!
- job问题?
- Oracle中select 语句有partition 和 subpartition是做什么用的 有没有例子语句?
- 10G菜鸟找不到像9I的控制台,不知道在那儿可以看到.
- 关于数据库启动pfile的问题。
- 怎么解决IBM3850 x5/4*8核16线程CUP/64G内存/win2003 x64/安装oracle10g x64创建数据库时进度条不动
- 求救!求救!!! 跪求各位帮忙~ 急需啊!
错误如何产生的,得根据你的错误提示信息来看。。
包体内的函数:
包名.函数名 就行
-- 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;
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
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;
而且,我创建完包之后再plussql里面怎么调用啊,是使用select 包名.函数名(参数列表) from dual;来调用么?在proc程序里面应该怎么调用?
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;
这里面时就出现错误,不知道是什么原因!