Chinaunix

标题: 如何查看某个存储过程当前是否在运行? [打印本页]

作者: TOADLover    时间: 2009-09-03 09:07
标题: 如何查看某个存储过程当前是否在运行?
--------------
我的目的是:先查看p_insert_tbl这个存储过程是否在被运行,如果正在被运行,我就不手工地execute p_insert_tbl了。
--------------
如何查看某个存储过程当前是否在运行
--------------
ILoveMK提到:

SELECT DISTINCT '(' || s.sid || ') - ' || username AS "(session) - username"
FROM V$SESSION s, sys.x$kglob o, sys.x$kglpn p
WHERE upper(o.kglnaobj) LIKE upper('%你的存储过程名字%')
AND p.kglpnhdl = o.kglhdadr
AND s.SADDR = p.kglpnuse;

用上面语句查看库高速缓存中pin住的存储过程
-----------------
但是我没有sys用户权限,有没有其他方法

[ 本帖最后由 TOADLover 于 2009-9-3 09:44 编辑 ]
作者: ILoveMK    时间: 2009-09-03 09:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: TOADLover    时间: 2009-09-03 09:15
没有sys用户权限,怎么查看某个存储过程是否在运行中。。。

[ 本帖最后由 TOADLover 于 2009-9-3 09:20 编辑 ]
作者: ziggler    时间: 2009-09-03 09:17
标题: 回复 #2 TOADLover 的帖子
http://topic.csdn.net/t/20031204/18/2528198.html
作者: TOADLover    时间: 2009-09-03 09:43
没有sys用户权限,怎么查看某个存储过程是否在运行中。。。?
作者: ILoveMK    时间: 2009-09-03 09:45
提示: 作者被禁止或删除 内容自动屏蔽
作者: TOADLover    时间: 2009-09-03 09:48
@ILoveMK,

在吗?
我如何得到这个视图的权限?
-------------------------------------------


[ 本帖最后由 TOADLover 于 2009-9-3 09:49 编辑 ]
作者: ILoveMK    时间: 2009-09-03 09:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: TOADLover    时间: 2009-09-03 09:52
标题: 回复 #5 ILoveMK 的帖子
我的意思是:
-----------------------
我是一个普通用户a_user,我怎么知道p_insert_tbl这个存储过程的当前状态是在执行中呢?
p_insert_tbl这个存储过程要执行15分钟左右!!!
-----------------------
p_insert_tbl这个存储过程是我(a_user)创建的!
但是其他同事也有这个a_user的账号密码,也有可能正在手工地运行a_user的p_insert_tbl这个存储过程
-----------------------
所以,我想在运行之前先查看一下p_insert_tbl的状态,如果是在运行中,我就不运行它了

[ 本帖最后由 TOADLover 于 2009-9-3 10:04 编辑 ]
作者: ILoveMK    时间: 2009-09-03 09:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: ILoveMK    时间: 2009-09-03 09:55
提示: 作者被禁止或删除 内容自动屏蔽
作者: TOADLover    时间: 2009-09-03 09:59
标题: 回复 #9 ILoveMK 的帖子
嗯,这个方案听起来不错,我试试!
---------------------------------------
可是我在我自己的笔记本上测试时,用sys用户在我的测试库(我有sys权限)中测试,显示的结果是:
---------------------------------------
SELECT DISTINCT '(' || s.sid || ') - ' || username AS "(session) - username"
           FROM V$SESSION s, sys.x$kglob o, sys.x$kglpn p
                           WHERE upper(o.kglnaobj) LIKE upper('%p_insert_tbl%')
                                  AND p.kglpnhdl = o.kglhdadr
                                            AND s.SADDR = p.kglpnuse;       
