Программирование >>  Oracle 

1 ... 429 430 431 [ 432 ] 433 434 435 ... 469


Пакет DBMS UTILITY 1719

того, какие объекты мы пытались перекомпилировать. Необходимо использовать конструкцию ON COMMIT PRESERVE ROWS, поскольку предполагается выполнять в процедурах операторы ЯОД (оператор ALTER COMPILE относится к операторам ЯОД), а после выполнения каждого такого оператора транзакция фиксируется. Теперь можно переходить к процедурам:

create or replace

procedure get next object to compile(p username in varchar2,

p cmd out varchar2 , p obj out varchar2 , p typ out varchar2)

begin

select alter object type

p username . object name decode(object type, PACKAGE BODY, compile body, compile), object name, object type into p cmd, p obj , p typ from dba objects a where owner = upper(p username) and status = INVALID and object type <> UNDEFINED and not exists (select null

from compile schema tmp b where a.object name = b.object name and a.object type = b.object type

and rownum = 1;

insert into compile schema tmp (object name, object type) values

(p obj , p typ) ;

end;

Это процедура с правами создателя, с помощью которой мы будем обращаться к представлению DBA OBJECTS. Она будет возвращать некий недействительный объект для перекомпиляции, если мы еще не пытались его компилировать. Процедура просто находит первый такой объект. По мере выбора мы запоминаем эти объекты во временной таблице. Процедура возбуждает исключительную ситуацию NO DATA FOUND, когда в запрошенной схеме не остается объектов, требующих перекомпиляции. Этот факт будет использоваться в следующей процедуре для прекращения обработки. Затем мы создадим процедуру с правами вызывающего, которая будет фактически выполнять компиляцию. Это объясняет, зачем в представленном выше коде понадобилась директива COLUMN U NEW VAL UNAME - необходимо вставить имя владельца временной таблицы, чтобы избежать использования синонима. Поскольку мы делаем это динамически при компиляции процедуры, это решение лучше, чем использование синонима:

create or replace procedure compile schema(p username in varchar2) authid current user



1720

Приложение

l and varchar2(512);

l obj dba objects.object name%type;

l typ dba objects.object type%type;

begin

delete from &uname..compile schema tmp;

loop

get next object to compile(p username, l cmd, l obj, l typ);

dbms output.put line(l cmd);

begin

execute immediate l cmd; dbms output.put line(Успешно); exception

when others then

dbms output.put line(sqlerrm);

end;

dbms output.put line(chr(9)); end loop;

exception

- процедура get next object to compile возбуждает эту

- исключительную ситуацию, когда завершает работу when no data found then NULL;

end;

grant execute on compile schema to public

Вот и все. Теперь можно переходить в любую схему, где есть компилируемые объекты, и выполнять:

scott@TKYTE816> exec tkyte.compile schema(scott) alter PROCEDURE scott.ANALYZE MY TABLES compile Успешно

alter PROCEDURE scott.CUST LIST compile ORA-24344: success with compilation error

alter TYPE scott.EMP MASTER compile ORA-24344: success with compilation error

alter PROCEDURE scott.FOO compile Успешно

alter PACKAGE scott.LOADLOBS compile Успешно

alter PROCEDURE scott.P compile Успешно

alter PROCEDURE scott.RUN BY JOBS compile Успешно

PL/SQL procedure successfully completed.



Пакет DBMS UTILITY 1721

Итак, процедуравыдает информацию о том, какие объекты она пытается компилировать, и результат компиляции. Судя по полученному результату, компилировалось семь объектов: при компиляции двух произошла ошибка, остальные пять успешно скомпилированы. Объекты компилировались в произвольном порядке - порядок просто не имеет значения. Эта процедура работает во всех версиях сервера.

Процедура ANALYZE SCHEMA

Процедура ANALYZE SCHEMA делает именно то, что можно предположить по ее названию, - выполняет операторы ANALYZE для сбора статистической информации об объектах в пользовательской схеме. Не рекомендуется применять ее для схем SYS или SYSTEM. В особенности не надо этого делать для схемы SYS, поскольку рекурсивные SQL-операторы, которые СУБД Oracle генерирует уже многие годы, оптимизированы для обработки оптимизатором, основанным на правилах. При наличии статистической информации о таблицах в схеме SYS сервер будет работать медленнее, чем мог бы. Эту процедуру можно использовать для анализа созданных пользователями прикладных схем.

Процедура ANALYZE SCHEMA принимает пять аргументов.

SCHEMA. Схема, которую необходимо проанализировать.

METHOD. ESTIMATE, COMPUTE или DELETE. Если передано значение ESTIMATE, то одно из значений: ESTIMATE ROWS, ESTIMATE PERCENT

должно быть ненулевым.

ESTIMATE ROWS. Количество оцениваемых строк.

ESTIMATE PERCENT. Процент оцениваемых строк. Если передано ненулевое значение параметра ESTIMATEROWS, этот параметр игнорируется.

METHOD OPT [PORTABLE] [FOR ALL [INDEXED] COLUMNS] [SIZE n] [FORALL INDEXES]. Это те же опции, что используются в операторе ANALYZE. Они подробно описаны в руководстве OracleSi SQL Reference, в разделе, посвященном конструкции FOR оператора ANALYZE.

Итак, например, все объекты в пользовательской схеме SCOTT можно проанализировать следующим образом. Начнем с удаления статистической информации, а затем соберем ее снова:

scott@TKYTE816> exec dbms utility.analyze schema(user, delete); PL/SQL procedure successfully completed.

scott@TKYTE816>selecttable name,num rows, last analyzed 2 from user tables;

TABLE NAME NUM ROWS LAST ANAL

BONUS

CREATE$JAVA$LOB$TABLE DEPT



1 ... 429 430 431 [ 432 ] 433 434 435 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика