プライマリ・コンテンツに移動
Oracle® Databaseユーティリティ
12cリリース1 (12.1.0.2)
B71303-09
目次へ移動
目次
索引へ移動
索引

前
次

変換の条件指定

変換パラメータを使用して、追加する変換の条件を指定できます。SET_TRANSFORM_PARAMプロシージャを使用します。たとえば、TABLEオブジェクトに対してDDL変換を追加した場合、SEGMENT_ATTRIBUTES変換パラメータを指定して、物理、ストレージ、ロギングなどのセグメント属性をDDLに表示しないようにすることができます。デフォルトでは、セグメント属性がDDLに表示されます。

例21-4に、SET_TRANSFORM_PARAMプロシージャの使用方法を示します。

例21-4 変換の条件指定

  1. 次のように、get_table_mdという名前のファンクションを作成します。

    CREATE OR REPLACE FUNCTION get_table_md RETURN CLOB IS
     -- Define local variables.
     h    NUMBER;   -- handle returned by 'OPEN'
     th   NUMBER;   -- handle returned by 'ADD_TRANSFORM'
     doc  CLOB;
    BEGIN
    
     -- Specify the object type. 
     h := DBMS_METADATA.OPEN('TABLE');
    
     -- Use filters to specify the particular object desired.
     DBMS_METADATA.SET_FILTER(h,'SCHEMA','HR');
     DBMS_METADATA.SET_FILTER(h,'NAME','TIMECARDS');
    
     -- Request that the metadata be transformed into creation DDL.
     th := dbms_metadata.add_transform(h,'DDL');
    
     -- Specify that segment attributes are not to be returned.
     -- Note that this call uses the TRANSFORM handle, not the OPEN handle.
    DBMS_METADATA.SET_TRANSFORM_PARAM(th,'SEGMENT_ATTRIBUTES',false);
    
     -- Fetch the object.
     doc := DBMS_METADATA.FETCH_CLOB(h);
    
     -- Release resources.
     DBMS_METADATA.CLOSE(h);
    
     RETURN doc;
    END;
    /
    
  2. 次の問合せを実行します。

    SQL> SELECT get_table_md FROM dual;
    

    出力は、次のようになります。

      CREATE TABLE "HR"."TIMECARDS"
       (    "EMPLOYEE_ID" NUMBER(6,0),
            "WEEK" NUMBER(2,0),
            "JOB_ID" VARCHAR2(10),
            "HOURS_WORKED" NUMBER(4,2),
             FOREIGN KEY ("EMPLOYEE_ID")
              REFERENCES "HR"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE
       )
    

ここまでの例ではDDL変換という1つの変換を使用しました。DBMS_METADATA APIでは、最初の出力が2番目の入力になり、2番目の出力が3番目の入力になるというように、複数の変換を指定することもできます。

Oracleには、XML文書を変更するMODIFYと呼ばれる変換があります。スキーマ名や表領域名の変更などが行えます。これには、再マップ・パラメータおよびSET_REMAP_PARAMプロシージャを使用します。

例21-5に、SET_REMAP_PARAMプロシージャの使用例を示します。まずMODIFY変換を追加し、再マップ・パラメータを指定して、スキーマ名をhrからscottに変更します。次にDDL変換を追加します。MODIFY変換の出力は、DDL変換への入力となるXML文書です。最終的な結果は、timecards表の作成DDLであり、hrスキーマのすべてのインスタンスはscottに変更されます。

例21-5 XML文書の変更

  1. 次のように、remap_schemaという名前のファンクションを作成します。

    CREATE OR REPLACE FUNCTION remap_schema RETURN CLOB IS
    -- Define local variables.
    h NUMBER; --handle returned by OPEN
    th NUMBER; -- handle returned by ADD_TRANSFORM
    doc CLOB;
    BEGIN
    
    -- Specify the object type.
    h := DBMS_METADATA.OPEN('TABLE');
    
    -- Use filters to specify the particular object desired.
    DBMS_METADATA.SET_FILTER(h,'SCHEMA','HR');
    DBMS_METADATA.SET_FILTER(h,'NAME','TIMECARDS');
    
    -- Request that the schema name be modified.
    th := DBMS_METADATA.ADD_TRANSFORM(h,'MODIFY');
    DBMS_METADATA.SET_REMAP_PARAM(th,'REMAP_SCHEMA','HR','SCOTT');
    
    -- Request that the metadata be transformed into creation DDL.
    th := DBMS_METADATA.ADD_TRANSFORM(h,'DDL');
    
    -- Specify that segment attributes are not to be returned.
    DBMS_METADATA.SET_TRANSFORM_PARAM(th,'SEGMENT_ATTRIBUTES',false);
    
    -- Fetch the object.
    doc := DBMS_METADATA.FETCH_CLOB(h);
    
    -- Release resources.
    DBMS_METADATA.CLOSE(h);
    RETURN doc;
    END;
    / 
    
  2. 次の問合せを実行します。

    SELECT remap_schema FROM dual;
    

    出力は、次のようになります。

      CREATE TABLE "SCOTT"."TIMECARDS"
       (    "EMPLOYEE_ID" NUMBER(6,0),
            "WEEK" NUMBER(2,0),
            "JOB_ID" VARCHAR2(10),
            "HOURS_WORKED" NUMBER(4,2),
             FOREIGN KEY ("EMPLOYEE_ID")
              REFERENCES "SCOTT"."EMPLOYEES" ("EMPLOYEE_ID") ENABLE
       )
    

    XSLTをよく理解しているユーザーであれば、独自の変換を追加してXMLを処理できます。