Oracle: можно ли сравнивать значения в столбце Long со значениями в столбце Clob

Существует таблица X со столбцом «Длинный» и таблица Y со столбцом «CLOB». Данные были перенесены из таблицы X в таблицу Y. Теперь мне нужно проверить правильность преобразования данных. У меня была идея использовать кастинг, но кажется, что «длинные» значения не могут быть преобразованы в «Varchar» в операторах выбора. Любые идеи высоко ценятся.

Eg:

SELECT LONG_COLUMN FROM TABLE_X минус SELECT CLOB_COLUMN FROM TABLE_Y


person neeraj v    schedule 20.02.2013    source источник


Ответы (1)


У вас есть две проблемы: long нельзя легко конвертировать/сравнивать с другими типами данных и clob нельзя использовать в операции minus!

К счастью, обе эти проблемы можно преодолеть с помощью PL/SQL. Длинные и clobs могут быть неявно преобразованы в varchar2, когда они выбраны в блоках PL/SQL. Вы можете загрузить их во вложенную таблицу, а затем использовать оператор multiset except, чтобы найти различия между ними:

create table long_t ( x long );
create table lob_t  ( x clob );

insert into long_t values ('1');
insert into long_t values ('2');
insert into lob_t values ('1');

declare
  type t is table of varchar2(32767);
  longs t;
  clobs t;

  diff t;
begin
  select x bulk collect into longs from long_t;
  select x bulk collect into clobs from lob_t;
  diff := longs multiset except clobs;

  for i in 1 .. diff.count loop
    dbms_output.put_line(diff(i));  
  end loop;

  diff := clobs multiset except longs;

  for i in 1 .. diff.count loop
    dbms_output.put_line(diff(i));  
  end loop;
end;
/

anonymous block completed
2

Если ваши таблицы содержат более пары тысяч строк, вы, вероятно, исчерпаете память, используя вышеуказанное как есть, так как вся таблица будет загружена сразу. Если у вас есть столбец id или аналогичный столбец в каждой таблице, то было бы лучше получить и сравнить строки в диапазонах, например. 1-1000, 1001-2000 и так далее.

person Chris Saxon    schedule 20.02.2013