LogMinerでは、XMLType
列に対して生成されるREDOがサポートされます。CLOB
として格納されるXMLType
データは、11.0.0.0以上の互換性設定で生成されたREDOに対してサポートされます。オブジェクト・リレーショナルおよびバイナリXMLとして格納されるXMLType
データは、11.2.0.3以上の互換性設定で生成されたREDOに対してサポートされます。
LogMinerでは、XMLType
が何で保存されているかに応じて、V$LOGMNR_CONTENTS
内のSQL_REDO
を別の方法で示します。いずれの場合においても、STATUS
列に加えSQL_REDO
列の内容は、注意深く確認し、変更をREDOするためにSQLまたはPL/SQL文が生成される前に、通常は再アセンブリする必要があります。このような変更の構築に、SQL_REDO
データを使用できない場合があります。次の項の例では、XMLType
は行を完全に変更するための再構築で最も単純なCLOB
として格納されています。
注意:
CLOB
として格納されるXMLType
データは、Oracle Database 12cリリース1 (12.1)からは非推奨になりました。
XMLType列を使用した表に対して行われた変更についてのV$LOGMNR_CONTENTSの問合せ
この項の例では、次の列を使用したXML_CLOB_COL_TAB
という表について説明します。
f1 NUMBER
f2 VARCHAR2(100)
f3 XMLTYPE
f4 XMLTYPE
f5 VARCHAR2(10)
ログおよびCOMMITTED_DATA_ONLY
オプションを使用して、LogMinerセッションを起動したとします。XML_CLOB_COL_TAB
表に対して行われた変更について、V$LOGMNR_CONTENTS
に対して次の問合せが実行されます。
SELECT OPERATION, STATUS, SQL_REDO FROM V$LOGMNR_CONTENTS WHERE SEG_OWNER = 'SCOTT' AND TABLE_NAME = 'XML_CLOB_COL_TAB';
問合せの出力は、次のようになります。
OPERATION STATUS SQL_REDO INSERT 0 insert into "SCOTT"."XML_CLOB_COL_TAB"("F1","F2","F5") values ('5010','Aho40431','PETER') XML DOC BEGIN 5 update "SCOTT"."XML_CLOB_COL_TAB" a set a."F3" = XMLType(:1) where a."F1" = '5010' and a."F2" = 'Aho40431' and a."F5" = 'PETER' XML DOC WRITE 5 XML Data XML DOC WRITE 5 XML Data XML DOC WRITE 5 XML Data XML DOC END 5
XML DOC WRITE
操作のSQL_REDO
列には、XML文書の実際のデータがあります。データは文字列'XML Data'ではありません。
XMLType
列を使用した表に挿入するための一般的なモデルを示すこの出力は、次のようになります。
すべてのスカラー列を使用した最初の挿入
バインド変数を使用して、1つのXMLType
列に値を設定する更新文を使用したXML DOC BEGIN
操作。
XML文書のデータを使用した1回以上のXML DOC WRITE
操作
XML文書のすべてのデータが送信されたことを示すXML DOC END
操作
表に複数のXMLType
列がある場合は、元のDMLによって変更されるそれぞれのXMLType
列に対して、手順2から4が繰り返されます。
XML文書が表外の列として格納されていない場合、その列に対してXML DOC BEGIN
、XML DOC WRITE
またはXML DOC END
操作は行われません。文書は、次のような更新文に含まれます。
OPERATION STATUS SQL_REDO UPDATE 0 update "SCOTT"."XML_CLOB_COL_TAB" a set a."F3" = XMLType('<?xml version="1.0"?> <PO pono="1"> <PNAME>Po_99</PNAME> <CUSTNAME>Dave Davids</CUSTNAME> </PO>') where a."F1" = '5006' and a."F2" = 'Janosik' and a."F5" = 'MMM'
XMLType表に対して行われた変更についてのV$LOGMNR_CONTENTSの問合せ
XMLType
表に対するDMLは、XMLType
列に対するDMLとは多少異なります。XML文書では、XMLType
表の行に対する値を表します。XMLType
列の場合とは異なり、最初の挿入に続いてXML文書を含む更新を行うことはできません。データを表に挿入する前に、文書全体を作成する必要があります。
XMLType
表のもう1つの相違点は、OBJECT_ID
列の存在です。オブジェクト識別子は、オブジェクト表の各オブジェクトを一意に識別するために使用されます。XMLType
表については、表に行が挿入されると、Oracle Databaseによってこの値が生成されます。OBJECT_ID
の値は、SQLを使用して表に直接挿入することはできません。したがって、LogMinerでは、この値を含む実行可能なSQL_REDO
を生成できません。
V$LOGMNR_CONTENTS
ビューには、XMLType
表に対して行われた変更に対して移入される新しいOBJECT_ID
列があります。この値は、元の表のオブジェクト識別子です。ただし、この同じXML文書が同じXMLType
表に挿入されても、新しいオブジェクト識別子が生成されます。XMLType
表における更新や削除などの次のDMLのSQL_REDO
には、WHERE
句に元の表の行を一意に識別するためのオブジェクト識別子が含まれます。