如何在PL / SQL中定义一个可在所有函数/过程/包中使用的全局变量?
是否可以定义?
或者有没有其他方法可以做到这一点?
答案 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]