変換パラメータを使用して、追加する変換の条件を指定できます。SET_TRANSFORM_PARAM
プロシージャを使用します。たとえば、TABLE
オブジェクトに対してDDL
変換を追加した場合、SEGMENT_ATTRIBUTES
変換パラメータを指定して、物理、ストレージ、ロギングなどのセグメント属性をDDLに表示しないようにすることができます。デフォルトでは、セグメント属性がDDLに表示されます。
例21-4に、SET_TRANSFORM_PARAM
プロシージャの使用方法を示します。
例21-4 変換の条件指定
次のように、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; /
次の問合せを実行します。
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文書の変更
次のように、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; /
次の問合せを実行します。
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を処理できます。