考虑我有两个表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)。有人可以建议将这些数据从一个表复制到另一个表的正确方法。
非常感谢
答案 0 :(得分:4)
甲骨文之所以在过去的一个千年里弃用LONG和LONG RAW,正是因为这个问题:它们完全是痛苦的。现在可能是咬紧牙关并转向现代(但不是最前沿)BLOB实施的好时机。这取决于您使用这些表的频率。请记住,to tolerate a problem is to insist on it。
替代方案很麻烦。有很多机制可以将LONG转换为更易于管理的东西,但它们不会以其他方式工作。一种可能适合您的方法是:
Table1
。如您所愿,您需要使用EXP而非Data Pump:)Table1
重命名为Table2
。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;
/