首页 > 解决方案 > 如何使用 get_ddl 获取分区脚本?

问题描述

我使用 Oracle 12c 作为数据库并使用以下方法获取表或其他对象的 ddl:-

dbms_metadata.get_ddl('TABLE','TABLE_NAME','SCHEMA_NAME');

与我正在使用的约束和参考约束相同:-

dbms_metadata.get_dependent_ddl('CONSTRAINT','TABLE_NAME','SCHEMA_NAME');
dbms_metadata.get_dependent_ddl('REF_CONSTRAINT','TABLE_NAME','SCHEMA_NAME');

现在我的问题是我想从表中提取分区脚本,我尝试了以下操作:-

select dbms_metadata.get_dependent_ddl('PARTITIONING','TABLE_NAME','SCHEMA_NAME') from dual;

但它给出了以下错误: -

ORA-31600: invalid input value PARTITIONING for parameter OBJECT_TYPE in function GET_DEPENDENT_DDL
ORA-06512: at "SYS.DBMS_METADATA", line 6069
ORA-06512: at "SYS.DBMS_METADATA", line 8761
ORA-06512: at line 1
31600. 00000 -  "invalid input value %s for parameter %s in function %s"
*Cause:    A NULL or invalid value was supplied for the parameter.
*Action:   Correct the input value and try the call again.

我也试过:-

select dbms_metadata.get_ddl('PARTITION','PARTITION_NAME','SECONDARYUSER') from dual;

但它给出了同样的错误。

请建议我如何在 oracle 中使用 get_ddl 方法获取分区 ddl。

标签: oracleoracle-sqldeveloperoracle12cpartitioning

解决方案


分区是一个表选项,而不是一个单独的对象。默认情况下,GET_DDL对于一个表应该产生分区信息。如果没有,您可能有一个会话转换正在禁用它。这两个语句肯定会生成一个包含所有分区选项的 DDL 脚本:

begin
    dbms_metadata.set_transform_param(dbms_metadata.session_transform,'PARTITIONING',true);
end;
/

select dbms_metadata.get_ddl('TABLE','TABLE_NAME','SCHEMA_NAME') from dual;

如果您正在寻找一种自动生成将表从非分区表转换为分区表的脚本的方法,那么恐怕您不走运。尽管 12c 能够使用 转换表ALTER TABLE,但该软件包DBMS_METADATA_DIFF显然尚未更新以理解这些命令。

例如,如果您创建带有或不带有分区的同一个表,则此脚本不起作用:

select dbms_metadata_diff.compare_alter(object_type => 'TABLE', name1 => 'TABLE2', name2 => 'TABLE1') diffs from dual;

DIFFS
--------------------------------------------------------------
-- ORA-39266: Cannot alter unpartitioned table to partitioned.
  ALTER TABLE "JHELLER"."TABLE2" RENAME TO "TABLE1"

幸运的是,在某些情况下,ALTER语法似乎很简单。在我的简单示例中,我可以使用如下命令将表更改为分区:

alter table unpartitioned_table modify
[partitioning clause]
online;

推荐阅读