create or replace procedure SP_SLEEP_ALTERNATE is
V_FLAG INT := 0;
V_START_DATE DATE;
V_END_DATE DATE;
begin
SELECT SYSDATE INTO V_START_DATE FROM DUAL;
SELECT SYSDATE + 30 / 1440 INTO V_END_DATE FROM DUAL;
while V_START_DATE <= V_END_DATE LOOP
BEGIN
/* get flag from a table */
EXCEPTION
WHEN NO_DATA_FOUND THEN
V_FLAG := 0;
END;
IF V_FLAG <> 1 THEN
V_FLAG := 0;
ELSIF V_FLAG = 1 THEN
DBMS_OUTPUT.PUT_LINE('Execution Started');
EXIT;
ELSIF V_FLAG <> 1 AND V_START_DATE > V_END_DATE THEN
EXIT;
END IF;
SELECT SYSDATE INTO V_START_DATE FROM DUAL;
END LOOP;
end SP_SLEEP_ALTERNATE;
with function slow_function(p_id in number) return number
deterministic as
begin
dbms_lock.sleep(0.02); --look here
return p_id;
end;
select
slow_function(level)
from
dual
connect by level <= 20000
错误:
ORA-00904: "SYS"."DBMS_LOCK": invalid identifier
成功:**sys.dbms_session.sleep(...)
with function slow_function(p_id in number) return number
deterministic as
begin
--dbms_lock.sleep(0.02);
sys.dbms_session.sleep(0.02); --look here
return p_id;
end;
select
slow_function(level)
from
dual
connect by level <= 20000
CREATE OR REPLACE procedure new_sleep(p_nSekunden number)
is
dDate date := sysdate;
begin
if p_nSekunden < 1 then
return;
end if;
dDate := dDate + ( (1/24/3600) * p_nSekunden );
loop
exit when sysdate > dDate;
end loop;
end;
5条答案
按热度按时间drkbr07n1#
您应该将该包grant execute到您的模式中
例如:
ca1c2owp2#
如果您没有sys的访问权限或者您的dba不愿意这样做
您可以在数据库中创建Java过程:
并创建一个函数,该函数调用java存储过程
在一个
您可以从选定的
v7pvogib3#
我遇到了这个问题,我的用户无法访问DBMS_LOCK包,因为我目前在12 c上,所以无法使用
DBMS_SESSION.SLEEP
包。因此创建了以下过程,以适应30分钟的等待时间。参数***V_START_DATE***保存当前日期时间。
参数***V_END_DATE***保存当前日期时间,并添加您希望作业等待的分钟数(在本例中,30/1440添加30分钟)。
***WHILE***循环将迭代到结束日期时间,如果标志为1或执行超过指定的等待时间(即V_END_DATE〉V_START_DATE)且标志值〈〉1,则循环将中断。
我希望这能帮助到面临同样问题的人。
kqhtkvqz4#
DBMS_SESSION.SLEEP Replaces DBMS_LOCK.SLEEP in Oracle Database 18c
SLEEP过程已添加到DBMS_SESSION程序包中,并且已从Oracle Database 18c的DBMS_LOCK程序包中弃用。
SLEEP过程已添加到DBMS_SESSION程序包中,因此它可用于所有会话,而无需额外授权,也不依赖于DBMS_LOCK程序包。
dbms_lock.sleep(...)
错误:
sys.dbms_session.sleep(...)
结果:
db<>fiddle
相关:Why does DETERMINISTIC function return unexpected numbers in CONNECT BY LEVEL query?
ajsxfq5m5#
自制程序。如果您没有设置授权的权限