按照順序或依賴關系重新編譯失效的對象

許多情況下,由于數據庫的變更或遷移,會導致數據庫中的對象失效。由于對象之間可能存在複雜的倚賴關系,所以手工編譯通常無法順利通過。 本文將詳細將詳細介紹Oracle提供的一個用于按照順序/依賴關系重新編譯失效對象的腳本。

腳本:

$ORACLE_HOME/rdbms/admin/utlrp.sql

其中會調用:

$ORACLE_HOME/rdbms/admin/utlrcmp.sql

在utlrp.sql腳本中,Oracle的注釋:

Rem utlrp.sql - UTiLity script Recompile invalid Pl/sql modules

Rem

Rem DESCRIPTION

Rem This is a fairly general script that can be used at any time to

Rem recompile all existing invalid PL/SQL modules in a database.

Rem

Rem If run as one of the last steps during migration/upgrade/downgrade

Rem (see the README notes for your current release and the Oracle

Rem Migration book), this script will validate all PL/SQL modules

Rem (procedures, functions, packages, triggers, types, views, libraries)

Rem during the migration step itself.

Rem

Rem Although invalid PL/SQL modules get automatically recompiled on use,

Rem it is useful to run this script ahead of time (e.g. as one of the last

Rem steps in your migration), since this will either eliminate or

Rem minimize subsequent latencies caused due to on-demand automatic

Rem recompilation at runtime.

Rem

Rem Oracle highly recommends running this script towards the end of

Rem of any migration/upgrade/downgrade.

注:上面這個示例是一個通用腳本,可以在任意時候運行以重新編譯數據庫失效對象。通常我們會在Oracle的升級指導中看到這個腳本,Oracle強烈推薦在migration/upgrade/downgrade之後,通過運行此腳本編譯失效對象。 但是注意,Oracle提醒,此腳本需要用SQLPLUS以SYSDBA身份運行,並且當時數據庫中最好不要有活動事物或DDL操作,否則極容易導致死鎖的出現(這是很容易理解的)。 只要仔細閱讀一下utlrcmp.sql腳本,大家就會知道Oracle的具體操作方式了。

 
用DBMS_DDL包重新編譯PL/SQL對象
用DBMS_DDL包重新編譯PL/SQL對象
  ALTER_COMPILE過程   這個過程等價于如下語句   ALTER PROCEDUREFUNCTIONPACKAGE [.] COMPILE   語法   DBMS_DDL.ALTER_COMPILE (   type  VARCHAR2,   schema VARCHAR2,    name  VARCHAR2); ...查看完整版>>用DBMS_DDL包重新編譯PL/SQL對象
 
用DBMS_DDL包重新編譯PL/SQL對象
用DBMS_DDL包重新編譯PL/SQL對象
  ALTER_COMPILE過程   這個過程等價于如下語句   ALTER PROCEDUREFUNCTIONPACKAGE [.] COMPILE   語法   DBMS_DDL.ALTER_COMPILE (   type  VARCHAR2,   schema VARCHAR2,    name  VARCHAR2); ...查看完整版>>用DBMS_DDL包重新編譯PL/SQL對象
 
Guru of the Week #7:編譯時期的依賴關系(Compile-time Dependences)
作者:Herb Sutter譯者:plpliuly/*此文是譯者出于自娛翻譯的GotW(Guru of the Week)系列文章第7篇,原文的版權是屬于Herb Sutter(著名的C++專家,"Exceptional C++"的作者)。此文的翻譯沒有征得原作者的同意,只供學...查看完整版>>Guru of the Week #7:編譯時期的依賴關系(Compile-time Dependences)
 
翻譯:Effective C++, 3rd Edition, Item 31: 最小化文件之間的編譯依賴(上)
Item 31: 最小化文件之間的編譯依賴作者:你進入到你的程序中,並對一個類的實現進行了細微的改變。提醒你一下,不是類的接口,只是實現,僅僅是 private 的東西。然後你重建(rebuild)這個程序,預計這個任務應該只...查看完整版>>翻譯:Effective C++, 3rd Edition, Item 31: 最小化文件之間的編譯依賴(上)
 
翻譯:Effective C++, 3rd Edition, Item 31: 最小化文件之間的編譯依賴(下)
當對象的引用和指針可以做到時就避免使用對象。僅需一個類型的聲明,你就可以定義到這個類型的引用或指針。而定義一個類型的對象必須要存在這個類型的定義。只要你能做到,就用對類聲明的依賴替代對類定義的依賴。注...查看完整版>>翻譯:Effective C++, 3rd Edition, Item 31: 最小化文件之間的編譯依賴(下)