【问题标题】:Oracle SQL select statement which "sleeps"? Plain SQL? [duplicate]Oracle SQL select 语句哪个“休眠”?普通的 SQL? [复制]
【发布时间】:2016-10-17 13:15:48
【问题描述】:

我用“Groovy-SQL”(=Java JDBC Wrapper)编写了一个通用的 SQL 选择语句执行器。它有一个超时功能。

为了在自动化集成测试中测试超时功能,我想发出一个 SQL 选择,例如

SELECT sleep(10) from DUAL;

应该运行 10 秒然后返回。喜欢MySql的http://dev.mysql.com/doc/refman/5.6/en/miscellaneous-functions.html#function_sleep

Oracle 中是否也有类似的东西来模拟“长时间运行”的查询?我想要一个普通 SQL 查询,没有任何 PL/SQL 或像 Sleep function in ORACLE 讨论中那样的特殊授权。

【问题讨论】:

  • 我能想到一件可怕的事情:尝试找到一个触发灾难性回溯的正则表达式并将其用于REGEXP_LIKE。您将无法调节超时,如果您成功了,您的 DBA 会讨厌您,但它仅是 SQL...
  • 非常丑陋但非常酷的想法@JeroenMostert!
  • 请,不要在生产系统上使用它。由此产生的 CPU 峰值不会很漂亮。 (我假设 Oracle 有办法解决失控线程,但我没有经验。)
  • 当然,@JeroenMostert。我会在测试实例上发出它并在假设 1 秒后中止该语句。这里有趣的部分是 Oracle 是否可以在内部真正杀死(中断)缓慢的正则表达式。

标签: sql oracle


【解决方案1】:

使用dbms_lock.sleep()

begin
   dbms_lock.sleep(10);
end;

如果您将整个 PL/SQL 块作为单个字符串传递,则可以执行 JDBC:

String sleep = "begin dbms_lock.sleep(10); end;";
Statement stmt = connection.createStatement();
stmt.execute(sleep);

https://docs.oracle.com/database/121/ARPLS/d_lock.htm#ARPLS66782

然而,这确实调用了一个 PL/SQL 过程,因此它并不真正符合“没有存储函数”的条件。

【讨论】:

  • 这只有在他可以授予dbms_lock的访问权限时才有效
  • dbms_lock.sleep 是过程而不是函数,所以你不能像这样从 SQL 中使用它。
  • @Husqvik:正确。我总是忘记这一点
  • 我没有授予 dbms_lock :-(。难道没有“纯 sql-ish”的东西吗?
  • @a_horse_with_no_name, "开始 dbms_lock.sleep(10); 结束;"是 SQL 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
相关资源
最近更新 更多