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