加入收藏 | 设为首页 | 会员中心 | 我要投稿 三明站长网 (https://www.0598zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用调试信息编译Oracle模式

发布时间:2021-01-18 06:15:48 所属栏目:百科 来源:网络整理
导读:我们有一个脚本,可以在Oracle 12.1.0.2.0数据库上创建许多新的Oracle包,触发器,视图和函数. 之后,编译所有这些对象.我们首先使用DBMS_UTILITY.COMPILE_SCHEMA来编译所有这些对象.但是,COMPILE_SCHEMA不会添加调试信息.我们还想添加调试信息. 最好的方法是

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

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

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

>创建所有对象
>逐个编译调试模式中的所有对象.这会使许多对象无效,这些对象引用了列表中稍后出现的对象.
>使用DBMS_UTILITY.COMPILE_SCHEMA重新编译所有对象,以便所有对象都有效.

在这种情况下,所有对象都被编译两次,这显然不是最佳的.有很多对象所以需要很长时间.我们希望加快速度.

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

解决方法

如 the documentation中所述:

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 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,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);

(编辑:三明站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读