在Oracle 12“包”中,如何使变量或函数或过程可访问或不可访问?

时间:2016-09-07 16:45:47

标签: plsql oracle11g plsqldeveloper

我是一名前Java开发人员,使用Oracle的SQL-Developer创建Oracle“软件包”。

Oracle的网站表明,可以创建一个Oracle“软件包”,其中某些对象(变量,函数,过程)可以在软件包范围之外“访问”,而其他对象只能在软件包“内部”访问。 / p>

即,我正在尝试做类似这样的事情(伪代码!),它有意地但表面上类似于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;

1 个答案:

答案 0 :(得分:0)

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;

作为初学者,遵循开发标准并不重要,但是,将来你应该这样做。希望您有一些本地开发标准,但是您可能会在谷歌的某处找到一些Oracle PL / SQL标准。