在 Oracle 12“包”中,如何使变量、函数或过程可访问或不可访问?
Posted
技术标签:
【中文标题】在 Oracle 12“包”中,如何使变量、函数或过程可访问或不可访问?【英文标题】:Inside an Oracle 12 "package", how do I make a variable or function or procedure accessible or not accessible? 【发布时间】:2016-09-07 16:45:47 【问题描述】:我是一名前 Java 开发人员,使用 Oracle 的 SQL-Developer 创建 Oracle“包”。
Oracle 的网站表明可以创建一个 Oracle“包”,其中一些对象(变量、函数、过程)可以在包“范围之外”访问,而其他对象只能在包“内部”访问。
也就是说,我正在尝试做这样的事情(伪代码!),它有意但表面上类似于 Java。
所以,我在问,“如何在 Oracle PL SQL 包中实现类似于(java 的)PUBLIC 和 PRIVATE 的功能”? (“参见‘Oracle 关键字’足以为我指明正确的方向。)
提前致谢!
CREATE PACKAGE a
// header
**PUBLIC** NUMBER nVisibleOutside := 1;
**PRIVATE** NUMBER nNOTVisibleOutside := 14922016;
PUBLIC PROCEDURE pVisibleOutside ();
PUBLIC FUNCTION fNOTVisibleOutside();
/* other stuff */
// body
/* actual code of pVisibleOutside and fNOTVisibleOutside(); */
END a;
【问题讨论】:
规范中的任何内容都将可供外部调用者使用。正文中包含但未在规范中定义的任何内容都只能在内部调用。请记住,两者是由不同的语句创建的。有关每个CREATE
语句的详细信息,请参阅 the documentation。
哇,真快!谢谢!
是的,我已经成功创建了几个包,但我只是不(不!)知道可见/不可见功能是如何工作的。再次感谢。
【参考方案1】:
Oracle 使用包规范和包体。实际上,规范定义您希望其他代码区域(例如,另一个包)可以访问的所有过程/函数/变量/等。然后,主体包含其他“私有”过程和函数的定义,以及包规范中定义背后的逻辑。
您在上面提供的示例如下:
CREATE OR REPLACE PACKAGE XX_EXAMPLE_PACKAGE AS
-- Variable that is visible to any code
n_visible_outside NUMBER := 1;
-- Procedure that is visible to any code
PROCEDURE p_visible_outside ( );
END XX_PACKAGE_SPECIFICATION;
/
CREATE OR REPLACE PACKAGE BODY XX_EXAMPLE_PACKAGE AS
-- A variable that is visible to the whole package body but not
-- to external code
v_dummy VARCHAR2(100);
-- Procedure visible to any code through the specification
PROCEDURE p_visible_outside AS
-- declaring a variable that is only visible to this procedure
n_not_visible_outside NUMBER := 14922016;
BEGIN
-- Logic
END p_visible_outside;
-- Function not visible outside as not declared in specification
-- can be accessed by code within this package
FUNCTION f_not_visible_outside RETURN BOOLEAN IS
--Logic
END f_not_visible_outside;
END;
/
然后您可以从另一个包中以这种方式调用“可见”过程:
XX_EXAMPLE_PACKAGE.p_visible_outside;
同样,您可以通过这种方式从另一个包中调用“可见”全局变量:
-- You could use this in your code as say, a parameter
XX_EXAMPLE_PACKAGE.n_visible_outside;
-- You could assign the value to another variable in your code
v_dummy := XX_EXAMPLE_PACKAGE.n_visible_outside;
作为初学者,遵循开发标准并不那么重要,但是,将来您应该这样做。希望您有一些本地开发标准,但是您可能会在 google 的某个地方找到一些 Oracle PL/SQL 标准。
【讨论】:
非常好的文章,谢谢。是的,我也是一个标准爱好者(我花了很多年时间编写 C 代码,然后是 Java,使用各种数据库,但不是 Oracle)。以上是关于在 Oracle 12“包”中,如何使变量、函数或过程可访问或不可访问?的主要内容,如果未能解决你的问题,请参考以下文章