|
Программирование >> Oracle
Пакет DBMS APPLICATION INFO 1575 Многие инструментальные средства Oracle, например SQL*Plus, уже используют возможности этого пакета. Я создал сценарий SHOWSQL.SQL, позволяющий узнать, какие SQL-операторы пользователи выполняют в настоящий момент в базе данных (этот сценарий можно найти на Web-сайте издательства Wrox, http: www.wrox.com). Часть этого сценария выбирает данные из представления V$SESSION, в которых значения столбцов CLIENT INFO, MODULE или ACTION непустые (NOT NULL). При запуске этого сценария я получаю, например, следующие результаты: USERNAME MODULE ACTION CLIENT INFO OPS$TKYTE(107,19225) 01@ showsql.sql OPS$TKYTE(22,50901) SQL*Plus Первая строка показывает, что текущий сеанс выполняет сценарий SHOWSQL.SQL на уровне 01. Это означает, что сценарий вызван непосредственно, а не из другого сценария. Если создать сценарий TEST.SQL с единственной строкой @SHOWSQL, то для представления этого вложенного вызова утилита SQL*Plus установит для сценария SHOWSQL уровень вызова 02. Вторая строка показывает другой сеанс SQL*Plus. В нем сейчас никакие сценарии не выполняются (возможно, в нем выполняется команда, введенная непосредственно в командной строке). Если добавить соответствующие вызовы процедур пакета DBMS APPLICATION INFO в приложение, можно добиться такого же результата, расширив возможности контроля работы приложения для его создателя и администратора базы данных. Для установки соответствующих значений в представлении V$SESSION используются следующие вызовы. SET MODULE. Эта процедура позволяет установить в представлении V$SESSION значения столбцов MODULE и ACTION. Имя модуля должно быть не длиннее 48 байт, а значение поля, описывающего действие, не должно быть длиннее 32 байт. В качестве имени модуля обычно указывается имя приложения. Первым действием можно указать STARTUP или INITIALIZING, чтобы отметить начало работы приложения. SET ACTION. Эта процедура позволяет установить в представлении V$SESSION значение столбца ACTION (действие). Это значение должно быть таким, чтобы можно было понять, какая часть кода программы выполняется. В качестве действия можно указывать, например, имя текущей активной экранной формы, имя функции в программе на Pro*C или имя PL/SQL-подпрограммы. SET CLIENT INFO. Эта процедура позволяет сохранить до 64 байт специфической информации о приложении, которая может понадобиться. Обычно (см. далее) так сохраняются параметры представления или запроса. Имеются процедуры и для чтения соответствующей информации из представлений. Помимо установки значений в представлении V$SESSION этот пакет позволяет устанавливать значения в представлении динамической производительности V$SESSION LONGOPS. Это представление позволяет сохранять несколько строк информации в различных столбцах. Вскоре мы более подробно рассмотрим эту возможность. 1576 Приложение А Использование информации о клиенте Процедура SET CLIENT INFO позволяет установить не только значения в столбцах представления V$SESSION, но и значение переменной CLIENT INFO, которое можно получить с помощью встроенных функций userenv (в версиях Oracle 7.3 и в1ше) или sys context (именно ее лучше использовать в версиях Oracle 8i и выше). Например, можно создать параметризованное представление, результаты выборки данных из которого зависят от значения переменной CLIENT INFO. Эту идею можно проиллюстрировать следующим примером: scott@TKYTE816> exec dbms application info.set client info(KING); PL/SQL procedure successfully completed. scott@TKYTE816> select userenv(CLIENT INFO) from dual; USERENV(CLIENT INFO) KING scottTKYTE816> select sys context(userenv,client info)from dual; SYS CONTEXT(USERENV,CLIENT INFO) KING scott6TKYTE816> create or replace view 2 emp view 3 as 4 select ename, empno 5 from emp 6 where ename = sys context(userenv, client info); View created. scott@TKYTE816> select * from emp view; ENAME EMPNO KING 7839 scott@TKYTE816> exec dbms application info.set client info(BLAKE); PL/SQL procedure successfully completed. scotteTKYTE816> select * from emp view; ENAME EMPNO BLAKE 7698 Как видите, можно установить соответствующее значение и легко использовать его в запросах вместо константы. Это позволяет создавать сложные представления с условиями, значения которых уточняются при выполнении. При использовании представлений могут возникать проблемы, связанные с включением условия (predicate merging). Если оптимизатор включает условие в определение представления, запрос из представления выполняется очень быстро. В противном случае запрос выполняется медленно. Используя значение переменной CLIENT INFO, можно включить условие заранее, если Пакет DBMS APPLICATION INFO 1577 оптимизатор не может этого сделать. Разработчик приложения должен установить переменной соответствующее значение и выполнить SELECT * из представления. В результате он получит нужные данные. Средства пакета DBMS APPLICATI0N INF0 я применяю также для записи значений связываемых переменных, используемых в запросе и другой необходимой информации, позволяющей легко понять, что именно делают процедуры. Например, если включить в долго выполняющийся процесс следующие вызовы: tkyte@TKYTE816> declare 2 l owner varchar2(3 0) default SYS; 3 l cnt number default 0; 4 begin 5 dbms application info.set client info(owner-l owner); 7 for x in (select * fm allobjects where owner - lowner) 8 loop 9 l cnt := l cnt+l; 10 dbms application info.set action(processingrow l cnt); 11 end loop; 12 end; 13 / то с помощью сценария SHOWSQL.SQL можно получить такую информацию: tkyte@TKYTE816> @showsql USERNAME SID SERIAL# PROCESS STATUS TKYTE 8 206 780:716 AGTIVE TKYTE 11 635 1004:1144 AGTIVE TKYTE(ll,635) ospid = 1004:1144 program = SQLPLUS.EXE Saturday 15:59 Saturday 16:15 SELEGT * FROM ALL OBJEGTS WHERE OWNER = :bl USERNAME MODULE ACTION CLIENT INFO TKYTE(8,206) 01@showsql.sql TKYTE(ll,635) SQL*Plus processingrow owner=SYS 5393 Сеанс (11,635) выполняет запрос SELECT * FROM ALL OBJECTS WHERE OWNER = :B1. Отчет также показывает, что запрос выполнен пользователем SYS (owner=SYS) и что в момент вызова сценария showsql он уже обработал S393 строки. В следующем разделе мы увидим, как с помощью представления V$SESSION LONGOPS получить еще более точную информацию, если заранее известно, сколько действий или шагов будет выполнять процедура. Использование представления V$SESSION LONGOPS Многие действия в базе данных могут выполняться достаточно долго. К таким действиям относятся, в частности, восстановление с помощью Recovery Manager, сортировка
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |