|
Программирование >> Oracle
Пакет 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
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |