kaingking 2010-08-03 18:43
浏览 790
已采纳

Oracle中nclob字段的插入问题

我用的是java 后台访问oracle
给oracle中的nclob类型的字段插入string类型的对象logresult,如果对象的长度过长时提示
ORA-01460: unimplemented or unreasonable conversion requested
在网上查说jar包用class12不行,我就改成ojdbc14.jar,但是问题依旧,打印报错时string对象logresult长度为3277.
如果长度短一切正常。

在网上找了一种用io来处理这个string对象logresult的方法
[code="java"]
byte[] bytes_logresult =logresult.getBytes();

ByteArrayInputStream result = new ByteArrayInputStream( bytes_logresult );

InputStreamReader clobReader = new InputStreamReader(result);

stmt.setCharacterStream(1,clobReader ,bytes_logresult.length);

stmt.executeUpdate();

[/code]
这个时候操作成功!但是,一旦string类型长度过长,则乱码:
[img]http://dl.iteye.com/upload/attachment/287503/b8f56f7c-ee88-327f-93be-69a1257fa23a.jpg[/img]字符串短则正常:

[img]http://dl.iteye.com/upload/attachment/287505/c9c199c4-35d7-366c-a55c-e564866e90f7.jpg[/img]

这个到底是怎么回事,字符串长了为什么会全部乱码啊?帮忙解答下啊,我弄了好几天都没弄出来。。。

  • 写回答

2条回答 默认 最新

  • nxyc_twz 2010-08-04 15:53
    关注

    研究了一中午,终于把这个问题解决了!
    1.创建test数据表(nclob好像不行,我改为clob了,不知是否影响你的使用?):
    [code="java"]create table nclob_test (id number primary key, content clob);[/code]
    2.java代码:
    [code="java"]
    public class TestClob{
    public static void write_nclob(Connection con) throws SQLException,
    IOException {
    // 1.新增数据时clob字段值为empty_clob()
    PreparedStatement smt = con
    .prepareStatement("insert into nclob_test(id, content) values(?, empty_clob())");
    smt.setInt(1, 1);
    smt.executeUpdate();
    smt.close();

        //此处演示从文件中加载内容
        File f = new File("e:\\促进企业节能增效.txt"); // 示例文件大小为200k
        InputStream is = new FileInputStream(f);
        byte[] data = new byte[(int) is.available()];
        is.read(data);
        is.close();
        String buf = new String(data);
        //写clob数据到数据库
        update_nclob(con, buf);
    }
    
    public static void update_nclob(Connection con, String value) throws SQLException,
            IOException {
        // 此处注意用for update方式select
        PreparedStatement smt = con
        .prepareStatement("select id, content from nclob_test where id=1 for update");
        // 更新clob值 注意必须将commit方式置为false
        boolean old_c = con.getAutoCommit();
        con.setAutoCommit(false);
    
        ResultSet rs = smt.executeQuery();
        if (rs.next()) {
            Clob clob = rs.getClob(2);
            BufferedWriter out = new BufferedWriter(((oracle.sql.CLOB) clob)
                    .getCharacterOutputStream());
            BufferedReader in = new BufferedReader(new StringReader(value));
            int c;
            while ((c = in.read()) != -1) {
                out.write(c);
            }
            out.close();
            con.commit();
            smt.close();
        }
        con.setAutoCommit(old_c);
    }
    
    public static void load_nclob(Connection con) throws SQLException,
            IOException {
        PreparedStatement smt = con
                .prepareStatement("select * from nclob_test");
        ResultSet rs = smt.executeQuery();
        if (rs.next()) {
            Clob c = rs.getClob(2);
            char[] cbuf = new char[4096];
            c.getCharacterStream().read(cbuf);
            String content = c.getSubString(1, (int) c.length());
            // System.out.println(content);
            System.out.println(new String(cbuf));
        }
    
        rs.close();
        smt.close();
    }
    
    public static void main(String[] args) throws SQLException, IOException {
        Connection con = 此处省略与数据库的连接,这个大家都会吧?!        
            write_nclob(con);
       load_nclob(con);
    }
    

    }
    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B