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

时间:2015-03-31 06:50:01

标签: oracle plsql

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

是否可以定义?

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

3 个答案:

答案 0 :(得分:15)

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

CREATE PACKAGE my_public_package IS
  my_var Number;
END;

现在,您可以通过访问my_public_package

的任何代码访问变量
...
my_public_package.my_var := 10;
...

答案 1 :(得分:8)

  

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

您可以使用Global Application Context variable

  

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

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

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

/  

答案 2 :(得分:0)

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