在新版的ORACLE中,由于加入了LOB对象,所以对LONG的支持及介绍也少了很多。虽然将来会由LOB完全取代LONG的作用,但是在实际情况中,还会有很多的系统用到LONG类型,尤其是从相对老的版本迁移而来的系统里面,可能会有大量的LONG的存在。  
对ORACLE的许多操作中,都对LONG类型做了相应的限制,这对操作LONG带来了不便。比如由一个表创建另一个表,一般情况下可以写成:  
create table table1 as select * from table2;  
当原始表TABLE2中有一个LONG字段的时候,这个命令就不能正确执行了。  
另一个处理两个表互相传输LONG类型的方法是使用游标,如下例:  
create or replace procedure bv_tran as  
cursor cursor1 is  
select * from table1 ;  
dtype table1%rowtype;  
i number:=0;  
numlast number:=0;  
begin  
open cursor1;  
loop  
fetch cursor1 into dtype;  
exit when cursor1%notfound;  
update table2 set field2=dtype.field1 where clause;  
end loop;  
end;  
这是一个非常简单的游标过程,在一般情况下,这也能够完成任务。但是当有一点需要注意的事:数据库中的LONG类型可以到达2G大小,而在PL/SQL语言中,对LONG的限制比较大,可以到达64K,所以当数据库中的某些记录的LONG的长度大于64K的时候,整个游标返回就会出错。但是在实际情况下,LONG字段大于64K的情况还是很多的。这也就限制了这种用法的使用范围。  
利用ODBC或OO4O也可以写出很漂亮的应用程序来处理这个任务,但是应用程序写起来一方面有难度,另一方面,使用效率也是比较低的。其实SQL/PLUS本身提供了一个命令COPY,对处理这种事情简单是太方便不过了。下面我来对它做一下说明:  
COPY的本意是实现在两个不同的数据库之间进行复制,所以它需要指定从哪里复制或复制到哪里,由子句FROM或TO来指定;对于目的表,可以存在,也可以不存在,由COPY直接创建,语法如下:  
COPY FROM|TO LOGIN CREATE|APPEND|INSERT|REPLACE TABLENAME USING SELECT_STATEMENT  
FROM和TO选其中一个,表明是从哪里选择或向哪里复制,如FROM SCOTT/TIGGER@SERVICENAME  
CREATE:生成一个新的表,不管表是否存在,如果不存在,则创建,如果存在,则删除后创建;  
APPEND:如果目标表不存在就创建;  
INSERT:首先要求目的表存在,如果不存在,则报错,此命令仅向表中做插入操作;  
REPLACE:在复制前,先将目标表中的数据删除,然后再复制;  
USING后的子句是表明数据来源,请看下例:  
COPY TO SYSTEM/MANAGER@SERNAME CREATE TABLE2 USING SELECT * FROM TEST1;  
注意:  
1. 即使只在同一库中复制,也要指明服务名,所以必须建立一个指向本地库的服务;  
2. 整个语句应该写在同一行,这不同于一般的SQL语句,是不可以换行的。  
3. 要用SET LONG LENGTH来设定每次COPY时对LONG的支持的字节数。如果不做特殊说明,默认值为80,这是不能接受的,可以考虑在COPY过程中最大需要多大,如果想定为2M,则写成:SET LONG 2000000;  
建议:如果需要复制的表非常大,可以将SELECT子句上加上WHERE子句限制每次复制的记录数,分几次导入一个大的表是一个不错的主意,因为当大量操作时,对SYSTEM,TEMP,RBS等表空间的要求都非常大,经常会出现导入很长时间后发生因为表空间不足而失败的现象,且由于很多操作属于事务型,所以一旦失败,所有的操作可能均白费。