使用调试信息编译 Oracle 模式
Compiling Oracle schema with debug info
我们有一个脚本可以在 Oracle 12.1.0.2.0 数据库上创建许多新的 Oracle 包、触发器、视图和函数。
之后,编译所有这些对象。我们首先使用 DBMS_UTILITY.COMPILE_SCHEMA 来编译所有这些对象。但是,COMPILE_SCHEMA 不添加调试信息。我们还想添加调试信息。
执行此操作的最佳方法是什么?这是我们当前的算法:
- 创建所有对象
- 在调试模式下将所有对象一一编译。这会使许多对象无效,这些对象引用了列表中后面出现的对象。
- 使用 DBMS_UTILITY.COMPILE_SCHEMA 重新编译所有内容,以便所有对象都有效。
在这种情况下,所有对象都被编译两次,这显然不是最优的。有很多对象,所以需要很长时间。我们想加快速度。
是否有与 DBMS_UTILITY.COMPILE_SCHEMA 功能相同但包含调试信息的可用工具?
DEBUG
Has the same effect as PLSQL_OPTIMIZE_LEVEL=1
—instructs the PL/SQL compiler to generate and store the code for use by the PL/SQL debugger. Oracle recommends using PLSQL_OPTIMIZE_LEVEL=1
instead of DEBUG.
因此您可以在创建对象之前或重新编译架构之前进行设置。但是,为了匹配 SQL 开发人员在您 'compile for debug' 时所做的事情,您还需要将 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);
你可以一个一个地改变对象
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;
我们有一个脚本可以在 Oracle 12.1.0.2.0 数据库上创建许多新的 Oracle 包、触发器、视图和函数。
之后,编译所有这些对象。我们首先使用 DBMS_UTILITY.COMPILE_SCHEMA 来编译所有这些对象。但是,COMPILE_SCHEMA 不添加调试信息。我们还想添加调试信息。
执行此操作的最佳方法是什么?这是我们当前的算法:
- 创建所有对象
- 在调试模式下将所有对象一一编译。这会使许多对象无效,这些对象引用了列表中后面出现的对象。
- 使用 DBMS_UTILITY.COMPILE_SCHEMA 重新编译所有内容,以便所有对象都有效。
在这种情况下,所有对象都被编译两次,这显然不是最优的。有很多对象,所以需要很长时间。我们想加快速度。
是否有与 DBMS_UTILITY.COMPILE_SCHEMA 功能相同但包含调试信息的可用工具?
DEBUG
Has the same effect as
PLSQL_OPTIMIZE_LEVEL=1
—instructs the PL/SQL compiler to generate and store the code for use by the PL/SQL debugger. Oracle recommends usingPLSQL_OPTIMIZE_LEVEL=1
instead of DEBUG.
因此您可以在创建对象之前或重新编译架构之前进行设置。但是,为了匹配 SQL 开发人员在您 'compile for debug' 时所做的事情,您还需要将 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);
你可以一个一个地改变对象
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;