我们可以从另一个包中调用一个包的私有过程吗?我们可以从一个私有包中调用数据库过程吗?
Can we call a private procedure of a package from another package and can we call database procedure from a private package
在私有包中调用数据库过程
如果私有,你的意思是一个在包体中定义的过程,而不是在包头中公开,那么没有。其他包将无法 "see" 该程序。
SQL> CREATE OR REPLACE PACKAGE foo AS END; -- No "public" procedures/functions
2 /
Package FOO compiled
SQL> CREATE OR REPLACE PACKAGE BODY foo
2 AS
3 PROCEDURE priv IS BEGIN NULL; END; -- "Private" procedure
4 END;
5 /
Package Body FOO compiled
SQL> CREATE OR REPLACE PACKAGE other_pkg
2 AS
3 PROCEDURE call_priv_proc;
4 END;
5 /
Package OTHER_PKG compiled
SQL> CREATE OR REPLACE PACKAGE BODY other_pkg
2 AS
3 PROCEDURE call_priv_proc
4 IS
5 BEGIN
6 foo.priv;
7 END;
8 END;
9 /
Package Body OTHER_PKG compiled
LINE/COL ERROR
--------- -------------------------------------------------------------
6/5 PL/SQL: Statement ignored
6/9 PLS-00302: component 'PRIV' must be declared
Errors: check compiler log
如果通过数据库过程,您指的是不在包中的独立过程,那么是的 - 前提是调用者对该过程具有 EXECUTE 权限。该过程是用调用者的权限还是定义者的权限定义的也很重要。参见 Invokers and Definers Rights
在私有包中调用数据库过程
如果私有,你的意思是一个在包体中定义的过程,而不是在包头中公开,那么没有。其他包将无法 "see" 该程序。
SQL> CREATE OR REPLACE PACKAGE foo AS END; -- No "public" procedures/functions
2 /
Package FOO compiled
SQL> CREATE OR REPLACE PACKAGE BODY foo
2 AS
3 PROCEDURE priv IS BEGIN NULL; END; -- "Private" procedure
4 END;
5 /
Package Body FOO compiled
SQL> CREATE OR REPLACE PACKAGE other_pkg
2 AS
3 PROCEDURE call_priv_proc;
4 END;
5 /
Package OTHER_PKG compiled
SQL> CREATE OR REPLACE PACKAGE BODY other_pkg
2 AS
3 PROCEDURE call_priv_proc
4 IS
5 BEGIN
6 foo.priv;
7 END;
8 END;
9 /
Package Body OTHER_PKG compiled
LINE/COL ERROR
--------- -------------------------------------------------------------
6/5 PL/SQL: Statement ignored
6/9 PLS-00302: component 'PRIV' must be declared
Errors: check compiler log
如果通过数据库过程,您指的是不在包中的独立过程,那么是的 - 前提是调用者对该过程具有 EXECUTE 权限。该过程是用调用者的权限还是定义者的权限定义的也很重要。参见 Invokers and Definers Rights