Как определить глобальную переменную в PL/SQL, которая будет доступна во всех функциях/процедурах/пакетах?
Можно ли определить?
Или есть альтернативный способ сделать это?
Создайте новый пакет с вашей переменной в спецификации пакета, например:
CREATE PACKAGE my_public_package IS
my_var Number;
END;
Теперь вы можете получить доступ к переменной в любом коде с доступом к my_public_package
...
my_public_package.my_var := 10;
...
Как определить глобальную переменную в PL/SQL, которая будет доступна во всех функциях/процедурах/пакетах?
Вы можете использовать глобальную переменную контекста приложения.
Контекст приложения представляет собой набор пар имя-значение, которые Oracle База данных хранится в памяти. Контекст приложения имеет ярлык, называемый пространство имен, например empno_ctx для контекста приложения, которое извлекает идентификаторы сотрудников. Внутри контекста находятся пары имя-значение (ассоциативный массив): имя указывает на место в памяти, которое имеет значение. Приложение может использовать контекст приложения для информацию о сеансе доступа к пользователю, такую как идентификатор пользователя или другой пользовательскую информацию или идентификатор клиента, а затем безопасно передать это данных в базу данных. Затем вы можете использовать эту информацию для разрешить или запретить пользователю получать доступ к данным через выражение. Вы можете использовать контексты приложений для аутентификации обоих базы данных и пользователей без базы данных.
Если вы хотите, чтобы v допустимое значение должно быть одинаковым во всех сеансах для любого объекта 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;
/