【问题标题】:How to define global variable in PL/SQL in Oracle?如何在 Oracle 的 PL/SQL 中定义全局变量?
【发布时间】:2015-03-31 06:50:01
【问题描述】:

如何在 PL/SQL 中定义一个可用于所有函数/过程/包的全局变量?

可以定义吗?

或者有没有其他方法可以做到这一点?

【问题讨论】:

  • 您希望这个全局变量的值在所有会话之间共享还是对每个会话都是私有的?
  • 我记得有一种方法可以将包状态变量存储在 SGA 或 UGA 中? (不在 PGA 中),然后在会话之间共享包状态。但我无法在文档中对此进行任何参考。

标签: oracle plsql


【解决方案1】:

使用包规范中的变量创建新包,如下所示:

CREATE PACKAGE my_public_package IS
  my_var Number;
END;

现在您可以通过访问 my_public_package 访问任何代码中的变量

...
my_public_package.my_var := 10;
...

【讨论】:

  • 这种方式可以使用pl/sql关联数组来实现全局哈希表
  • 这个变量是会话范围的
  • OP 要求一个 GLOBAL 方法,如果一个 s @PavelGatnar 说这是本地/会话,那么这不是一个有效的答案(我需要知道同样的,特别是如何设置全局)
【解决方案2】:

如何在 PL/SQL 中定义一个可用于所有函数/过程/包的全局变量?

您可以使用Global Application Context variable

应用程序上下文是一组名称-值对,Oracle 数据库存储在内存中。应用程序上下文有一个名为的标签 命名空间,例如,用于应用程序上下文的 empno_ctx 检索员工 ID。上下文内部是名称-值对 (关联数组):名称指向内存中的一个位置 持有价值。应用程序可以使用应用程序上下文来 访问有关用户的会话信息,例如用户 ID 或其他 特定于用户的信息或客户端 ID,然后安全地传递 数据到数据库。然后,您可以使用此信息 允许或阻止用户通过 应用。您可以使用应用程序上下文对两者进行身份验证 数据库和非数据库用户。

如果您希望任何 PL/SQL 对象访问该变量的所有会话中的 variable 值都应相同,则使用数据库表来存储价值。

例如,正如 T.Kyte 建议的 here

CREATE TABLE global_value(x INT);

INSERT INTO global_value VALUES (0);

COMMIT;

CREATE OR replace PACKAGE get_global
AS
  FUNCTION Val
  RETURN NUMBER;
  PROCEDURE set_val (
    p_x IN NUMBER );
END;

/

CREATE OR replace PACKAGE BODY get_global
AS
  FUNCTION Val
  RETURN NUMBER
  AS
    l_x NUMBER;
  BEGIN
      SELECT x
      INTO   l_x
      FROM   global_value;

      RETURN l_x;
  END;
  PROCEDURE Set_val(p_x IN NUMBER)
  AS
    PRAGMA autonomous_transaction;
  BEGIN
      UPDATE global_value
      SET    x = p_x;

      COMMIT;
  END;
END;

/  

【讨论】:

  • 你应该使表、getter 和 setter 更通用以存储键值对,1 个表对应 1 个值是一种过度杀伤
  • 一个表一个值? 你在哪里看到我说的每个值一个表?它只是一个全局变量值的表。在评论和否决之前了解。你知道这是 Thomas Kyte 提供的解决方案吗? asktom.oracle.com/pls/asktom/…
  • 为什么 AUTONOMOUS_TRANSACTIONSet_val 中?
  • 因为即使其他程序失败,您也希望确保更新发生。因为你想设置上下文。
  • 1.好的,所以你有 1 个变量的 1 列(你的答案中没有提到)。那么就可以了。你应该只调整你的 getter 和 setter 名称......然后我会支持你的答案 2. 如果不是你的想法,你应该参考源代码
【解决方案3】:
variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value] 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多