【问题标题】:Customized Table DDL from dbms_metadata.get_ddl来自 dbms_metadata.get_ddl 的自定义表 DDL
【发布时间】:2013-01-14 07:37:06
【问题描述】:

我想要 DDLs 的表,以便我可以使用 Oracle 中的 UTL 包将其放入数据库服务器。

问题是:当我们

select dbms_metadata.get_ddl('TABLE','Table_name','Schema_Name') 
  from dual; 

我得到一个在CREATE 之前包含CLOB 的输出。喜欢

"(CLOB) 
  CREATE TABLE "SCHEMA"."TABLE_NAME" 
   (TABLE_COLUMNS.....) SEGMENT CREATION IMMEDIATE 
  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 FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "INTF_DATA01" ;"

我想要的是上面的DDL,没有CLOB,也没有SEGMENT CREATIONPCTFREE...等参数。

很高兴得到建议。

【问题讨论】:

  • (CLOB) 看起来像是您的客户可能会添加以显示结果是 CLOB。您正在使用哪个客户端,您可以从 SQL*Plus 或其他方式运行它以查看它是否仍然显示?
  • 如果没有其他解决方案,您始终可以使用子字符串。

标签: oracle plsql oracle11g rdbms database-administration


【解决方案1】:

我们可以使用 DBMS_METADATA.SET_TRANSFORM_PARAM 方法来控制生成的 DDL 中包含哪些子句。

例如要排除 SEGMENT 的东西,你会执行这个

exec dbms_metadata.set_transform_param
   (dbms_metadata.session_transform,'SEGMENT_ATTRIBUTES',false);

在执行get_ddl() 调用之前。

包文档列出了所有可用的转换参数。 Find out more.


我认为 Alex 是对的,前面的“(CLOB)”是您的客户在输出之前添加的内容。但它是真实的,而不是人工制品,摆脱它只是简单的字符串操作:

substr(your_string, 7) 

【讨论】:

    【解决方案2】:
    1. 请使用以下逻辑:它对我有用

    CREATE OR REPLACE TYPE ddl_ty AS OBJECT (   object_name
    VARCHAR2(30),   object_type VARCHAR2(30),   orig_schema
    VARCHAR2(30),   orig_ddl    CLOB ) / CREATE OR REPLACE TYPE
    ddl_ty_tb AS TABLE OF ddl_ty /
    
    CREATE OR REPLACE FUNCTION get_object_ddl (input_values
    SYS_REFCURSOR) RETURN ddl_ty_tb PIPELINED IS
    
    PRAGMA AUTONOMOUS_TRANSACTION;
    
    -- variables to be passed in by sys_refcursor */ object_name  VARCHAR2(30); object_type  VARCHAR2(30); orig_schema VARCHAR2(30);
    
    
    -- setup output record of TYPE tableddl_ty out_rec ddl_ty := ddl_ty(NULL,NULL,NULL,NULL);
    
    /* setup handles to be used for setup and fetching metadata
    information handles are used to keep track of the different objects
    (DDL) we will be referencing in the PL/SQL code */ hOpenOrig  
    NUMBER; hModifyOrig NUMBER; hTransDDL   NUMBER; dmsf       
    PLS_INTEGER; Orig_ddl  CLOB; ret        NUMBER; BEGIN   /* Strip off
    Attributes not concerned with in DDL. If you are concerned with
         TABLESPACE, STORAGE, or SEGMENT information just comment out these few lines. */   dmsf := dbms_metadata.session_transform;  
    dbms_metadata.set_transform_param(dmsf, 'TABLESPACE', FALSE);  
    dbms_metadata.set_transform_param(dmsf, 'STORAGE', FALSE);  
    dbms_metadata.set_transform_param(dmsf, 'SEGMENT_ATTRIBUTES',
    FALSE);   dbms_metadata.set_transform_param(dmsf, 'PRETTY', TRUE);  
    dbms_metadata.set_transform_param(dmsf, 'SQLTERMINATOR', TRUE);
    
      -- Loop through each of the rows passed in by the reference cursor
    LOOP
        /* Fetch the input cursor into PL/SQL variables */
        FETCH input_values INTO object_name, orig_schema, object_type;
        EXIT WHEN input_values%NOTFOUND;
    
        hOpenOrig := dbms_metadata.open(object_type);
        dbms_metadata.set_filter(hOpenOrig,'NAME',object_name);
        dbms_metadata.set_filter(hOpenOrig,'SCHEMA',orig_schema);
    
        hModifyOrig := dbms_metadata.add_transform(hOpenOrig,'MODIFY');
        dbms_metadata.set_remap_param(hModifyOrig,'REMAP_SCHEMA',orig_schema,null);
    
        -- This states to created DDL instead of XML to be compared
        hTransDDL := dbms_metadata.add_transform(hOpenOrig ,'DDL');
    
        Orig_ddl := dbms_metadata.fetch_clob(hOpenOrig);
    
          out_rec.object_name := object_name;
          out_rec.object_type := object_type;
          out_rec.orig_schema := orig_schema;
          out_rec.orig_ddl := Orig_ddl;
          PIPE ROW(out_rec);
    
        -- Cleanup and release the handles
        dbms_metadata.close(hOpenOrig);
    
      END LOOP;   RETURN; END get_object_ddl; / SELECT *   FROM
    TABLE(get_object_ddl(CURSOR (SELECT object_name, owner, object_type
                                   FROM dba_objects
                                  WHERE owner = 'EMP'
                                        AND object_type IN
                                        ('VIEW',
                                             'TABLE',
                                             'TYPE',
                                             'PACKAGE',
                                             'PROCEDURE',
                                             'FUNCTION',
                                             'SEQUENCE'))));
    

    1. 列表项

    【讨论】:

    • 想解释一下吗?这堵代码读起来不是特别有趣。
    【解决方案3】:

    get_ddl 返回一个 CLOB。将其转换为字符类型,您的库将不会添加 (CLOB)。

    select to_char(dbms_metadata.get_ddl('TABLE','Table_name','Schema_Name'))
        from dual; 
    

    【讨论】:

      猜你喜欢
      • 2010-09-08
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多