oracle 生成的SQL Developer和自定义类型的Code字段之间不匹配

cuxqih21  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(99)

我正在使用SQL Developer管理Oracle数据库。我的项目很旧,从头开始创建数据库的文件丢失了,所以我使用了SQL Developer的"数据库导出"工具来提取数据库的文件。我还在某些表中使用了一些自定义类型,以便将矢量数据保存在某些列中。
现在,我注意到在SQL Developer生成的sql文件中,创建自定义类型的命令是:

CREATE OR REPLACE EDITIONABLE TYPE "MY_TYPE" AS TABLE OF  NUMBER;

而从该SQL文件恢复数据库后,SQL Developer中该类型的"代码"字段为:

create or replace TYPE             "MY_TYPE" AS TABLE OF  NUMBER;

首先,为什么所有这些格式错误(空格和小写字母)都存在?为什么EDITIONABLE关键字消失了?
我目前也在为这种类型添加文档,我应该使用第一个版本还是第二个版本来添加注解?

ilmyapht

ilmyapht1#

有两件事在起作用,其中一个你通常不会看到。
例如,考虑一张table。您的脚本可能是:

SQL> create table t ( x int );

Table created.

但是如果你从数据库中请求该表的 *,你会得到这样的结果:

SQL> select dbms_metadata.get_ddl('TABLE','T') from dual;

DBMS_METADATA.GET_DDL('TABLE','T')
-----------------------------------------------------------
CREATE TABLE "SCOTT"."T"
   (    "X" NUMBER(*,0)
   )  DEFAULT COLLATION "USING_NLS_COMP" SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  TABLESPACE "USERS"

还有更多的东西,因为数据库是从存储在数据库中的属性中构建的。它给出了 * 完整的 * 定义,包括所有的默认子句等。
当然,除非您保存了 * 您的 * 原始脚本,否则您会简单地认为来自数据库的数据库 * 就是 * 脚本。
使用TYPE(或任何PL/SQL代码),与上面的TABLE示例不同,数据库确实保存了原始代码(因为它是源代码)。
所以当我做类似这样的事情时:

SQL> create or replace
  2  type mytype as TABLE of number;
  3  /

Type created.

你输入的文本被保存了下来我们可以在这里看到:

SQL> select text
  2  from user_source
  3  where name = 'MYTYPE';

TEXT
--------------------------------
type mytype as TABLE of number;

因此,现在(与表不同)我们有两个选项来为您的类型对象提供参数。
我们可以从头开始 * 构建 * 这个函数,就像我们对上表所做的那样:

SQL> select dbms_metadata.get_ddl('TYPE','MYTYPE') from dual;

DBMS_METADATA.GET_DDL('TYPE','MYTYPE')
-------------------------------------------
CREATE OR REPLACE EDITIONABLE TYPE "MCDONAC"."MYTYPE" as TABLE of number;

或者我们可以从USER_SOURCE中抓取你的代码,并在前面加上“create or replace”:

SQL> select 'create or replace '||text
  2  from user_source
  3  where name = 'MYTYPE';

'CREATEORREPLACE'||TEXT
--------------------------------------------------
create or replace type mytype as TABLE of number;

因此,你看到的两个结果。
您可以争辩说DBMS_METADATA的“完整”配置是“最”正确的,但这实际上是一个主观的争论,而不是铁一般的争论。

相关问题