Oracle long raw 类型字段读取问题
【问题描述】
项目中用到了long raw 类型字段用于存放配置文件内容,一直相安无事。突然有一天需要修改设计,增加了一个字段"group_name",问题来了,读取long raw字段总是提是“流已关闭”,经过一番较量,才算解决,在此和大家分享一下。
系统环境:windows 2003 enterprise/Oracle 9.2.1.0
原表结构:
create table bt_defination
(
id number(32) not null,
name varchar2(100) not null,
data long raw not null,
project_id number(32) not null,
primary key(id)
)
具体执行步骤如下:
getConnection()....
createStatement()....
executeQuery("select * from bt_defination");
while(res.next())
{
res.getLong("id");
res.getString("name");
res.getBytes("data");
res.getLong("project_id");
}
执行一切正常。
【下面即为修改后执行出错的情况】
修改后的表结构(增加了一个字段group_name,扩充为主键):
create table bt_defination
(
id number(32) not null,
name varchar2(100) not null,
data long raw not null,
group_name varchar(20) not null,
project_id number(32) not null,
primary key(id,name)
)
执行步骤修改为:
具体执行步骤如下:
getConnection()....
createStatement()....
executeQuery("select * from bt_defination");
while(res.next())
{
res.getLong("id");
res.getString("group_name");//new added
res.getString("name");
res.getBytes("data");
res.getLong("project_id");
}
结果显示:SQLException("流已关闭")
分析修改前后,并无不妥之处,只是增加了一个字段而已。
【解决办法】
修改sql语句-〉executeQuery("select id,group_name,name,data,project_id from bt_defination");
执行一切正常!
【错误分析】
原来是select列表和res的get顺序不一致(这种问题在不含二进制字段的查询中不存在)。
得出结论——对于包含二进制字段的查询操作,需要严格按照select列表的顺序读取,对于select * from ...的情况,默认顺序时间表语句的字段顺序。
或者更严格的说,二进制字段的数据可以提前读取,但是绝对不能延后。举个例子:
getConnection()....
createStatement()....
executeQuery("select id,group_name,name,data,project_id from bt_defination");
while(res.next())
{
res.getBytes("data");//up
res.getLong("id");
res.getString("group_name");//new added
res.getString("name");
res.getLong("project_id");
}
data字段提前读取也是完全可以的。