【问题标题】:Oracle: is it possible to compare values in Long column with values in Clob columnOracle:是否可以将 Long 列中的值与 Clob 列中的值进行比较
【发布时间】:2025-12-22 04:00:07
【问题描述】:

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

例如:

从 TABLE_X 中选择 LONG_COLUMN 减 从 TABLE_Y 中选择 CLOB_COLUMN

【问题讨论】:

    标签: oracle11g compare long-integer clob


    【解决方案1】:

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

    幸运的是,这两个问题都可以通过使用 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 等等。

    【讨论】:

      最近更新 更多