【日志】dbms_metadata.get_ddl

 

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

首先我们先做个实验
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

SQL>
这里我们发现我们重现了这个错误,究竟是为什么呢?根据提示我们知道是由于参数的问题导致的。
我们知道我们要查的东西是没有写错的,就是改个大小写吧,我们改了我们要查的表名。结果呢?

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

SQL>
结果还是不对。我们继续做实验,把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>
问题依旧,我们最后把所有的参数都改成了大写,现在是什么结果呢,让我们都很高兴的,我们看到了我们想要的东西了^_^
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

SQL>
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

SQL>

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

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7351078/viewspace-621050/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7351078/viewspace-621050/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值