如何在 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;
...

How can I define a global variable in PL/SQL which will be available in all functions / procedures / packages?

你可以使用 Global Application Context variable.

An application context is a set of name-value pairs that Oracle Database stores in memory. The application context has a label called a namespace, for example, empno_ctx for an application context that retrieves employee IDs. Inside the context are the name-value pairs (an associative array): the name points to a location in memory that holds the value. An application can use the application context to access session information about a user, such as the user ID or other user-specific information, or a client ID, and then securely pass this data to the database. You can then use this information to either permit or prevent the user from accessing data through the application. You can use application contexts to authenticate both database and nondatabase users.

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

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

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