创建存储过程出错

[复制链接]
查看11 | 回复9 | 2005-11-2 13:35:57 | 显示全部楼层 |阅读模式
我在创建一个存储过程时出错,执行create or replace procedure时大半天没反应,最后提示我"等待锁定对象procedurename时发生超时",请问高手存储过程也有像表那样锁的概念吗,我如何查询,如何解锁?
回复

使用道具 举报

千问 | 2005-11-2 13:35:57 | 显示全部楼层
你会不会是别人在使用这个procedure,然后你这边又在创建吧??
回复

使用道具 举报

千问 | 2005-11-2 13:35:57 | 显示全部楼层
设计了一个试验,更改正在执行的过程时可能会出现超时错误(如果过程执行时间足够长的话)。
不清楚超时的定义在哪里。
SQL> create procedure sp_t as
2begin
3dbms_lock.sleep(60*60);
4end;
5/
Procedure created.
SQL> var l_job number
SQL> exec dbms_job.submit(:l_job,'sp_t;');
PL/SQL procedure successfully completed.
SQL> commit;
Commit complete.
SQL> column what format a50
SQL> select job,what from user_jobs;
JOB WHAT
---------- --------------------------------------------------
5 sp_t;
SQL> select job,failures from dba_jobs_running;
JOB FAILURES
---------- ----------
5
SQL> create or replace procedure sp_t as begin null; end;
2/
create or replace procedure sp_t as begin null; end;
*
ERROR at line 1:
ORA-04021: timeout occurred while waiting to lock object WYQ.SP_T
回复

使用道具 举报

千问 | 2005-11-2 13:35:57 | 显示全部楼层
过程正在被调用;
回复

使用道具 举报

千问 | 2005-11-2 13:35:57 | 显示全部楼层
不可能有人在用的,我新建的过程,没人知道它是做什么的,既使有人用也不会用这么久吧,我试了一下午,上午刚开始的时候还是可以的
回复

使用道具 举报

千问 | 2005-11-2 13:35:57 | 显示全部楼层
要不就是可能有别的程序在调用
回复

使用道具 举报

千问 | 2005-11-2 13:35:57 | 显示全部楼层
估计刚开始测试过程没测试完,这样过程里锁住的对象没有释放锁。
回复

使用道具 举报

千问 | 2005-11-2 13:35:57 | 显示全部楼层
那我怎么查看是否被锁呢,怎么解锁?
回复

使用道具 举报

千问 | 2005-11-2 13:35:57 | 显示全部楼层
查用户
select Lo.session_id, Lo.oracle_username, Lo.os_user_name
from v$locked_object Lo, dba_objects ob
where Lo.object_id = ob.object_id
and ob.owner = 'YOUR_ORACLE_NAME'
and ob.object_name + 'YOUR_PROCEDURE'
;
解锁的话,首先查 sid,serial#
select s.sid, s.serial# -- 和其它确认字段...
from v$session s, v$locked_object Lo, dba_objects ob
where s.sid = Lo.session_id
and Lo.object_id = ob.object_id
and ob.owner = 'YOUR_ORACLE_NAME'
and ob.object_name + 'YOUR_PROCEDURE'
;
结果的例子
SIDSERIAL#
---------- ----------
3917220

以后,用 kill session
alter system kill session 39,17220;
回复

使用道具 举报

千问 | 2005-11-2 13:35:57 | 显示全部楼层
上面的脚本得出的查询中不包括正在运行的过程:
SQL> select job from dba_jobs_running;
JOB
----------
4
3
1
2
5
21
6 rows selected.
SQL>
SQL> select Lo.session_id, Lo.oracle_username, Lo.os_user_name
2from v$locked_object Lo, dba_objects ob
3where Lo.object_id = ob.object_id
4/
no rows selected
SQL> select job from dba_jobs_running;
JOB
----------
4
3
1
2
5
21
6 rows selected.
SQL>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行