Как сравнить локальный столбец CLOB со столбцом CLOB в удаленном экземпляре базы данных - PullRequest
1 голос
/ 21 сентября 2011

Я хочу убедиться, что данные в 2 столбцах CLOB одинаковы в 2 разных экземплярах. Если бы это были столбцы VARCHAR2, я мог бы использовать МИНУС или объединение, чтобы определить, были ли строки в одном или другом экземпляре. К сожалению, Oracle не позволяет вам выполнять операции над столбцами CLOB.

Как сравнить 2 столбца CLOB, один из которых находится в моем локальном экземпляре, а другой - в удаленном?

Пример структуры таблицы:

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

Ответы [ 2 ]

3 голосов
/ 21 сентября 2011

Вы можете использовать глобальную временную таблицу 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;
2 голосов
/ 22 сентября 2011

Вы можете использовать DBMS_SQLHASH для сравнения хэшей соответствующих данных. Это должно использовать значительно меньше операций ввода-вывода, чем перемещение и сравнение объектов CLOB. Приведенный ниже запрос просто скажет вам, есть ли какие-либо различия во всей таблице, но вы можете сузить его.

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