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

Sam*_*ini 8 oracle plsql

如何在PL/SQL中定义一个全局变量,该变量将在所有函数/过程/包中提供?

是否可以定义?

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

谢谢.

Pet*_*byl 17

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

CREATE PACKAGE my_public_package IS
  my_var Number;
END;
Run Code Online (Sandbox Code Playgroud)

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

...
my_public_package.my_var := 10;
...
Run Code Online (Sandbox Code Playgroud)

  • 这个变量是会话范围的 (6认同)

Lal*_*r B 9

如何在PL/SQL中定义一个全局变量,该变量将在所有函数/过程/包中提供?

您可以使用全局应用程序上下文变量.

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

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

例如,正如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;

/  
Run Code Online (Sandbox Code Playgroud)

  • 1. 好的,所以您有 1 列用于 1 个变量(您的答案中未提及)。那么没关系。你应该只调整你的 getter 和 setter 名称......然后我会赞成你的答案 2. 你应该参考来源,如果这不是你的想法 (2认同)