Oracle SQL 开发人员从程序包中删除模式名称

Oracle SQL Developer removes schema name from package

所以我写了:

create or replace package body schema_name.package_name

只要我按下编译,应用程序就会删除架构名称,用这样的空格替换它:

create or replace package body             package_name

有谁知道如何摆脱这种恼人的行为?

这不是 SQL 开发人员做的。如果您通过 SQL*Plus 创建包,然后查询 dba_source(或 all/user 变体),您将看到名称以及 create or replace 文本已被删除:

SQL> create or replace package my_schema.package_name as
  2  end;
  3  /

Package created.

SQL> select text from sys.dba_source
  2  where type = 'PACKAGE' and owner = 'MY_SCHEMA' and name = 'PACKAGE_NAME'
  3  order by line;

TEXT
--------------------------------------------------------------------------------
package           package_name as
end;

2 rows selected.

所有者不是包源的一部分,它单独存储在数据字典中(dba_objects.owner 等)。解析器正在删除所有者,因为它不属于那里,作为数据库中实际存在的对象的一部分。作为纯粹的外部源代码,它确实存在(或者无论如何都可能存在),并且您在源代码管理中拥有的版本可以在适当的情况下保留它;但作为该架构中定义的对象的一部分,它没有任何意义。

您可能还会注意到,如果您尝试从对象查看器在另一个模式中创建对象,它会告诉您模块已重命名并尝试重新打开对象查看器。

不过,有趣的是,所有者名称被替换为空格(如果引用了模式名称,则包括两个双引号)而不是完全删除。同样有趣的是,SQL 开发人员的对象查看器总是将 create or replace 放入 - 但还要注意它总是包含 or replace,即使您最初的代码中没有它。如果没有,那么您当然无法重新编译它。

dbms_metadata.get_ddl包默认重新添加schema名称,并引用标识符;但也会在此过程中丢失额外的空格:

SQL> select dbms_metadata.get_ddl('PACKAGE', 'PACKAGE_NAME', 'MY_SCHEMA') from dual;

DBMS_METADATA.GET_DDL('PACKAGE','PACKAGE_NAME','MY_SCHEMA')
--------------------------------------------------------------------------------

  CREATE OR REPLACE PACKAGE "MY_SCHEMA"."PACKAGE_NAME" as
end;


1 row selected.

SQL开发人员的对象视图似乎没有任何方法可以显示或重新添加架构名称。

如果您 compile/recompile,它不会保留架构名称。但是,如果您选择通过 SQL Developer 导出包文件,则有一个选项可以包含架构,它将在导出时添加回来。

为什么它在编辑器中被删除 space,我不确定这背后的逻辑。