3

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

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

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

非常感谢

4

4 回答 4

4

Oracle 早在上个千年就弃用 LONG 和 LONG RAW 的原因正是因为这个问题:它们完全是一个令人头疼的问题。现在可能是咬紧牙关转向现代(但不完全是尖端)BLOB 实现的好时机。这取决于您使用这些表的频率。记住,容忍一个问题就是坚持它

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

  1. 出口Table1。当你喜欢遗留技术时,你会想要使用 EXP 而不是 Data Pump :)
  2. 重命名Table1Table2.
  3. 导入Table1.
于 2013-04-13T13:36:03.703 回答
1

使用 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;
于 2013-04-14T13:33:37.777 回答
0

尽管不应再使用长或长的原始列,但仍有许多遗留表需要处理。看看这个: 复制带有 Long/LongRaw 列的表

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;
于 2015-10-27T07:49:57.307 回答
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;
/
于 2016-01-22T14:33:14.970 回答