• Oracle long raw 类型字段读取问题


    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字段提前读取也是完全可以的。

  • 相关阅读:
    node-express脚手架生成的项目中实现浏览器缓存
    three.js通过canvas实现球体世界平面地图
    激光原理与技术(第二版)课后答案 阎吉祥 版 高等教育出版社 课后习题答案 解析
    Spring2.5注释驱动与基于注释的MVC
    iBatis2学习笔记:入参和返回值的问题
    重写了java.util.Date类中一些过时的方法
    Java日期格式化及其使用例子收集
    深入研究java.lang.ThreadLocal类
    Java:对象的强、软、弱和虚引用
    Java 反射机制深入研究
  • 原文地址:https://www.cnblogs.com/danghuijian/p/4400235.html
Copyright © 2020-2023  润新知