如何将本地CLOB列与远程数据库实例中的CLOB列进行比较

时间:2011-09-20 21:08:37

标签: oracle compare clob

我想验证两个不同实例中2个CLOB列中的数据是否相同。如果这些是VARCHAR2列,我可以使用MINUS或连接来确定行是在一个实例中还是在另一个实例中。不幸的是,Oracle不允许您对CLOB列执行set操作。

如何比较2个CLOB列,其中一个列在我的本地实例中,另一个在远程实例中?

示例表结构:

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

2 个答案:

答案 0 :(得分: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 X.TEXT_TABLE@REMOTE_DB;

--Use this statement if you need to refresh the TEMP_TEXT_TABLE table
INSERT INTO X.TEMP_TEXT_TABLE
SELECT * FROM X.TEXT_TABLE@REMOTE_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;

答案 1 :(得分: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 text_table@remoteDB'
    ,digest_type => 1/*MD4*/) from dual;