为什么我不能在dbms_lock.sleep()上授予exec或者使用它创build一个过程(但是我可以自行运行它)

我正在尝试编写一小段非睡眠的PL / SQL。

以下在sqldeveloper中工作

begin dbms_lock.sleep(5); end; 

但(作为相同的用户),我不能做到以下几点:

 create or replace procedure sleep(seconds in number) is begin dbms_lock.sleep(seconds); end; 

没有错误“identifer”DBMS_LOCK“必须声明…有趣,因为我可以运行它没有一个过程。

同样奇怪的是,当我以DBA身份login时,我可以运行该命令

 grant exec on dbms_lock to public; 

我得到了

 ERROR at line 1: ORA-00990: missing or invalid privilege 

这是Oracle版本“Oracle数据库11g快速版发布11.2.0.2.0 – 64位生产”

 [richard@f1 ~]$ sqlplus /nolog SQL*Plus: Release 11.2.0.2.0 Production on Fri Sep 14 13:33:18 2012 Copyright (c) 1982, 2011, Oracle. All rights reserved. SQL> connect sys@xe as sysdba Enter password: ****** Connected. SQL> grant execute on sys.dbms_lock to richard; Grant succeeded. 

根据http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9013.htm

 GRANT EXECUTE ON "object" TO PUBLIC; 

要创build独立的过程或function,或者包装规格或正文,您必须满足以下先决条件:

  • 您必须具有CREATE PROCEDURE系统特权才能在模式中创build过程或程序包,或具有CREATE ANY PROCEDURE系统特权才能在另一个用户的模式中创build过程或程序包。

注意 :要创build没有错误,即成功编译过程或包,需要以下附加特权:过程或包的所有者必须已被明确授予对代码体内引用的所有对象的必要对象特权; 所有者不能通过angular色获得所需的权限。

  • 如果程序或程序包所有者的权限发生变化,程序必须在执行之前进行重新authentication。 如果从过程(或包)的所有者撤销对被引用对象的必要特权,则该过程不能被执行。