---------------------------------------
(144) - SYS
作者: ziggler    时间: 2009-09-03 10:08
标题: 回复 #8 TOADLover 的帖子
可以写日志吗?
作者: TOADLover    时间: 2009-09-03 10:09
不对!!!!!!!!!!!!!!!!!!!!!!!!!!!
--------------------------------------------------------------------
换一个思路,假设我有sys用户的权限,我怎么知道p_insert_tbl这个存储过程的状态,是不是在被执行中??????
作者: ILoveMK    时间: 2009-09-03 10:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: TOADLover    时间: 2009-09-03 10:12
标题: 回复 #12 ziggler 的帖子
嗯,可以,我可以在存储过程开始时向某个table中写一个值,运行结束后再向这个table中写值。
----------------
在运行该存储过程时,先查询这张表,从而得知该存储过程的状态是否在运行中。
----------------
这的确是一个解决方案。
---------------------------------------------
ILoveMK的那个,好像却是我最初遇到这个问题时,心里想的。
ILoveMK的方案不会改动到p_insert_tbl存储过程本身,这个好像很重要的!!!!!

[ 本帖最后由 TOADLover 于 2009-9-3 10:22 编辑 ]
作者: TOADLover    时间: 2009-09-03 10:13
标题: 回复 #14 ILoveMK 的帖子
我是觉得,这个结果,没有显示出我的存储过程p_insert_tbl的状态啊?????
作者: TOADLover    时间: 2009-09-03 10:26
有人跟我有相同的问题,但好像都没有答案:
1. http://www.oracle.com.cn/viewthread.php?tid=34658
2. http://www.itpub.net/viewthread.php?tid=334164&page=1
作者: ILoveMK    时间: 2009-09-03 10:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: TOADLover    时间: 2009-09-03 11:21
原帖由 ILoveMK 于 2009-9-3 10:34 发表

其实没必要研究那么深的,不过x$kglpn的KGLPNMOD字段为2时就代表存储过程在执行。

-------------------------------------------------------------------------------------------------------------------
x$kglpn的KGLPNMOD字段为2时就代表存储过程在执行????????????

select p.KGLPNMOD
           from x$kglob o, x$kglpn p
                           where o.kglhdadr = p.kglpnhdl
                                  and upper(o.kglnaobj) like upper('%p_insert_tbl%');
-----
2
--------------------------------------------------------------------------------------------------------------------
不过我十分肯定地说,p_insert_tbl这个存储过程肯定没有在运行中,因为,我是在自己笔记本上的虚拟机上做测试,我只是启动了数据库而已,绝对没有运行这个存储过程!!!
作者: ILoveMK    时间: 2009-09-03 11:28
提示: 作者被禁止或删除 内容自动屏蔽
作者: TOADLover    时间: 2009-09-03 11:32
标题: 回复 #20 ILoveMK 的帖子
截图:
我是以sys用户执行你给出的sql语句的(19楼也是以sys用户),p_insert_tbl存储过程是由a_user创建的,不过没有job之类的东西,这个存储过程现在肯定不在运行状态。
-----------
select p.KGLPNMOD,o.kglhdnsp
           from x$kglob o, x$kglpn p
                           where o.kglhdadr = p.kglpnhdl
                                  and upper(o.kglnaobj) like upper('%p_insert_tbl%');
------------
所以可以说:
在同样情况下运行下面这条,把结果贴出来
------------
是保证在“同样的情况下”的!

-----------------
嗯,我要说明的是p_insert_tbl是a_user这个用户创建的,sys应该对它没有执行权限吧?
--反正我以sys用户登录后,在Procedures中找不到这个p_insert_tbl
--这会对你的sql语句的结果产生影响吗?

[ 本帖最后由 TOADLover 于 2009-9-3 11:41 编辑 ]
作者: TOADLover    时间: 2009-09-03 12:47
标题: 回复 #22 ILoveMK 的帖子
select p.KGLPNMOD,o.kglhdnsp
           from x$kglob o, x$kglpn p
                           where o.kglhdadr = p.kglpnhdl
                 and p.KGLPNMOD=1
                                      and upper(o.kglnaobj) like upper('%p_insert_tbl%');
-----------------------
显示为空
-----------------------
当我开一个TOAD以a_user执行该存储过程,执行持续时间长达10分钟,在此期间,另开一个TOAD执行上面的sql语句显示结果为空,什么都没显示!
-----------------------------


