oracle PLS-00302:必须声明组件“睡眠”

pgpifvop  于 2023-02-03  发布在  Oracle
关注(0)|答案(2)|浏览(536)

我在SQL中使用以下命令时收到错误;
执行系统数据库管理系统会话睡眠(1);
但是如果我使用DBMS_LOCK,那么它就可以工作。
执行系统数据库管理系统锁定睡眠(1);
参考:https://oracle-base.com/articles/18c/dbms_session-sleep-18c
使用此命令时是否遗漏了某些内容?

e0bqpujr

e0bqpujr1#

DBMS_LOCK是一个特权例程,也就是说,它有很大的权力,因此它通常被保护起来,不能被广泛使用。问题是,非常有用的SLEEP例程当时也不可用。
在18c中,我们意识到了这个问题,所以将SLEEP例程复制到了DBMS_SESSION中,后者是公开的,这样每个人都可以使用SLEEP。
在18c之前,您需要将在DBMS_LOCK上执行的权限授予那些需要它的用户(这是有风险的),或者创建一个 Package 器函数并只授予它,例如

create or replace
procedure SYS.SLEEP(n number) is
begin
  dbms_lock.sleep(n);
end;

grant execute on sys.sleep to public;
gpnt7bae

gpnt7bae2#

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

CREATE OR REPLACE procedure new_sleep(p_nSekunden  number)

is

  dDate  date := sysdate;
begin
 
  dDate := dDate + ( (1/24/3600) * p_nSekunden );

  loop
    
    exit when sysdate > dDate;       
    
  end loop;

end;

相关问题