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

Posted

技术标签:

【中文标题】Oracle SQL Developer 从包中删除模式名称【英文标题】:Oracle SQL Developer removes schema name from package 【发布时间】:2016-11-07 10:14:29 【问题描述】:

所以我写了:

create or replace package body schema_name.package_name

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

create or replace package body             package_name

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

【问题讨论】:

【参考方案1】:

这不是 SQL Developer 做的。如果您通过 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 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.

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

【讨论】:

尽管我对结果感到失望,但我非常感谢您的回答。 @MladenOršolić - 你可以随时在SQL Developer forum 上提出它,看看它是否会成为未来的改进。 我实际上可能会,因为我们刚刚将它与 TOAD 的行为进行了比较,并且在 TOAD 中它按预期工作。如果您编写模式名称,它会在重新编译/重新打开后保留在那里。【参考方案2】:

如果您编译/重新编译,它不会保留模式名称。但是,如果您选择通过 SQL Developer 导出包文件,则可以选择包含架构并将其添加回导出中。

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

【讨论】:

以上是关于Oracle SQL Developer 从包中删除模式名称的主要内容,如果未能解决你的问题,请参考以下文章

如何从包中删除过程或函数

从包中检索当前应用程序版本

使用输入参数从包中调用所需的过程

如何从包中的兄弟模块导入?

戈朗。从包中只导入一个文件

从包中选择随机元组