学习笔记:LONG转换为CLOB LONG转换CLOB to_lob()的另类实现
LONG类型使用限制有很多,Oracle在10G以后不推荐使用,
使用LONG类型的时候,可能报遇到以下错误
ORA-00997: illegal use of LONG datatype
ORA-00932: inconsistent datatypes: expected - got LONG
ORA-00932: inconsistent datatypes: expected CLOB got LONG
ORA-22835: Buffer too small for CLOB to CHAR or BLOB to RAW conversion (actual: 4400, maximum: 4000)
to_lob(long)函数的使用也有很多限制,使用以下PL/SQL的方法转换LONG类型为CLOB类型
## 转行1行
DECLARE
lv_rec t1%ROWTYPE;
BEGIN
SELECT * INTO lv_rec FROM t1 WHERE id=1;
UPDATE t1 SET g2 = lv_rec.g1 WHERE id=1;
END;
/
commit;
# 转换所有LONG的数据为CLOB
BEGIN
FOR lv_rec IN (SELECT ROWID,a.* FROM &&table_name a WHERE &&long_column is not null) LOOP
UPDATE &&table_name SET &&long_convert_column = lv_rec.&&long_column WHERE ROWID=lv_rec.ROWID;
END LOOP;
END;
/
commit;
# 把列名改为原来的名字
alter table cog.t1 drop column g1;
alter table cog.t1 rename column g2 to g1;
说明
一、 限制使用long型字段的情况:
1、 一个表中只能使用一个long型字段。
2、 使用long属性来定义对象type。
3、 Long字段不能出现在where子句中和完整性约束中。【除了null和not null约束】。
4、 Long字段不能用来indexed。
5、 存储函数不能用来返回long值。
6、 在plsql程序单元中可以使用long数据类型来定义变量或者参数。但是不能从sql中调用这个程序单元。
7、 在一个单一的sql语句中,所有的long字段,updated tables和locked tables必须位于同一个数据库。
8、 Long和long raw不能用在分布式sql语句中,不能复制。
9、如果表中同时有long和lob字段,在同一个sql语句中long和lob字段不能bind超过4000字节的数据。然而可以单独bind超多4000字节在只有long或者lob字段时。
10、 拥有long字段的表不能位于assm【自动段管理表空间】中。
二、 long字段不能出现在sql语句的部分位置:
1、 含有group by 、order by、connect by、distinct关键字的select语句中。
2、 带有unique操作的select语句。
3、 Create cluster语句的字段列表中。
4、 Create materialized view语句的cluster子句中。
5、 在function、expressions或contitions的内嵌sql中。
6、 含有group by子句的select列表查询中。
7、 含有union、intersect、minus的查询或者子查询中。
8、 Create table …as select语句的select 列表中。
9、 Alter table…move 语句中。
10、 Insert语句的子查询select 列表中。
三、 触发器可以用以下方式使用long字段:
1、 一个sql语句内部的trigger可以插入一个long字段。
2、 如果long字段的数据可以转换为constrained 数据类型(比如char和varchar2),此时可以引用在带有trigger的sql语句。
3、 触发器中的变量不能使用long定义。
4、 new和:old不能使用long字段。
总之:使用long字段的限制很多,使用情况很少,再加上oracle后期版本支持没有提高,所以强烈建议使用clob型来代替long型字段。