美文网首页
Java读取、写入、更新Clob字段

Java读取、写入、更新Clob字段

作者: ming_Liu | 来源:发表于2019-07-31 16:28 被阅读0次

    jdbc或PL/SQL中通过insert语句插入数据时,如果有CLOB字段,且插入的数据长度超过4000,且会报ORA-01704字符串文字太长的错。

    一.java jdbc方式处理

            对于CLOB字段,其实就需要通过流的方式处理,如下是从网上搜集的一些处理方式。

    1.CharacterStream方式

    /*

    --建表语句如下:

    create table t_clob(

            id varchar2(32) primary key,

            clobfield CLOB

            );

     */ 

    /**

     * 读取CLOB字段的代码示例

     */  

    public void readClob() {  

    //自定义的数据库连接管理类   

        Connection conn = DbManager.getInstance().getConnection();  (每个项目获取connection的方式不一样,依据自己项目情况而定。)

    try {  

            PreparedStatement stat = conn  

    .prepareStatement("select clobfield from t_clob where id='1'");  

            ResultSet rs = stat.executeQuery();  

    if (rs.next()) {  

                oracle.sql.CLOB clob = (oracle.sql.CLOB) rs  

    .getClob("clobfield");  

    String value = clob.getSubString(1, (int) clob.length());  

    System.out.println("CLOB字段的值:" + value);  

            }  

            conn.commit();  

    }catch (SQLException e) {  

            e.printStackTrace();  

        } 

        DbManager.getInstance().closeConnection(conn);  

    /**

     * 写入、更新CLOB字段的代码示例

     */  

    public void writeClob() {  

    //自定义的数据库连接管理类   

        Connection conn = DbManager.getInstance().getConnection();  

    try {  

    conn.setAutoCommit(false);  

    // 1.这种方法写入CLOB字段可以。  

            PreparedStatement stat = conn  

    .prepareStatement("insert into t_clob (id,clobfield) values(sys_guid(),?)");  

    String clobContent ="This is a very very long string";  

    StringReader reader =new StringReader(clobContent);  

    stat.setCharacterStream(1, reader, clobContent.length());  

            stat.executeUpdate(); 

    // 2.使用类似的方法进行更新CLOB字段,则不能成功   

    // stat.close();  

    // stat =null;  

    // stat =  

    // conn.prepareStatement("update t_clob set clobfield=? where id=1");  

    // stat.setCharacterStream(1, reader, clobContent.length());  

    // stat.executeUpdate(); 

    // 3.需要使用for update方法来进行更新,  

    // 但是,特别需要注意,如果原来CLOB字段有值,需要使用empty_clob()将其清空。  

    // 如果原来是null,也不能更新,必须是empty_clob()返回的结果。  

            stat = conn  

    .prepareStatement("select clobfield from t_clob where id='1' for update");  

            ResultSet rs = stat.executeQuery();  

    if (rs.next()) {  

                oracle.sql.CLOB clob = (oracle.sql.CLOB) rs  

    .getClob("clobfield");  

                Writer outStream = clob.getCharacterOutputStream();  

    char[] c = clobContent.toCharArray();  

    outStream.write(c,0, c.length);  

                outStream.flush();  

                outStream.close();  

            }  

            conn.commit();  

    }catch (SQLException | IOException e) {  

    // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

        DbManager.getInstance().closeConnection(conn); 

    二.sql方式

            当通过insert语句直接插入大量字符串(主要是html的内容),超过4000字符时候,就会报:ORA-01489: 字符串连接的结果过长。

            虽然字段是clob,足以存储,但是通过这种直接插入的时候,因为没有强制指定带插入字符串为clob类型,oracle会把插入的字符串作为 “字符串类型”处理,由于oracle有最大字符串限制(不超过4000个字符),所以会报错。

            解决思路:指定待插入字符串类型为clob,可以使用过程或存储过程。

    实例:

    DECLARE  

    REALLYBIGTEXTSTRING CLOB :='待插入的海量字符串';  

    BEGIN  

    INSERT INTO test_table VALUES('test', REALLYBIGTEXTSTRING, '0');  

    end ; 

    commit;  

    相关文章

      网友评论

          本文标题:Java读取、写入、更新Clob字段

          本文链接:https://www.haomeiwen.com/subject/llytdctx.html