Как определить глобальную переменную в PL/SQL в Oracle?

Вопрос:

Как определить глобальную переменную в 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;

/

Оцените статью
TechArks.Ru
Добавить комментарий