dbms_metadata.get_ddl表结构

我们想要查看某个表或者是表空间的DDL的时候,我们就可以利用dbms_metadata.get_ddl这个包来查看。
可是很容易出现ORA-31600: invalid input value table for parameter OBJECT_TYPE in function GET_DDL的错误
在这给大家用实例的方法来解答。

首先我们先做个实验

[cce_c]
SQL> select dbms_metadata.get_ddl('table','table_dbms') from dual;
ERROR:
ORA-31600: invalid input value table for parameter OBJECT_TYPE in function GET_DDL
ORA-06512: at "SYS.DBMS_METADATA", line 2682
ORA-06512: at "SYS.DBMS_METADATA", line 2733
ORA-06512: at "SYS.DBMS_METADATA", line 4333
ORA-06512: at line 1
no rows selected
Elapsed: 00:00:00.07
[/cce_c]

这里我们发现我们重现了这个错误,究竟是为什么呢?根据提示我们知道是由于参数的问题导致的。
我们知道我们要查的东西是没有写错的,就是改个大小写吧,我们改了我们要查的表名。结果呢?
SQL> select dbms_metadata.get_ddl(‘table’,’TABLE_DBMS’) FROM DUAL;
ERROR:
ORA-31600: invalid input value table for parameter OBJECT_TYPE in function GET_DDL
ORA-06512: at “SYS.DBMS_METADATA”, line 2682
ORA-06512: at “SYS.DBMS_METADATA”, line 2733
ORA-06512: at “SYS.DBMS_METADATA”, line 4333
ORA-06512: at line 1
no rows selected
Elapsed: 00:00:00.04
结果还是不对。我们继续做实验,把TABLE改了。
SQL> select dbms_metadata.get_ddl(‘TABLE’,’table_dbms’) from dual;
ERROR:
ORA-31603: object “table_dbms” of type TABLE not found in schema “ORACTL”
ORA-06512: at “SYS.DBMS_METADATA”, line 1548
ORA-06512: at “SYS.DBMS_METADATA”, line 1585
ORA-06512: at “SYS.DBMS_METADATA”, line 1902
ORA-06512: at “SYS.DBMS_METADATA”, line 2793
ORA-06512: at “SYS.DBMS_METADATA”, line 4333
ORA-06512: at line 1

no rows selected
Elapsed: 00:00:00.02
问题依旧,我们最后把所有的参数都改成了大写,现在是什么结果呢,让我们都很高兴的,我们看到了我们想要的东西了^_^
SQL> select dbms_metadata.get_ddl(‘TABLE’,’TABLE_DBMS’) FROM DUAL;

DBMS_METADATA.GET_DDL(‘TABLE’,’TABLE_DBMS’)
——————————————————————————–

Create TABLE “ORACTL”.”TABLE_DBMS”
(    “ID” NUMBER(*,0),
“NAME” CHAR(10)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE “ORACTL_DB”

Elapsed: 00:00:00.33

DBMS_METADATA.GET_DDL 默认的是查看当前用户的信息,如果你以用户A来查看用户B的表要在dbms_metadata.get_ddl的第三个参数里加上表/表空间的属主,否则 就会报ORA-31603: object “TABLE_DBMS” of type TABLE not found in schema “ORACTL”的错误。
下面的例子就是我们在SYSDBA下看用户ORACTL表TABLE_DBMS的DDL结果
SQL> conn /as sysdba
Connected.
SQL> select dbms_metadata.get_ddl(‘TABLE’,’TABLE_DBMS’,’ORACTL’) from dual;

DBMS_METADATA.GET_DDL(‘TABLE’,’TABLE_DBMS’,’ORACTL’)
——————————————————————————–

Create TABLE “ORACTL”.”TABLE_DBMS”
(    “ID” NUMBER(*,0),
“NAME” CHAR(10)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE “ORACTL_DB”

SQL>

有的时候你会发现得到的结果明显是有问题,少了很多想要的信息,这时候就改动下你的显示长度,因为SQL * PLUS 默认的long是80。所以你要用set long 9999来设置你要显示的长度,上面的例子是set long 10000的结果,下面是set long 100 的例子。
SQL> set long 100
SQL> select dbms_metadata.get_ddl(‘TABLE’,’TABLE_DBMS’,’ORACTL’) from dual;

DBMS_METADATA.GET_DDL(‘TABLE’,’TABLE_DBMS’,’ORACTL’)
——————————————————————————–

Create TABLE “ORACTL”.”TABLE_DBMS”
(    “ID” NUMBER(*,0),
“NAME” CHAR(10)
) PCTFREE 10 PCTUSE

在这总结下
1)dbms_metadata.get_ddl()包()内的参数都要大写
2)是否查的当前用户的DDL,不是要加上对象的属主信息。
3)看得到的信息是否都显示出来了?看看你的终端设置是否正确,set long 9999(随便设置他的大小,就是为了完全显示查找的结果)

来源链接:http://space.itpub.net/7351078/viewspace-621050

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注