使用调试信息编译 Oracle 模式

Roe*_*oel 5 oracle

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

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

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

  1. 创建所有对象
  2. 在调试模式下一一编译所有对象。这使得许多对象无效,这些对象引用了列表中后面的对象。
  3. 使用 DBMS_UTILITY.COMPILE_SCHEMA 重新编译所有内容,以便所有对象都有效。

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

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

Ale*_*ole 4

正如文档中提到的:

\n\n
\n

调试

\n\n

与 \xe2\x80\x94 具有相同的效果,PLSQL_OPTIMIZE_LEVEL=1指示 PL/SQL 编译器生成并存储代码以供 PL/SQL 调试器使用。Oracle 建议使用PLSQL_OPTIMIZE_LEVEL=1而不是 DEBUG。

\n
\n\n

因此,您可以在创建对象之前或重新编译架构之前进行设置。不过,为了匹配 SQL Developer 在“编译调试”时执行的操作,您PLSQL_DEBUG还需要设置为 true。这是一个快速演示:

\n\n
create or replace package p42 as\n  function f return number;\nend p42;\n/\n\ncreate or replace package body p42 as\n  function f return number is\n  begin\n    return 42;\n  end f;\nend p42;\n/\n\nselect name, type, plsql_optimize_level, plsql_debug\nfrom user_plsql_object_settings where name = \'P42\';\n\nNAME                           TYPE         PLSQL_OPTIMIZE_LEVEL PLSQL_DEBUG\n------------------------------ ------------ -------------------- -----------\nP42                            PACKAGE                         2 FALSE       \nP42                            PACKAGE BODY                    2 FALSE       \n\n\nalter session set plsql_optimize_level = 1;\nalter session set plsql_debug = true;\n\nexec dbms_utility.compile_schema(user);\n\nselect name, type, plsql_optimize_level, plsql_debug\nfrom user_plsql_object_settings where name = \'P42\';\n\nNAME                           TYPE         PLSQL_OPTIMIZE_LEVEL PLSQL_DEBUG\n------------------------------ ------------ -------------------- -----------\nP42                            PACKAGE                         1 TRUE        \nP42                            PACKAGE BODY                    1 TRUE        \n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,您可以在首先创建对象之前更改会话,但是如果您知道无论如何您都会重新编译架构 - 如果您必须重新编译所有内容,而不仅仅是无效对象 - 那么等到那时也许可以。但是,如果您确实在启用调试的情况下创建对象,您仍然可以使用以下命令重新编译并保留它:

\n\n
DBMS_UTILITY.COMPILE_SCHEMA(schema => user, reuse_settings => true);\n
Run Code Online (Sandbox Code Playgroud)\n\n

...如果您想重新编译所有内容,或者只想重新编译无效对象:

\n\n
DBMS_UTILITY.COMPILE_SCHEMA(schema => user, compile_all => false, reuse_settings => true);\n
Run Code Online (Sandbox Code Playgroud)\n