2011-09-20 9 views
1

2つの異なるインスタンスで2つのCLOB列のデータが同じであることを確認したいとします。これらがVARCHAR2列の場合、MINUSまたは結合を使用して、行が1つのインスタンスにあるかどうかを判断できます。残念ながら、OracleではCLOB列に対してset操作を実行することはできません。ローカルCLOB列とリモート・データベース・インスタンスのCLOB列を比較する方法

2つのCLOB列を比較します。そのうちの1つはローカルインスタンスにあり、もう1つはリモートインスタンスにあります。

例のテーブル構造:

CREATE OR REPLACE TABLE X.TEXT_TABLE 
( ID VARCHAR2, 
    NAME VARCHAR2, 
    TEXT CLOB 
); 

答えて

3

あなたは一時的にローカル・インスタンスへのCLOBの上に引っ張ってOracleのグローバル一時表を使用することができます。次に、DBMS_LOB.COMPAREファンクションを使用してCLOB列を比較できます。

この問合せで行が戻された場合、CLOBは異なる(多少の文字数、改行など)か、行の1つがインスタンスの1つのみに存在します。

--Create temporary table to store the text in 
CREATE GLOBAL TEMPORARY TABLE X.TEMP_TEXT_TABLE 
ON COMMIT DELETE ROWS 
AS 
    SELECT * FROM [email protected]_DB; 

--Use this statement if you need to refresh the TEMP_TEXT_TABLE table 
INSERT INTO X.TEMP_TEXT_TABLE 
SELECT * FROM [email protected]_DB; 

--Do the comparision 
SELECT DISTINCT 
     TARGET.NAME TARGET_NAME 
     ,SOURCE.NAME SOURCE_NAME 
     ,DBMS_LOB.COMPARE (TARGET.TEXT, SOURCE.TEXT) AS COMPARISON 
    FROM (SELECT ID, NAME, TEXT FROM X.TEMP_TEXT_TABLE) TARGET 
     FULL OUTER JOIN 
      (SELECT ID, NAME, TEXT FROM X.TEXT_TABLE) SOURCE 
     ON TARGET.ID = SOURCE.ID 
WHERE DBMS_LOB.COMPARE (TARGET.TEXT, SOURCE.TEXT) <> 0 
    OR DBMS_LOB.COMPARE (TARGETTEXT, SOURCE.TEXT) IS NULL; 
2

関連するデータのハッシュを比較するために、DBMS_SQLHASHを使用できます。これは、CLOBの移動と比較よりもはるかに少ないIOを使用する必要があります。以下のクエリは、テーブル全体に相違があるかどうかを示しますが、絞り込むことができます。

select sys.dbms_sqlhash.gethash(sqltext => 'select text from text_table' 
    ,digest_type => 1/*MD4*/) from dual 
minus 
select sys.dbms_sqlhash.gethash(sqltext => 'select text from [email protected]' 
    ,digest_type => 1/*MD4*/) from dual; 
+0

私はDMBS_SQLHASHパッケージでEXECUTEが許可されていませんが、効率性については賞賛されています! – JordanBean

関連する問題