1

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

例如:

SELECT LONG_COLUMN FROM TABLE_X 减号 SELECT CLOB_COLUMN FROM TABLE_Y

4

1 回答 1

0

您有两个问题:long无法轻松转换/与其他数据类型进行比较,并且clob无法在minus操作中使用!

幸运的是,这两个问题都可以通过使用 PL/SQL 来克服。varchar2Long 和 clob在 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 等。

于 2013-02-20T09:29:17.823 回答