有一个表 X 有一个“长”列,表 Y 有一个“CLOB”列。数据已从表 X 迁移到表 Y。现在我需要验证数据是否正确转换。我有使用强制转换的想法,但似乎“长”值无法在选择语句中转换为“Varchar”。任何想法都受到高度赞赏。
例如:
SELECT LONG_COLUMN FROM TABLE_X 减号 SELECT CLOB_COLUMN FROM TABLE_Y
有一个表 X 有一个“长”列,表 Y 有一个“CLOB”列。数据已从表 X 迁移到表 Y。现在我需要验证数据是否正确转换。我有使用强制转换的想法,但似乎“长”值无法在选择语句中转换为“Varchar”。任何想法都受到高度赞赏。
例如:
SELECT LONG_COLUMN FROM TABLE_X 减号 SELECT CLOB_COLUMN FROM TABLE_Y
您有两个问题:long
无法轻松转换/与其他数据类型进行比较,并且clob
无法在minus
操作中使用!
幸运的是,这两个问题都可以通过使用 PL/SQL 来克服。varchar2
Long 和 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 等。