Стандартные пакеты. DBMS_UTILITY

dbstalker, 19 июня

Этот пакет – набор независимых очень полезных утилит. Он устанавливается всегда при установке ORACLE и GRANT EXECUTE дается роли PUBLIC. Рассмотрим состав пакета.

COMPILE_SCHEMA – процедура предназначена для компиляции невалидных процедур, пакетов, триггеров, функций. Особо хочется подчеркнуть, что процедура производит компиляцию оператором alter …. compile от имени юзера , который вызвал её. И что важно – аргумент ( название схемы) нужно набирать большими буковками.

procedure compile_schema(schema varchar2, compile_all boolean default TRUE, reuse_settings boolean default FALSE);

ПРИМЕР

begin
dbms_utility.compile_schema('AIS');
END;

После выполнения процедуры можно выполнить запрос

Select  * from all_objects where owner=’AIS’ and status=’INVALID’

И таким образом проверить все ли объекты откомпилировались. Хочу заметить, что представления этой процедурой не компилируются (в версиях ниже 10g). Поэтому лучше, на мой взгляд, использовать SYS.utl_recomp.recomp_serial ('shema').

ANALYZE_SCHEMA – процедура выполняет сбор статистической информации об объектах юзера. Это делается оператором analyze. Процедура применяет один и тот же элементарный метод анализа ко всем объектам схемы, к тому же неимеющих большого объема. Весьма осведомленные специалисты (Том Кайт) настоятельно рекомендуют для схем sys , system не собирать статистику вообще.

Аргументы процедуры:

schema varchar2 – название схемы, которую будем анализировать

method varchar2 – метод один из compute, delete, estimate. Если вы выбрали estimate, то один из двух следующих аргументов должен быть непустым.

estimate_rows number default null – количество оцениваемых строк

estimate_percent number default null – процент оцениваемых строк

method_opt varchar2 default null – опции оператора analyze :

[ FOR TABLE ]

[ FOR ALL [INDEXED] COLUMNS] [SIZE n]

[ FOR ALL INDEXES ]

теперь традиционно примерчик:

SQL> exec dbms_utility.analyze_schema('RIS','delete');

PL/SQL procedure successfully completed.

После этого проверяем работу запросом

select owner,table_name,num_rows,last_analyzed from all_tables where owner='RIS'

Этот запрос показывает, что статистика удалена. Теперь попробуем собрать.

SQL> exec dbms_utility.analyze_schema('RIS','compute');

PL/SQL procedure successfully completed.

И опять же проверяем работу запросом

select owner,table_name,num_rows,last_analyzed from all_tables where owner='RIS'

Результат на лицо: колонки num_rows,last_analyzed – заполнены.

А теперь две особенности работы процедуры ANALYZE_SCHEMA.

Первая особенность – если вы в одной сессии анализируете схему, а в другой удаляете объекты, то процедура выдаст ошибку. Процедура не проверяет на существование объекта, а сразу приступает к анализу. И если объекта не находит – возникает ошибка

ORA-20000: Insufficient privileges for some object in this schema.

Если же вы в другом сеансе добавляете объект, то он просто не будет проанализирован. Ошибка не будет сгенерирована. Выход: повторно вызвать процедуру. А ещё лучше – собирайте статистику ночью.

Вторая особенность связана с тем, что процедура не анализирует таблицы организованные по индексу, если в них используется сегмент переполнения. Ошибки не выдает, просто не анализирует. Это нужно делать вручную.

ANALYZE_DATABASE - Весьма осведомленные специалисты советуют – никогда – никогда не использовать эту процедуру. Думаю, что это связано с тем, что будут анализироваться схемы sys и system.

function get_time return number – функция возвращает время прошедшее с определенного момента в сотых долях секунды. Обычно эту функцию используют для определения времени выполнения определенного события. Набросок:

time_start=dbms_utility.get_time;
……
time_finish= dbms_utility.get_time;
delta=time_finish-time_start;
dbms_output.put_line(delta);

Примечание: обратите внимание, что запрос

