gpt4 book ai didi

sql - 找出 PL/SQL 脚本在等待什么

转载 作者:行者123 更新时间:2023-12-04 14:13:55 25 4
gpt4 key购买 nike

假设用户正在运行一个由 2000 行组成的巨大 PL/SQL 脚本,其中某处有一个语句正在“等待”某些条件变为真。为此,使用了像这个例子这样的结构:

BEGIN

--Wail until 2 o clock
WHILE (to_date('06-01-2014 02:00','dd-mm-yyyy hh24:mi') > sysdate)
LOOP
DBMS_LOCK.SLEEP(60);
END LOOP;

--code to execute after 2 o clock

END;

现在脚本里有好几个这样的构造,而且脚本好像一直在运行,所以用户问我在哪里。困难在于我可以在动态性能 View 中看到它正在运行,例如使用此查询:

SELECT S.USERNAME,
s.sid,
s.osuser,
t.sql_id,
sql_text
FROM v$sqltext_with_newlines t,
V$SESSION s
WHERE t.address =s.sql_address
AND t.hash_value = s.sql_hash_value
AND s.status = 'ACTIVE'
AND s.username <> 'SYSTEM'
ORDER BY s.sid,
t.piece;

但这将返回整个脚本,而不是它当前所在的语句。有什么办法可以解决这个问题吗?

最佳答案

我不知道有什么方法可以获取 PL/SQL 程序的当前执行行。

但您可以在 sleep 语句之前使用 dbms_application_info.set_module/set_action,它将在 v$session.module/action 列中可见。

SQL> select sys_context('USERENV', 'SID') from dual;

SYS_CONTEXT('USERENV','SID')
--------------------------------------------------------------------------------
273


SQL> exec dbms_application_info.set_module('My program', 'Waiting for the hell to freeze');

PL/SQL procedure successfully completed.


SQL> exec dbms_lock.sleep(60);

....

在另一个 session 中:

SQL> select sid, module, action from v$session where sid = 273;

SID MODULE ACTION
---------- ---------------------- ----------------------------------
273 My program Waiting for the hell to freeze

关于sql - 找出 PL/SQL 脚本在等待什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20947451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com