【日志】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
    评论
### 回答1: dbms_metadata.get_ddl是一个Oracle数据库中的函数,用于获取指定对象的DDL(数据定义语言)。该函数可以用于获取表、视图、索引、约束、序列、存储过程等对象的DDL语句。使用该函数可以方便地将数据库对象的定义导出到脚本文件中,以便于备份、迁移、升级等操作。 ### 回答2: DBMS_METADATA.GET_DDL是一种在Oracle数据库中获取DDL(数据定义语言)的函数。DDL是一个数据库对象的定义,由注意事项和指令组成。DDL包括创建、修改和删除数据库的对象,例如表、视图、过程、约束等。 DBMS_METADATA.GET_DDL函数可以获取数据库对象的DDL语句,包括表、索引、序列、视图、存储过程等多种类型的对象。这个函数使用了Oracle内置的元数据接口,可以提供各种数据库对象的DDL语句,从而方便用户快速了解数据库结构。 当我们需要将数据库特定对象的定义从一个环境传递到另一个环境时,我们可以使用DBMS_METADATA.GET_DDL函数。例如,我们可以将表格、视图、过程和其他对象的DDL语句等通过此函数获得,然后将这些语句放在脚本或文件中,以进行备份、同步、升级或下一步操作。 此外,DBMS_METADATA.GET_DDL函数可以用于在Oracle数据库中查看DDL语句,以便更好地理解和分析数据库结构。使用该函数,可以快速获取库表对象的DDL语句,而无需浏览数据库中自动产生的DDL语句。同时,DBMS_METADATA.GET_DDL函数可以输出不同格式的DDL语句,包括简约格式、标准格式、XML格式和JSON格式等。 总之,DBMS_METADATA.GET_DDL函数为Oracle数据库提供了一种用户友好的方式来获取DDL语句。它可以方便地获取数据库对象的DDL语句,从而优化数据库管理和分析流程。 ### 回答3: dbms_metadata.get_ddl是一种Oracle数据库的元数据提取函数,它可以获取对象的SQL定义,包括表、索引、用户、触发器、存储过程等。这个函数有很多的应用场景,其中最常见的用途是进行数据库对象的备份和还原,以及进行数据库对象的比较和升级。 使用dbms_metadata.get_ddl函数,我们可以轻松地获取指定对象的DDL定义,例如: SELECT dbms_metadata.get_ddl('TABLE', 'MY_TABLE') FROM dual; 这个语句可以获取名为MY_TABLE的表的创建语句。同样,我们也可以通过指定不同的对象类型来获取相应的DDL定义,例如: SELECT dbms_metadata.get_ddl('INDEX', 'MY_INDEX') FROM dual; 这个语句可以获取名为MY_INDEX的索引的创建语句。 除了获取单个对象的DDL定义外,dbms_metadata.get_ddl函数还支持获取多个对象的DDL定义,例如: SELECT dbms_metadata.get_ddl('TABLE', t.table_name) FROM user_tables t; 这个语句可以获取当前用户下所有表的DDL定义。 需要注意的是,dbms_metadata.get_ddl函数有一定的局限性,它只能获取Oracle数据库内部定义的DDL语句,不支持获取用户自定义的DDL语句。此外,该函数也不能获取对象的数据内容,仅能获取对象的结构定义。 总之,dbms_metadata.get_ddl函数是非常实用的元数据提取函数,它可以方便地获取Oracle数据库对象的DDL定义。在进行数据库备份、还原、比较和升级时,使用该函数可以节省大量时间和精力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值