所以我写了:
create or replace package body schema_name.package_name
并且只要我按下编译,应用程序就会删除模式名称,将其替换为白色空格,如下所示:
create or replace package body package_name
有谁知道如何摆脱这种恼人的行为?
答案 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导出程序包文件,则可以选择包含架构,并且该架构会重新添加到导出中。
为什么在编辑器空间中将其删除,我不确定其背后的逻辑。