[ 本帖最后由 TOADLover 于 2009-9-3 12:50 编辑 ]
作者: TOADLover    时间: 2009-09-03 12:56
还有哪位高手有知道怎么查询某个存储过程的执行状态?是否在运行中?
作者: TOADLover    时间: 2009-09-03 12:57
我坚决要把这个问题弄个清楚!
一定。。。。。。
--------------------------------------------
算了。。。。。。。。。。
查不出,一个存储过程一旦开始运行,oracle就查不出它的运行状态了。。。。。。。。。。。
oracle的存储过程好像只有"运行"一个功能,没有记录自己的状态,运行完了,也不知道,没有开始运行,也不知道。。。。。

[ 本帖最后由 TOADLover 于 2009-9-3 13:15 编辑 ]
作者: TOADLover    时间: 2009-09-03 12:58
算了,我觉得不行,应该是查不出的。
------------------
死了这条心了。。。。。。。。。。。。。

[ 本帖最后由 TOADLover 于 2009-9-3 13:12 编辑 ]
作者: y2k_connect    时间: 2009-09-08 03:25
这样可以吗?

以排队等候方式,独占p_insert_tbl存储过程。
1。新建一个所有用户都可以读写的表list。
2。如果有一个用户需要执行p_insert_tbl时,先向表list尾端添加1条记录。内容为自身的一些信息。
3。如果表list的第一条记录,是该用户的,修改第一条记录的某个字段,表示p_insert_tbl存储过程正在执行中。然后执行p_insert_tbl存储过程。完成执行后,将该记录删除。
4。如果表list的第一条记录,不是该用户的,暂停1分钟。(p_insert_tbl存储过程每次需要运行十几分钟)然后循环检查,直到表list的第一条记录,是该用户的为止。最后,执行第3步。

由于所有用户都可以读写的表list,因此能够随时检查是那个用户、进程在执行p_insert_tbl存储过程。或者没人执行。
如果能够用事件唤醒机制,会更好。

-------------------------------------------------------------
如果p_insert_tbl存储过程每天仅执行一次,添加记录时,需要带上当天的时间标记。
所有用户在执行之前需要检索表list,当天是否已经执行,或正在执行。

[ 本帖最后由 y2k_connect 于 2009-9-8 03:31 编辑 ]
作者: TOADLover    时间: 2009-09-08 08:21
这样可以吗?

以排队等候方式,独占p_insert_tbl存储过程。
1。新建一个所有用户都可以读写的表list。
2。如果有一个用户需要执行p_insert_tbl时,先向表list尾端添加1条记录。内容为自身的一些信息。
3。如果表list的第一条记录,是该用户的,修改第一条记录的某个字段,表示p_insert_tbl存储过程正在执行中。然后执行p_insert_tbl存储过程。完成执行后,将该记录删除。
4。如果表list的第一条记录,不是该用户的,暂停1分钟。(p_insert_tbl存储过程每次需要运行十几分钟)然后循环检查,直到表list的第一条记录,是该用户的为止。最后,执行第3步。

由于所有用户都可以读写的表list,因此能够随时检查是那个用户、进程在执行p_insert_tbl存储过程。或者没人执行。
如果能够用事件唤醒机制,会更好。

-------------------------------------------------------------
如果p_insert_tbl存储过程每天仅执行一次,添加记录时,需要带上当天的时间标记。
所有用户在执行之前需要检索表list,当天是否已经执行,或正在执行。

++++++++++++++++++++++++++++++++++++++++++++++++++++++
这个应该可以,我试试之后,把结果贴出来
作者: liangfeilongzso    时间: 2009-11-12 09:45
select sid,v$session.username 用户名,last_call_et 持续时间,status 状态,LOCKWAIT 等待锁,machine 用户电脑名,logon_time 开始登入时间,sql_text from v$session ,v$process ,v$sqlarea
            where paddr=addr and sql_hash_value=hash_value
            and v$session.username is not null
            order by last_call_et desc




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2