8c7f6c03

Пример создания контекста


Положим, доверительной программной единицей должна быть процедура SET_MYCONTEXT_VALUE:

CONNECT / as sysdba

CREATE OR REPLACE CONTEXT mycontext USING set_mycontext_value;

Обратите внимание, что процедура не обязана существовать в момент создания контекста. Но в конце концов ее-таки потребуется создать:

CREATE OR REPLACE PROCEDURE set_mycontext_value ( par IN VARCHAR2 , val IN VARCHAR2 ) AS BEGIN DBMS_SESSION.SET_CONTEXT ( 'mycontext', par, val ); END; /

GRANT EXECUTE ON set_mycontext_value TO scott;

Проверка:

SQL> CONNECT scott/tiger Connected. SQL> SELECT SYS_CONTEXT ( 'mycontext', 'sesame' ) FROM dual;

SYS_CONTEXT('MYCONTEXT','SESAME') ------------------------------------------------------------

SQL> EXECUTE sys.set_mycontext_value ( 'sesame', '123' )

PL/SQL procedure successfully completed.

SQL> SELECT SYS_CONTEXT ( 'mycontext', 'sesame' ) FROM dual;

SYS_CONTEXT('MYCONTEXT','SESAME') ------------------------------------------------------------ 123

Выше серым фоном выделена пустая строка.

С помощью контекста MYCONTEXT и доступной ему процедуры пользователь SCOTT завел значение, которое сможет читать и переустанавливать в собственном сеансе вплоть до завершения. Другой сеанс пользователя SCOTT создаст и будет использовать с помощью этого же контекста свои значения, то есть значения контекста являются собственностью сеанса.

Значения атрибутов контекста живут не долее пределов сеанса и защищены от доступа из других сеансов. В течение сеанса значения переменных пакета могут пропасть («сброс» пакета, хотя пользователи и нечасто прибегают к нему), и значения атрибутов контекста тоже (с помощью пакета DBMS_SESSION). Этим атрибуты схожи с переменными пакета. Но есть и отличия:

  • в пакете набор переменных фиксирован, а набор атрибутов контекста произволен
  • переменные пакета могут быть разнообразны по структуре, а значения атрибутов контекста - всего лишь строки текста
  • атрибутам контекста можно устанавливать до сеанса и делать доступными в другом сеансе.
  • Вот еще пример использования нашего контекста:

    SQL> EXECUTE set_mycontext_value - > ( 'start work', TO_CHAR ( SYSDATE, 'hh24:mi:ss' ) )

    PL/SQL procedure successfully completed.

    SQL> REMARK выполняем работу, после чего смотрим когда начинали ...

    SQL> SELECT SYS_CONTEXT ( 'mycontext', 'start work' ) FROM dual;

    SYS_CONTEXT('MYCONTEXT','STARTWORK') -------------------------------------------------------------------- 13:58:06



    Содержание раздела