2011-09-20 56 views
1

我想驗證2個CLOB列中的數據在2個不同實例上是否相同。如果這些是VARCHAR2列,我可以使用MINUS或連接來確定行是在一個實例中還是在另一個實例中。不幸的是,Oracle不允許你對CLOB列執行設置操作。如何將本地CLOB列與遠程數據庫實例中的CLOB列進行比較

如何比較2個CLOB列,其中一個列在我的本地實例中,另一個列在遠程實例中?

示例表結構:

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

回答

3

您可以使用Oracle全局臨時表上拉的CLOB到本地實例暫時的。然後可以使用DBMS_LOB.COMPARE函數來比較CLOB列。

如果此查詢返回任何行,則CLOB不同(更多或更少的字符,換行符等),或者其中一個行僅存在於其中一個實例中。

--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

相關問題