SQL> Select hsecs,dbms_utility.get_time from v$timer;

     HSECS   GET_TIME
---------- ----------
 652701434  652701439
 

возвращает одно и тоже значение. Это для расширения кругозора.

GET_PARAMETER_VALUE – функция возвращает пользователю значение указанного параметра инициализации (init.ora). Пользователь попытается получить его следующими методами :

SQL> show parameter utl_file_dir;
ORA-00942: table or view does not exist


SQL> select * from v$parameter where name='UTI_file_dir';
select * from v$parameter where name='UTI_file_dir'
              *
ERROR at line 1:
ORA-00942: table or view does not exist

Но как видим у него ничего не выходит. А если попробовать таким способом:

SQL> set serveroutput on;
SQL> Declare
  2      Intval number;
  3      Strval varchar2 (500);
  4      Begin
  5       If (dbms_utility.get_parameter_value('utl_file_dir', intval,strval)=0)
  6      Then dbms_output.put_line('value ='||intval);
  7      Else dbms_output.put_line('value = '||strval);
  8      End if;
  9      End;
 10  /
value = /tmp/b

PL/SQL procedure successfully completed.

Как мы видим, попытка была успешной.

Только есть одно большое НО!! Если параметр имеет несколько значений, то функция выдает только первое значение. Логические значения функция выдает как 0 или 1.

В пакете есть две интересные процедуры:

PROCEDURE comma_to_table( list   IN  VARCHAR2,
                            tablen OUT BINARY_INTEGER,
                            tab    OUT uncl_array);


PROCEDURE table_to_comma( tab    IN  uncl_array,
                            tablen OUT BINARY_INTEGER,
                            list   OUT VARCHAR2);

Эти процедуры преобразуют список идентификаторов (нужно использовать только допустимые) через запятую в pl/sql –таблицу и наоборот. Вот вам примерчик:

SQL> set serveroutput on
SQL>  declare
  2    l_tablen number;
  3    l_tab dbms_utility. uncl_array;
  4    begin
  5    dbms_utility.comma_to_table('asd,fgh,jkl,qwe',l_tablen,l_tab);
  6    dbms_output.put_line('value3:'|| l_tab(3)||' len='||l_tablen);
  7    end;
  8  /
value3:jkl len=4

PL/SQL procedure successfully completed.

Процедура PROCEDURE db_version(version OUT VARCHAR2,compatibility OUT VARCHAR2)

И функция FUNCTION port_string RETURN VARCHAR2;

предназначены получения версии сервера и название операционной системы.

SQL> Declare
  2  Version varchar2(100);
  3  Compatibility  varchar2(100);
  4  Begin 
  5  Dbms_utility.db_version(version,compatibility);
  6  Dbms_output.put_line('oracle :'||version||' -'||compatibility);
  7  Select Dbms_utility.port_string into version from dual;
  8  
  9  
 10  Dbms_output.put_line('oc :'||version);
 11  End;
 12  /
oracle :9.2.0.4.0 -9.2.0.0.0
oc :IA64/Linux 2.4.xx

PL/SQL procedure successfully completed.

Функция function get_hash_value(name varchar2, base number, hash_size number) return number предназначена для хеширования переданной строки, то есть получения числового значения по строке.

SQL> Select Dbms_utility. get_hash_value ('1234567890987654321',0,32) from dual;

DBMS_UTILITY.GET_HASH_VALUE('1234567890987654321',0,32)
-------------------------------------------------------
                                                     16

2 комментария

Прокоментировать

StayAtHome
8 апреля 2010 г. в 16:21

>Хочу заметить, что представления этой процедурой не компилируются.
Попробовал на 10.2.0.4 -- скомпилировала и представление. Информация устарела?

dbstalker
8 апреля 2010 г. в 17:37

Спасибо! Вы правы. В oracle 10g процедура dbms_utility.compile_schema компилирует и представления !Проверено.

 

Новый комментарий

Я не спамер: введите суму 7+7



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Шины бу
26 апреля, 2 ответа
Потрібна порада
25 апреля, 2 ответа
Посоветуйте адвоката
25 апреля, 1 ответа