Oracle SQL Developer从包中删除模式名称

时间:2016-11-07 10:14:29

标签: oracle-sqldeveloper

所以我写了:

create or replace package body schema_name.package_name

并且只要我按下编译,应用程序就会删除模式名称,将其替换为白色空格,如下所示:

create or replace package body             package_name

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

2 个答案:

答案 0 :(得分:4)

SQL Developer不是那样做的。如果您通过SQL * Plus创建包,然后查询dba_source(或所有/用户变体),您将看到该名称已被删除,以及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 Developer的对象查看器始终将create or replace放入其中 - 但也注意到它始终包含or replace,即使您最初没有在代码中使用dbms_metadata.get_ddl 。如果它没有,那么你当然无法重新编译它。

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. 包默认重新添加模式名称,并引用标识符;但是在这个过程中也失去了额外的空白:

{{1}}

但是,SQL Developer的对象视图似乎没有任何方式可以显示或重新添加模式名称。

答案 1 :(得分:0)

如果您进行编译/重新编译,它不会保留架构名称。但是,如果您选择通过SQL Developer导出程序包文件,则可以选择包含架构,并且该架构会重新添加到导出中。

为什么在编辑器空间中将其删除,我不确定其背后的逻辑。