【问题标题】:How can i get partitioned script using get_ddl?如何使用 get_ddl 获取分区脚本?
【发布时间】:2019-12-22 11:44:42
【问题描述】:

我使用 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。

【问题讨论】:

    标签: oracle oracle-sqldeveloper oracle12c partitioning


    【解决方案1】:

    分区是一个表选项,而不是一个单独的对象。默认情况下,表的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;
    

    【讨论】:

      【解决方案2】:

      试试这个过滤转换选项:-

      BEGIN
         DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'SQLTERMINATOR', true);
         DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'PRETTY', true);
         DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'SEGMENT_ATTRIBUTES', false);
         DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'STORAGE', false);
      END;
      /
      
      SELECT DBMS_METADATA.get_ddl ('TABLE', table_name, owner)
      FROM   all_tables
      WHERE  owner      = UPPER('REFDATA')
      AND    table_name = DECODE(UPPER('<TBL_NM>'), 'ALL', table_name, UPPER('<TBL_NM>'));
      

      这应该只提供默认分区以及表 ddl。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-09
        • 1970-01-01
        • 2019-09-06
        • 1970-01-01
        • 2020-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多