使用调试信息编译Oracle模式

时间:2015-01-06 15:10:06

标签: oracle

我们有一个脚本可以在Oracle 12.1.0.2.0数据库上创建许多新的Oracle包,触发器,视图和函数。

之后,编译所有这些对象。我们首先使用DBMS_UTILITY.COMPILE_SCHEMA来编译所有这些对象。但是,COMPILE_SCHEMA不会添加调试信息。我们还想添加调试信息。

最好的方法是什么?这是我们目前的算法:

  1. 创建所有对象
  2. 逐个编译调试模式下的所有对象。这使得许多对象无效,这些对象引用了列表中稍后出现的对象。
  3. 使用DBMS_UTILITY.COMPILE_SCHEMA重新编译所有内容,以便所有对象都有效。
  4. 在这种情况下,所有对象都被编译两次,这显然不是最佳的。有很多对象所以需要很长时间。我们希望加快速度。

    是否有可用的功能与DBMS_UTILITY.COMPILE_SCHEMA相同,但包含调试信息?

2 个答案:

答案 0 :(得分:3)

the documentation中所述:

  

DEBUG

     

PLSQL_OPTIMIZE_LEVEL=1具有相同的效果 - 指示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);

答案 1 :(得分: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;