【发布时间】:2019-11-28 17:03:23
【问题描述】:
调用私有包中的数据库过程
【问题讨论】:
-
第一部分是“否”,这就是使其私有的原因(程序包主体中的过程,但未在规范中声明)。 Read more。你说的“私人包”是什么意思?
标签: sql oracle plsql plsql-package
调用私有包中的数据库过程
【问题讨论】:
标签: sql oracle plsql plsql-package
如果是私有的,你的意思是一个在包体中定义的过程,而不是在标头中公开的,那么不是。其他包将无法“看到”该过程。
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
【讨论】: