「Long」列を持つテーブルXと「CLOB」列を持つテーブルYがあります。データはテーブルXからテーブルYに移行されました。次に、データが正しく変換されたかどうかを確認する必要があります。キャストを使用することを考えましたが、selectステートメントで「Long」値を「Varchar」に変換できないようです。どんなアイデアでも大歓迎です。
例えば:
SELECT LONG_COLUMNFROMTABLE_XマイナスSELECTCLOB_COLUMNFROM TABLE_Y
「Long」列を持つテーブルXと「CLOB」列を持つテーブルYがあります。データはテーブルXからテーブルYに移行されました。次に、データが正しく変換されたかどうかを確認する必要があります。キャストを使用することを考えましたが、selectステートメントで「Long」値を「Varchar」に変換できないようです。どんなアイデアでも大歓迎です。
例えば:
SELECT LONG_COLUMNFROMTABLE_XマイナスSELECTCLOB_COLUMNFROM TABLE_Y
2 つの問題があります:long
他のデータ型に簡単に変換/比較clob
できず、操作で使用できませんminus
!
幸いなことに、PL/SQL を使用することで、これらの両方を克服できます。long と clob は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 などの範囲で行をフェッチして比較するのが最善です。