ITPub博客

首页 > 数据库 > Oracle > 由ORA-00997: illegal use of long datatype引发的血案之long转换为lob

由ORA-00997: illegal use of long datatype引发的血案之long转换为lob

原创 Oracle 作者:wisdomone1 时间:2015-10-30 03:27:24 0 删除 编辑

背景:

  在测试某个技术问题时,发现long列的表不能复制到另一个表中,报ora-00997错误
SQL> create table cdef$_bak as select * from cdef$ where con#=11923;
create table cdef$_bak as select * from cdef$ where con#=11923
                                 *
ERROR at line 1:
ORA-00997: illegal use of
LONG datatype


结论

1,oracle11g基本不建议使用long,保存期仅为了兼容,建议使用lob
2,insert可以
  但update及delete(where条件为long)则会报错,不能运行
3,long可以迁移到lob,有几种方式
   a,dbms_redefination在线重定义
   b,create table t_long_bak as select to_lob(a) as a,b from t_long;--a列为long
   c,直接alter table modify a clob;--直接把c列由long变成clob
4,long raw转换为blob,而long转换为clob


5,暂时只测这些,关于long到lob转换还有诸多知识,将在下文进行继续测试     


测试

SQL> create table t_long(a long,b int);


Table created.


SQL> insert into t_long values(1,3);


1 row created.


SQL> commit;


Commit complete.


SQL> create table t_long_bak as select * from t_long;
create table t_long_bak as select * from t_long
                                  *
ERROR at line 1:
ORA-00997: illegal use of LONG datatype


SQL> desc t_long;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  LONG
 B                                                  NUMBER(38)


查阅11g官方手册,未找到,但却找到long raw数据类型
SQL> create table t_long_raw(a long raw);


Table created.


SQL> desc t_long_raw;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 A                                                  LONG RAW


可见long及long raw是2种不同的数据类型


既然11g官方手册,肯定是在oracle 10g,果然在oracle 10g concepts找到了




根据官方手册说法,不建议使用long,出现它也是为了向前兼容,所以肯定是9i或之前引入的数据类型了,建议用lob代替


SQL> set long 99999
SQL> select * from t_long;


A                                                                                         B
-------------------------------------------------------------------------------- ----------
1                                                                                         3


可见update不行
SQL> update t_long set a=2 where a=1;
update t_long set a=2 where a=1
                            *
ERROR at line 1:
ORA-00997: illegal use of LONG datatype


经过to_lob只适用于insert select子查询是中的select部分
SQL> select a,to_lob(a),b from t_long;
select a,to_lob(a),b from t_long
         *
ERROR at line 1:
ORA-00932: inconsistent
datatypes: expected - got
LONG




delete不可以
SQL> delete from t_long where a=1;
delete from t_long where a=1
                         *
ERROR at line 1:
ORA-00997: illegal use of LONG datatype






回过来头再看上述这个报错
SQL> create table t_long_bak as select * from t_long;
create table t_long_bak as select * from t_long
                                  *
ERROR at line 1:
ORA-00997: illegal use of LONG datatype


只有在迁移或复制LONG列到另一个表中,表新目标表对应列数据类型应为lob,也就是说long列无法迁移
SQL> create table t_long_bak as select to_lob(a) a,b from t_long;


Table created.


SQL> set linesize 30
SQL> desc t_long_bak;
 Name              Null?    Type
 ----------------- -------- ------------
 A                          CLOB
 B                          NUMBER(38)




另外,也可以直接通过alter table modify clob转换long列为clob列
 SQL> desc t_long;
 Name              Null?    Type
 ----------------- -------- ------------
 A                          LONG
 B                          NUMBER(38)


SQL> alter table t_long modify a clob;


Table altered.


SQL> desc t_long;
 Name              Null?    Type
 ----------------- -------- ------------
 A                          CLOB
 B                          NUMBER(38)


个人简介:


8年oracle从业经验,具备丰富的oracle技能,目前在国内北京某专业oracle服务公司从事高级技术顾问。
   
   服务过的客户:
          中国电信
          中国移动
          中国联通
          中国电通
          国家电网
          四川达州商业银行
          湖南老百姓大药房
          山西省公安厅
          中国邮政
          北京302医院     
          河北廊坊新奥集团公司
  
 项目经验:
           中国电信3G项目AAA系统数据库部署及优化
           中国联通CRM数据库性能优化
           中国移动10086电商平台数据库部署及优化
           湖南老百姓大药房ERR数据库sql优化项目
           四川达州商业银行TCBS核心业务系统数据库模型设计和RAC部署及优化
           四川达州商业银行TCBS核心业务系统后端批处理存储过程功能模块编写及优化
           北京高铁信号监控系统RAC数据库部署及优化
           河南宇通客车数据库性能优化
           中国电信电商平台核心采购模块表模型设计及优化
           中国邮政储蓄系统数据库性能优化及sql优化
           北京302医院数据库迁移实施
           河北廊坊新奥data guard部署及优化
           山西公安厅身份证审计数据库系统故障评估
         
 联系方式:
          手机:18201115468
          qq   :   305076427
          qq微博: wisdomone1
          新浪微博:wisdomone9
          qq群:275813900    
          itpub博客名称:wisdomone1    http://blog.itpub.net/9240380/

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9240380/viewspace-1818736/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
提供针对oracle初学者及进阶的数据库培训,欢迎大家咨询: 微信: wisdomone 微信公众号: lovedb 工作经历: 中国普天 北京科蓝 北京云和恩墨 北京神州新桥

注册时间:2008-04-04

  • 博文量
    2189
  • 访问量
    12690173