一、问题场景描述
工作过程中,同事反馈创建表时出现报错,提示如下:
报错位置:ORA-06512: 在 "NH_XXX_SX.GET_FINANCE_SX", line 64
报错信息:ORA-00997: 非法使用 LONG 数据类
执行语句如下:(执行后确实有上面报错)
CREATE TABLE NH_MCRO_FINANCE_SX.QUEST_SL_TEMP_EXPLAIN1 AS SELECT * FROM QUEST_SL_TEMP_EXPLAIN1@FINANCE a ;
建表语句摘出:
create global temporary table QUEST_SL_TEMP_EXPLAIN1
(
statement_id VARCHAR2(30),
plan_id NUMBER,
timestamp DATE,
partition_start VARCHAR2(255),
partition_stop VARCHAR2(255),
partition_id INTEGER,
other LONG,
other_xml CLOB,
.......
)
on commit preserve rows;
二、查阅资料
ORA-00997 错误的原因是 Oracle 不允许在某些情况下直接使用 LONG 数据类型进行排序、分组或使用在 SELECT 子句中。LONG 类型是一种较旧的数据类型,它具有很多限制,因此 Oracle 推荐在新的开发中使用 CLOB(Character Large Object)或其他更现代的数据类型。
话不多说,以下通过实验验证。
三、模拟做实验
3.1创建模拟表
create table feng_aa
(a long);
3.2执行语句,验证报错
create table feng_bb as select * from feng_aa;
结果报错:ORA-00997:非法使用long 类型。问题复现
3.3验证long类型 确认原因
(1)long类型-分组无法使用
在 GROUP BY 子句中,使用了 LONG 类型的列而未正确处理。
select a from feng_aa group by a;
(2)long类型-排序无法使用
select * from feng_aa order by a;
在 ORDER BY 子句中,使用了 LONG 类型的列而未正确处理。
(3)long类型-where判断无法使用
在 WHERE 子句中,使用了 LONG 类型的列而未正确处理。
select * from feng_aa where a >1;
四、解决办法:
4.1修改字段类型:ok解决
LONG 类型有很多限制,因此 Oracle 推荐在新的开发中使用 CLOB(Character Large Object)或其他更现代的数据类型。
alter table FENG_AA modify a clob;
执行成功:ok
4.2用到时转换为LONG :ok解决
使用 TO_LOB 函数将 LONG 类型的列转换为 CLOB 或 BLOB 数据类型
create table feng_bb as select to_lob(a) a from feng_aa
执行结果:ok
查看建表语句: 发现自动转为clob了。
create table FENG_BB
(
a CLOB
)