zoukankan      html  css  js  c++  java
  • clob字段的值插入和查询N种方法【包括java调用存储过程传入clob参数】

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.IOException;
    import java.io.StringWriter;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    public class TestClob {
    public static void main(String[] args) throws SQLException, IOException {
            /**测试所用的表对象
             * CREATE TABLE testclob(
                  col_1_1_21_1  VARCHAR2(500)   NOT NULL,
                  col_1_1_21_2   VARCHAR2(500), 
                  col_1_1_21_46   clob                              
                )
                select * from testclob
             * **/
            String content = "插入内容";
            /**更新clob的内容*/
            String sql = " insert into testclob(col_1_1_21_1,col_1_1_21_2,col_1_1_21_46) values('1','test1',empty_clob())";
            Connection conn = DBPool.getLocalConnection();
            conn.setAutoCommit(false);
            Statement statmt = conn.createStatement();
            statmt.executeUpdate(sql);
            conn.commit();
            
            sql = " select col_1_1_21_46 from testclob where col_1_1_21_1=1 for update";
            PreparedStatement ps = conn.prepareStatement(sql);
            ResultSet rset = ps.executeQuery();
            if (rset.next()){
                oracle.sql.CLOB clob=(oracle.sql.CLOB)rset.getClob(1);
                BufferedWriter out=new BufferedWriter(clob.getCharacterOutputStream());
                out.write(content,0,content.length());
                out.close();
            }
            conn.commit();
            rset.close();
            ps.close();
            
            
            /****读取clob的内容*****/
          sql="select col_1_1_21_46 from testclob ";
          ps=conn.prepareStatement(sql);
          rset=ps.executeQuery();
          while (rset.next()){
               oracle.sql.CLOB clob=(oracle.sql.CLOB)rset.getClob(1);
               BufferedReader in=new BufferedReader(clob.getCharacterStream());
               StringWriter out=new StringWriter();
               int c;
               while((c=in.read())!=-1){
                   out.write(c);
               }
               content=out.toString();
               System.out.println (content);//输出CLOB内容
          }
          rset.close();
          ps.close();
          conn.close();
     }
    }

    clob和blob最大的区别,我觉得在于blob内容是不可见的,而clob是可见的文本。至于他们读写的方式都是可以用流去处理,没有什么大的差异。

    【遇到问题】

    百度上一大堆解决方法,但是就是没有一个适用的,最后只能通过修改方法避开这个异常了。

    @ clob插入值

    public static void main(String[] args) throws SQLException, IOException {
           Connection conn = DBPool.getLocalConnection();
                String sql = "insert into testclob(col_1_1_21_1,col_1_1_21_2,col_1_1_21_46) values ('1','test',?)";// 要执行的SQL语句
                PreparedStatement stmt = conn.prepareStatement(sql);// 加载SQL语句
                // PreparedStatement支持SQL带有问号?,可以动态替换?的内容。
                Reader clobReader = new StringReader(content); // 将 text转成流形式
                stmt.setCharacterStream(1, clobReader, content.length());// 替换sql语句中的?
                stmt.close();
                conn.close();
            }

    @  clob取值

    public static void main(String[] args) throws SQLException, IOException {
            Connection conn= DBPool.getLocalConnection();
            Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
            String sql="select col_1_1_21_46 from testclob where col_1_1_21_1=1"; 
            ResultSet rs=stmt.executeQuery(sql); 
            while(rs.next()) {
                java.sql.Clob clob = rs.getClob("col_1_1_21_46");
                String rtn = clob.getSubString((long)1,(int)clob.length());
                System.out.println(rtn);
            }
            rs.close(); 
            stmt.close(); 
            conn.close(); 
        }

     @ 创建表对象

    CREATE TABLE testclob(
             id  VARCHAR2(500)   NOT NULL,
             name   VARCHAR2(500), 
             vclob   clob                              
    )

    @ 创建并编译存储过程

    create or replace procedure TEST(amobile in clob) is
    amobile2 clob;
    begin
      amobile2 :=amobile;
      insert into testclob(id,name,vclob) values(1,'test',amobile2);
      commit;
    end TEST;

    @ java调用存储过程并传入参数

    import java.io.IOException;
    import java.io.Writer;
    import java.sql.CallableStatement;
    import java.sql.Connection;
    import java.sql.SQLException;
    import oracle.sql.CLOB;
    public class testClobPro {
        /**
         * 该测试方法实现java调用存储过程,参数为clob类型
         * @param args
         * @throws SQLException 
         * @throws IOException 
         */
        public static void main(String[] args) throws SQLException, IOException {
            Connection conn = DBPool.getLocalConnection();
            StringBuffer sBuffer = new StringBuffer();
            for(int i = 1;i<20000;i++){
                sBuffer.append(i).append(",");
            }
            String query = "{call TEST(?)}";
            CallableStatement stmtt = conn.prepareCall(query);
            oracle.sql.CLOB clob = (CLOB)getCLOB(conn,sBuffer.toString());
            stmtt.setObject(1,clob);
            stmtt.execute();
            conn.commit();
            stmtt.close();
            conn.close();
        }
    /**该方法实现将string转化为clob类型对象*/
        public static  CLOB getCLOB( Connection conn ,String clobData) throws SQLException, IOException{
            CLOB clob = CLOB.createTemporary(conn , false,CLOB.DURATION_SESSION ); 
            clob.open( CLOB.MODE_READWRITE );
            Writer tempClobWriter = clob.getCharacterOutputStream( ); 
            tempClobWriter.write( clobData ); 
            tempClobWriter.flush( );
            tempClobWriter.close( ); 
            clob.close( ); 
            return clob;
        }
    }
  • 相关阅读:
    MySQL用户
    python -- 中
    Python -- 上
    Zabbix导入数据库时报错
    chmod无执行权限
    编译安装Tengine
    Nginx的调度算法
    nginx--第三方模块echo
    ngx_http_headers_module
    nginx---隐藏或添加后端服务器的信息
  • 原文地址:https://www.cnblogs.com/zhutouying/p/3433134.html
Copyright © 2011-2022 走看看