gpt4 book ai didi

oracle - 使用调试信息编译 Oracle 模式

转载 作者:行者123 更新时间:2023-12-01 00:56:10 25 4
gpt4 key购买 nike

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

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

做到这一点的最佳方法是什么?这是我们当前的算法:

  • 创建所有对象
  • 将 Debug模式下的所有对象一一编译。这使得许多对象无效,这些对象引用了列表后面的对象。
  • 使用 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为真。这是一个快速演示:
    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

    当然,您可以首先在创建对象之前更改 session ,但是如果您知道无论如何都会重新编译模式 - 如果您必须重新编译所有内容,而不仅仅是无效对象 - 那么等到那时可能好的。但是,如果您确实在启用调试的情况下创建了对象,您仍然可以重新编译并保留它:
    DBMS_UTILITY.COMPILE_SCHEMA(schema => user, reuse_settings => true);

    ...如果您想重新编译所有内容,或者您​​只想重新编译无效对象:
    DBMS_UTILITY.COMPILE_SCHEMA(schema => user, compile_all => false, reuse_settings => true);

    关于oracle - 使用调试信息编译 Oracle 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27801466/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com