Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
了解PL/SQL脚本正在等待什么_Sql_Oracle_Plsql - Fatal编程技术网

了解PL/SQL脚本正在等待什么

了解PL/SQL脚本正在等待什么,sql,oracle,plsql,Sql,Oracle,Plsql,假设一个用户正在运行一个巨大的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

假设一个用户正在运行一个巨大的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程序当前正在执行的行

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

在另一届会议上:

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

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

@Kombajn zbożowy建议的是在运行时跟踪plsql执行的最佳方法——如果您为此做好准备并在脚本中设置调用的话

如果您遇到无法使用dbms\u应用程序\u信息的代码:

v$session有几个有用的列

v$session.sql\u id将为您提供当前正在运行的sql语句- 即使在plsql块中执行

v$session.event-提供等待事件。我认为 dbms_锁被认为是您自己的空闲检查

v$session.ROW\u WAIT\u OBJ是对象id 等待事件中当前对象的dba_objects.object_id

v$活动会话\信息-v$会话的快照。你可以追溯到 自给定时间以来的会话,并查询上述列。
还有一件事,不要每60秒循环一次,检查日期是否已过——计算到所需时间的秒数并等待是否更简单?

Oracle允许您逐步检查代码:我建议使用Oracle的调度系统来处理这类事情。
SQL> select sid, module, action from v$session where sid = 273;

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