让我们说一个用户正在运行一个巨大的PL/SQL脚本,由2000行组成,在那里的某个地方,有一个声明"等待"某些条件变为真.为此,使用了像这个例子的结构:
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;
现在脚本中有几种这样的构造,脚本似乎永远在运行,所以用户问我它在哪里.困难在于我可以在动态性能视图中看到它正在运行,例如使用此查询:
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程序行.
但是你可以dbms_application_info.set_module/set_action
在sleep语句之前使用它,它将在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); ....
在另一场会议中:
SQL> select sid, module, action from v$session where sid = 273; SID MODULE ACTION ---------- ---------------------- ---------------------------------- 273 My program Waiting for the hell to freeze