Известно ли вам, что при выполнении длительной команды в Oracle, такой как CREATE INDEX или UPDATE для миллиона строк (длительная определяется как выполняемая дольше, чем за 3–5 секунд), динамически работающее представление V$SESSION_LONGOPS заполняется информацией? Это представление включает в себя следующую информацию:
DBMS_APPLICATION_INFO позволяет установить значения в представлении V$SESSION_LONGOPS. Это полезно делать при записи течения длительного процесса.
Вероятно, каждому разработчику хотелось бы, чтобы такая возможность существовала и в его собственных длительных хранимых процедурах или в других операциях. Что ж, начиная с версии 8.0 базы данных, DBMS_APPLICATION_INFO поможет найти ответы на вопросы:
DBMS_APPLICATION_INFO позволяет установить три столбца в строке таблицы V$SESSION: CLIENT_INFO, ACTION и MODULE. Функции могут не только устанавливать эти значения, но и возвращать их. К тому же во встроенных функциях USERENV и SYS_CONTEXT существует параметр, обеспечивающий доступ к столбцу CLIENT_INFO из любого запроса. В моем запросе я могу сделать, например, select userenv ('CLIENT_INFO') from dual или использовать where some_column = sys_context ('userenv', 'CLIENT_INFO'). Столбец MODULE должен хранить имя главного процесса, например имя пакета. Столбец ACTION подходит для хранения имени процедуры, которая выполняется в пакете.
ПРИМЕЧАНИЕ Значения, устанавливаемые в таблицах V$, становятся видимыми немедленно. Нет необходимости фиксировать их для того, чтобы увидеть их и использовать при общении с внешним миром.
DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS ( rindex => Указывает серверу, какую строку в представлении V$SESSION_LONGOPS необходимо изменить. Если в качестве значения этого параметра указать DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS_NOHINT, в это представление будет автоматически вставлена новая строка, индекс которой будет записан в rindex. При указании в последующих вызовах процедуры SET_SESSION_LONGOPS этого индекса в качестве значения параметра rindex будет изменяться добавленная строка. slno => Служебное значение. Первоначально надо передать значение NULL, а полученное в результате выполнения значение — игнорировать. При каждом вызове надо передавать одно и то же значение. op_name => Имя продолжительно выполняющегося процесса. Его длина не должна превышать 64 байт, а в качестве значения необходимо задавать строку, по которой легко определить, что именно выполняется. target => Обычно используется для передачи идентификатора объекта, с которым выполняется продолжительное действие (например, идентификатор таблицы, в которую загружаются данные). Можно передать любое значение, в том числе NULL . context => Число, задаваемое пользователем. Это число должно быть информативным для пользователя. Передать можно любое число. sofar => В качестве значения можно передавать любое число, но если это число будет представлять собой процент или другую количественную характеристику уже выполненной части действия, сервер сможет автоматически оценить, сколько времени осталось до завершения действия. Например, если необходимо обработать 25 объектов и на обработку каждого из них уходит примерно одинаковое время, можно задать в качестве значения параметра sofar количество обработанных объектов, а общее их количество передать как следующий параметр, totalwork. Сервер определит, сколько времени потребовалось для выполнения уже сделанной части, и оценит время, необходимое для завершения действия. totalwork => В качестве значения можно передавать любое число, но имеет смысл сопоставлять его со значением параметра sofar. Если sofar представляет собой процент от totalwork, отражающий ход выполнения действия, сервер сможет вычислить, сколько времени осталось до завершения действия. target_desc => Этот параметр описывает значение target, представленное выше. Если в качестве параметра target передан идентификатор объекта, параметр может содержать имя объекта с этим идентификатором. units => Описательный параметр, задающий единицу измерения для значений параметров sofar и totalwork. Это могут быть, например, файлы, итерации или вызовы. ) PS. Уникальность записи идет по rindex Данные вставленные в V$SESSION_LONGOPS: op_name, target, target_desc, units берутся по первому вызову DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS sofar, totalwork по последующим (последним) context сюда попадает передаваемое текущее значение
Ниже приводятся основные указания по использованию пакета DBMS_APPLICATION_INFO:
Источник: Глава из книги "Oracle: Эффективное проектирование приложений”
|