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

Oracle 如何将本地CLOB列与远程数据库实例中的CLOB列进行比较,oracle,compare,clob,Oracle,Compare,Clob,我想验证两个CLOB列中的数据在两个不同实例上是否相同。如果这些是VARCHAR2列,我可以使用减号或联接来确定行是在一个实例中还是在另一个实例中。不幸的是,Oracle不允许您对CLOB列执行set操作 如何比较两个CLOB列,其中一个在本地实例中,另一个在远程实例中 表结构示例: CREATE OR REPLACE TABLE X.TEXT_TABLE ( ID VARCHAR2, NAME VARCHAR2, TEXT CLOB ); 您可以使用Oracle全局临时表将CLO

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

如何比较两个CLOB列,其中一个在本地实例中,另一个在远程实例中

表结构示例:

CREATE OR REPLACE TABLE X.TEXT_TABLE
(   ID VARCHAR2,
  NAME VARCHAR2,
  TEXT CLOB
);
您可以使用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;
您可以使用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;

您可以使用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;

您可以使用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;

我并没有被授予在DMBS_SQLHASH包上执行的权限,但我为效率而自豪!我并没有被授予在DMBS_SQLHASH包上执行的权限,但我为效率而自豪!