我们有一个脚本,可以在 Oracle 12.1.0.2.0 数据库上创建许多新的 Oracle 包、触发器、视图和函数。
之后,所有这些对象都被编译。我们首先使用 DBMS_UTILITY.COMPILE_SCHEMA 来编译所有这些对象。但是,COMPILE_SCHEMA 不添加调试信息。我们还想添加调试信息。
最好的方法是什么?这是我们当前的算法:
在这种情况下,所有对象都被编译两次,这显然不是最佳的。对象很多,所以需要很长时间。我们想加快速度。
是否有任何可用的功能与 DBMS_UTILITY.COMPILE_SCHEMA 相同,但包含调试信息?
正如文档中提到的:
\n\n\n\n\n调试
\n\n与 \xe2\x80\x94 具有相同的效果,
\nPLSQL_OPTIMIZE_LEVEL=1指示 PL/SQL 编译器生成并存储代码以供 PL/SQL 调试器使用。Oracle 建议使用PLSQL_OPTIMIZE_LEVEL=1而不是 DEBUG。
因此,您可以在创建对象之前或重新编译架构之前进行设置。不过,为了匹配 SQL Developer 在“编译调试”时执行的操作,您PLSQL_DEBUG还需要设置为 true。这是一个快速演示:
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 \nRun Code Online (Sandbox Code Playgroud)\n\n当然,您可以在首先创建对象之前更改会话,但是如果您知道无论如何您都会重新编译架构 - 如果您必须重新编译所有内容,而不仅仅是无效对象 - 那么等到那时也许可以。但是,如果您确实在启用调试的情况下创建对象,您仍然可以使用以下命令重新编译并保留它:
\n\nDBMS_UTILITY.COMPILE_SCHEMA(schema => user, reuse_settings => true);\nRun Code Online (Sandbox Code Playgroud)\n\n...如果您想重新编译所有内容,或者只想重新编译无效对象:
\n\nDBMS_UTILITY.COMPILE_SCHEMA(schema => user, compile_all => false, reuse_settings => true);\nRun Code Online (Sandbox Code Playgroud)\n