在 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“包”中,如何使变量、函数或过程可访问或不可访问?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 自定义函数,调用时报“程序包或函数无效”

oracle中常用函数

如何使局部变量(在函数内部)全局[重复]

oracle-游标-存储过程-函数-包

从 Oracle 12c 函数返回多个值

oracle如何从函数中返回值表