Oracle:将长原始数据从一个表复制到另一个表

时间:2013-04-13 13:04:06

标签: oracle copy binary-data

考虑我有两个表Table1和Table2具有完全相同的结构。我想将数据从Table1复制到Table2。两个表都有一个Long Raw数据类型的字段。我使用以下insert语句来复制数据。

INSERT INTO TABLE2
SELECT ID, NAME, TO_LOB(IMAGE_DATA) FROM TABLE1

上面的insert语句执行时没有错误,但Image_Data列中的结果数据中有0个字节;表示没有为此字段复制。两个表中Image_Data的数据类型为(Long Raw)。有人可以建议将这些数据从一个表复制到另一个表的正确方法。

非常感谢

4 个答案:

答案 0 :(得分:4)

甲骨文之所以在过去的一个千年里弃用LONG和LONG RAW,正是因为这个问题:它们完全是痛苦的。现在可能是咬紧牙关并转向现代(但不是最前沿)BLOB实施的好时机。这取决于您使用这些表的频率。请记住,to tolerate a problem is to insist on it

替代方案很麻烦。有很多机制可以将LONG转换为更易于管理的东西,但它们不会以其他方式工作。一种可能适合您的方法是:

  1. 导出Table1。如您所愿,您需要使用EXP而非Data Pump:)
  2. Table1重命名为Table2
  3. 导入Table1

答案 1 :(得分:0)

使用pl / sql

declare
    l long;
begin 
    select long_column into l from some_table where pk = 1;
    insert into some_other_table values (l);
    commit;
end;

答案 2 :(得分:0)

虽然不应再使用长或长的原始列,但仍有许多遗留表需要处理。看一下这个: Copy Tables with Long/LongRaw columns

declare  
   l_rec_long_table long_table%rowtype;
begin
  select *
    into l_rec_long_table
    from long_table a
   where a.long_id = 'some old id';


  insert into long_table
  values
    ('new id',
     l_rec_long_table.long_column);
end;

答案 3 :(得分:0)

SET DEFINE OFF;
DECLARE
   fldLong VARCHAR2(10000);
   idTable MYSCHEMA.MYTABLE.ID_MYTABLE%TYPE;
BEGIN
    FOR r IN (SELECT LONGFIELD_MYTABLE, ID_MYTABLE FROM MYSCHEMA.MYTABLE) LOOP
        fldLong := r.LONGFIELD_MYTABLE;
        idTable := r.ID_MYTABLE;
        DBMS_OUTPUT.PUT_LINE('Value field long: ' || fldLong );

        Insert into MYSCHEMA.MY_ANOTHER_TABLE
        (
            ANOTHERFIELD1 [, ANOTHERFIELD2 ...], LONGFIELD_MY_ANOTHER_TABLE
        )
        SELECT FIELD1[, FIELD2 ...], fldLong
        FROM MYSCHEMA.MYTABLE
        WHERE ID_MYTABLE = idTable;
    END LOOP;
END;
/