【发布时间】:2011-02-03 10:28:50
【问题描述】:
我需要在 ORACLE 中执行一个 SQL 查询,这需要一定的时间。 所以我写了这个函数:
CREATE OR REPLACE FUNCTION MYSCHEMA.TEST_SLEEP
(
TIME_ IN NUMBER
)
RETURN INTEGER IS
BEGIN
DBMS_LOCK.sleep(seconds => TIME_);
RETURN 1;
EXCEPTION
WHEN OTHERS THEN
RAISE;
RETURN 1;
END TEST_SLEEP;
我就是这样打电话的
SELECT TEST_SLEEP(10.5) FROM DUAL
但要工作,我需要将DBMS_LOCK 授予程序的所有者。
如何在不使用DBMS_LOCK.sleep 函数的情况下重写此函数?
【问题讨论】:
-
愚蠢的问题,但是这种事情在数据库上的预期(或必要性)行为是什么?你什么时候需要那个?
-
仅供参考。您的异常块毫无意义。块中的 RETURN 1 永远不会到达,如果块完全丢失......无论如何都会引发异常。
-
有一次我需要睡眠功能。在这个应用程序中。外部程序调用将数据写入文件的数据库函数。然后外部程序访问该文件。在一个特定的系统上,我们需要在函数结束时休眠,否则外部程序会在文件完全写入之前尝试访问文件。在大多数系统上,它没有任何内置延迟。
-
所以外部程序没有等待函数返回 - 在这种情况下睡眠可能没有帮助?或者函数在完成写入文件之前返回?如果是后者,那么它是否没有刷新数据或显式关闭文件 - 我无法理解这是如何发生的,否则我可能遗漏了一些东西......
-
为什么不想使用 DBMS_LOCK.SLEEP() 函数?如此多的数据库应用程序被无效功能的不必要的重新发明所破坏。
标签: sql oracle plsql oracle11g