找出PL/SQL脚本正在等待的内容

 书友71794607 发布于 2023-02-06 12:24

让我们说一个用户正在运行一个巨大的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;

但这将返回整个脚本,而不是它当前的声明.有没有办法解决这个问题?

1 个回答
  • 我不知道有什么方法可以获得当前正在执行的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
    

    2023-02-06 12:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有