2015-01-06 39 views
4

我們有一個腳本,可以在Oracle 12.1.0.2.0數據庫上創建大量新的Oracle軟件包,觸發器,視圖和函數。使用調試信息編譯Oracle模式

之後,所有這些對象都被編譯。我們首先使用DBMS_UTILITY.COMPILE_SCHEMA來編譯所有這些對象。但是,COMPILE_SCHEMA不會添加調試信息。我們也想添加調試信息。

這樣做的最好方法是什麼?這是我們目前的算法:

  1. 一個創建調試模式下一個所有對象
  2. 編譯所有對象。這會導致許多對象無效,這些對象引用了列表中稍後出現的對象。
  3. 使用DBMS_UTILITY.COMPILE_SCHEMA重新編譯所有對象,以便所有對象都有效。

在這種情況下,所有對象都編譯了兩次,這顯然不是最優的。有很多對象,所以需要很長時間。我們想加快速度。

是否有任何與DBMS_UTILITY.COMPILE_SCHEMA相同的功能,但包含調試信息?

+1

難道'DBMS_UTILITY.COMPILE_SCHEMA(模式=>用戶,compile_all =>假,reuse_settings => TRUE);'切下來了很多?或者如果你有很多依賴關係,可能會達到最大迭代限制? –

回答

3

the documentation提到:

DEBUG

具有相同的效果作爲PLSQL_OPTIMIZE_LEVEL=1 -instructs的PL/SQL編譯器生成和將代碼存儲用於由PL/SQL調試器使用。 Oracle建議使用PLSQL_OPTIMIZE_LEVEL=1而不是DEBUG。

因此,您可以在創建對象之前或在重新編譯架構之前設置該值。爲了與'編譯調試'時的SQL Developer相匹配,您還需要將PLSQL_DEBUG設置爲true。這裏有一個快速演示:

create or replace package p42 as 
    function f return number; 
end p42; 
/

create or replace package body p42 as 
    function f return number is 
    begin 
    return 42; 
    end f; 
end p42; 
/

select name, type, plsql_optimize_level, plsql_debug 
from user_plsql_object_settings where name = 'P42'; 

NAME       TYPE   PLSQL_OPTIMIZE_LEVEL PLSQL_DEBUG 
------------------------------ ------------ -------------------- ----------- 
P42       PACKAGE       2 FALSE  
P42       PACKAGE BODY     2 FALSE  


alter session set plsql_optimize_level = 1; 
alter session set plsql_debug = true; 

exec dbms_utility.compile_schema(user); 

select name, type, plsql_optimize_level, plsql_debug 
from user_plsql_object_settings where name = 'P42'; 

NAME       TYPE   PLSQL_OPTIMIZE_LEVEL PLSQL_DEBUG 
------------------------------ ------------ -------------------- ----------- 
P42       PACKAGE       1 TRUE   
P42       PACKAGE BODY     1 TRUE   

當然你可以在第一時間創建對象之前,改變你的會話,但如果你知道你要始終重新編譯架構無論如何 - 如果你必須重新編譯一切,而不僅僅是無效的對象 - 然後等到那時可能是好的。但是,如果你創建啓用調試的對象,你仍然可以重新編譯,並保留與:

DBMS_UTILITY.COMPILE_SCHEMA(schema => user, reuse_settings => true); 

...如果你想重新編譯的一切,或者如果你只是想重新編譯無效對象:

DBMS_UTILITY.COMPILE_SCHEMA(schema => user, compile_all => false, reuse_settings => true); 
+0

謝謝,它的工作原理:-) 我注意到文檔中的plsql_optimize_level,但我沒有設置plsql_debug = true。 – Roel

0

您可以更改對象逐一

SELECT PO.OWNER,PO.OBJECT_NAME,PO.OBJECT_TYPE,PO.DEBUGINFO 
,'ALTER ' || REPLACE(object_type,'PACKAGE BODY','PACKAGE') || ' ' || owner || '.' || object_name ||DECODE(object_type,'PACKAGE BODY',' COMPILE BODY;',' COMPILE;') COPILE_NO_DEBUG 
,'ALTER ' || REPLACE(object_type,'PACKAGE BODY','PACKAGE') || ' ' || owner || '.' || object_name ||DECODE(object_type,'PACKAGE BODY',' COMPILE DEBUG BODY;',' COMPILE DEBUG;') COPILE_WITH_DEBUG 
FROM SYS.ALL_PROBE_OBJECTS PO 
--WHERE OBJECT_NAME='YOUR_DEFINITION_PKG' AND DEBUGINFO IN ('F','T') 
ORDER BY owner, object_type, object_name;