繁体   English   中英

如何在 Oracle 的 PL/SQL 中定义全局变量?

[英]How to define global variable in PL/SQL in Oracle?

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

可以定义吗?

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

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

CREATE PACKAGE my_public_package IS
  my_var Number;
END;

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

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

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

您可以使用Global Application Context 变量

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

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

例如,正如 T.Kyte 在这里建议的那样

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;

/  
variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value] 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM