oracle pl/sql数据库管理系统锁定错误

qyswt5oh  于 2023-02-03  发布在  Oracle
关注(0)|答案(5)|浏览(172)

在Oracle PL/SQL中,我想测试sleep函数。我使用的是hr模式。但它给我错误:

PLS-00201: identifier 'DBMS_LOCK' must be declared

代码:

begin
 DBMS_LOCK.Sleep( 60 );
end;
/
drkbr07n

drkbr07n1#

您应该将该包grant execute到您的模式中

grant execute on <object> to <user>;

例如:

connect as sys
grant execute on SYS.DBMS_LOCK to someuser;
ca1c2owp

ca1c2owp2#

如果您没有sys的访问权限或者您的dba不愿意这样做

GRANT EXECUTE on SYS.DBMS_LOCK to you;

您可以在数据库中创建Java过程:

CREATE OR REPLACE PROCEDURE SLEEPIMPL (P_MILLI_SECONDS IN NUMBER) 
   AS LANGUAGE JAVA NAME 'java.lang.Thread.sleep(long)';

并创建一个函数,该函数调用java存储过程

CREATE OR REPLACE FUNCTION sleep (
    seconds IN NUMBER
   ) RETURN NUMBER
   AS
   BEGIN
     SLEEPIMPL( seconds );
     RETURN seconds;
   END;

在一个

GRANT EXECUTE ON sleep TO public;

您可以从选定的

select sleep(6000) from dual
v7pvogib

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,则循环将中断。

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;

我希望这能帮助到面临同样问题的人。

kqhtkvqz

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(...)
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

结果:

SLOW_FUNCTION(LEVEL)
--------------------
                   1
                   1
                   1
                   1
                   1
                   1
                   1
                   1
                   1
                   1
…
10 rows of 20000

db<>fiddle
相关:Why does DETERMINISTIC function return unexpected numbers in CONNECT BY LEVEL query?

  • 我不是Maven,如果我说错了,尽管纠正我 *
ajsxfq5m

ajsxfq5m5#

自制程序。如果您没有设置授权的权限

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;

相关问题