我们有一个脚本可以在Oracle 12.1.0.2.0数据库上创建许多新的Oracle包,触发器,视图和函数。
之后,编译所有这些对象。我们首先使用DBMS_UTILITY.COMPILE_SCHEMA来编译所有这些对象。但是,COMPILE_SCHEMA不会添加调试信息。我们还想添加调试信息。
最好的方法是什么?这是我们目前的算法:
在这种情况下,所有对象都被编译两次,这显然不是最佳的。有很多对象所以需要很长时间。我们希望加快速度。
是否有可用的功能与DBMS_UTILITY.COMPILE_SCHEMA相同,但包含调试信息?
答案 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;