我想验证两个不同实例中2个CLOB列中的数据是否相同。如果这些是VARCHAR2列,我可以使用MINUS或连接来确定行是在一个实例中还是在另一个实例中。不幸的是,Oracle不允许您对CLOB列执行set操作。
如何比较2个CLOB列,其中一个列在我的本地实例中,另一个在远程实例中?
示例表结构:
CREATE OR REPLACE TABLE X.TEXT_TABLE
( ID VARCHAR2,
NAME VARCHAR2,
TEXT CLOB
);
答案 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;