使用 V$_SESSION_LONGOPS 需要设置 TIMED_STATISTICS=true 或 SQL_TRACE=true。您的数据库模式必须被授予 ALTER SESSION 系统权限才能这样做。
我曾经尝试将 V$_SESSION_LONGOPS 用于复杂且长时间运行的查询。但事实证明 V$_SESSION_LONGOPS 可能会显示部分查询的进度,例如全表扫描、连接操作等。
另见:http ://www.dba-oracle.com/t_v_dollar_session_longops.htm
您可以做的只是向用户显示“查询仍在运行”。我实现了一个<DIV>
嵌套到 a<TD>
中,随着浏览器发送的每个状态请求而变得更长。状态请求由window.SetTimeout
(每 3 秒)发起,是对服务器端过程的 AJAX 调用。服务器端过程返回的状态报告只是说“我们仍在运行”。进度条的宽度(即<DIV>
' 的宽度)<TD>
每次以 s 宽度的 5% 递增,显示 100% 后重置为 5%。
对于长时间运行的查询,您可能会在单独的表中跟踪它们所花费的时间,可能带有用于不同 where 子句的单独条目。您可以使用它在客户端对话框中显示平均时间加上刚刚过去的时间。
如果您在服务器端有一个长时间运行的 PL/SQL 过程或类似的程序执行几个步骤,请尝试以下操作:
- 为状态消息创建表
- 为用户启动的任何进程使用唯一键。建议:客户端的javascript日期(以毫秒为单位)+会话ID。
- 如果要通过浏览器窗口中的链接启动长时间运行的过程,请使用 DBMS_JOB.SUBMIT 创建一个作业来运行该过程,而不是直接运行该过程
- 使用 PRAGMA AUTONOMOUS_TRANSACTION 编写一个更新状态表的简短过程。此 pragma 允许您提交对状态表的更新,而无需提交主过程的更新。主过程的每个主要步骤都应在此状态表中具有自己的条目。
- 编写程序查询浏览器调用的状态表
- 如果用户单击“取消”或关闭窗口,则编写一个由 AJAX 调用调用的过程
- 编写一个在每个步骤完成后由主过程调用的过程:它查询状态表并引发异常,如果设置了取消标志或浏览器没有查询状态,则为 20,000 秒,例如, 60 秒。在主过程的异常处理程序中查找此错误,执行回滚并更新状态表。