Oracle11g Oracle:是否可以将长列中的值与Clob列中的值进行比较

Oracle11g Oracle:是否可以将长列中的值与Clob列中的值进行比较,oracle11g,compare,long-integer,clob,Oracle11g,Compare,Long Integer,Clob,表X有一个“长”列,表Y有一个“CLOB”列。数据已从表X迁移到表Y。现在我需要验证数据是否正确转换。我有使用强制转换的想法,但似乎在select语句中“Long”值不能转换为“Varchar”。任何想法都将受到高度赞赏 例如: 从表X中选择长列 减 从表Y中选择CLOB_列您有两个问题:long无法轻松转换/与其他数据类型进行比较,CLOB不能用于减操作 幸运的是,使用PL/SQL可以克服这两个问题。在PL/SQL块中选择long和clob时,它们可以隐式转换为varchar2。您可以将它们加

表X有一个“长”列,表Y有一个“CLOB”列。数据已从表X迁移到表Y。现在我需要验证数据是否正确转换。我有使用强制转换的想法,但似乎在select语句中“Long”值不能转换为“Varchar”。任何想法都将受到高度赞赏

例如:

从表X中选择长列 减
从表Y中选择CLOB_列

您有两个问题:
long
无法轻松转换/与其他数据类型进行比较,
CLOB
不能用于
减操作

幸运的是,使用PL/SQL可以克服这两个问题。在PL/SQL块中选择long和clob时,它们可以隐式转换为
varchar2
。您可以将它们加载到嵌套表中,然后使用
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等等