【ORACLE JDBC】Oracle中使用JDBC对CLOB操作,传说中关于666限制问题
来源:互联网 发布:阿里云收费 编辑:程序博客网 时间:2024/06/05 22:44
Oracle CLOB 666
package Jdbc;import java.io.IOException;import java.io.Reader;import java.io.StringReader;import java.io.Writer;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class JdbcClobTest { private Connection con; /** * mflag = true: 传入Connection * mflag = false: 不传入Connection */ private boolean mflag = false; public void ExeSQL(Connection tConnection) { con = tConnection; mflag = true; } public void ExeSQL() { } /** * 内容过长超过4000字符 需要向数据库中插入大对象来保存内容 * 此方法 提供底层对数据库大对象的操作支持 目前仅支持oracle * oracle数据库可以强制把字符串插入到字符大对象中 此方法仅支持更新大对象 * TODO 下面封装的操作oracle大对象的方法还需要完善!!!!!! * * 输入:预编译sql和需要的参数 在ExeSQL类初始化的时候建立连接。 * 输出:如果成功执行,返回True,否则返回False,并且在Error中设置错误的详细信息 * @param sql String * @param params String[] * @return boolean */ /** * 此方法用于执行对大对象进行操作的sql语句 * 传入的参数:sql带?号(需要传入参数并且为大对象类型)的sql语句,params参数数组,用params中的元素替换sql中的?号 */ public boolean execUpdateClobSQL(String sql, String[] params){ PreparedStatement pstmt = null; StringReader reader = null; System.out.println("预编译ExecSQL执行时间:"+new java.util.Date()+"; ExecSQL : " + sql); if (!mflag){ con = DBConn.getConn(); } try{ pstmt = con.prepareStatement(sql); //循环传入的参数数据 将数组内的参数 赋值给 预编译sql for (int i = 0; i < params.length; i++) { System.out.println("传入参数:"+params[i]+" 的对象类型:"+params[i].getClass().getName()); reader = new StringReader(params[i]); pstmt.setCharacterStream(i+1, reader,params[i].length()); System.out.println("reader = " + reader); } pstmt.execute(); pstmt.close(); if (!mflag){ con.commit(); con.close(); } } catch (SQLException e){ // @@错误处理 System.out.println("### Error ExeSQL at execUpdateSQL: " + sql); try{ if (pstmt != null){ //由于描述的问题,导致执行的sql错误百出,因此pstmt的关闭需要特殊处理 try{ pstmt.close(); } catch (SQLException ex){ ex.printStackTrace(); } finally{ try{ System.out.println("Sql's bug is very big: " + sql); pstmt.close(); } catch (SQLException ex){} } } if (!mflag){ con.rollback(); con.close(); } } catch (SQLException ex){ //在这个地方,有可能会没有关闭连接 ex.printStackTrace(); return false; } return false; }finally{ reader.close(); try {pstmt.close();} catch (SQLException e) {e.printStackTrace();} } return true; } /*** * * 更新oracle的CLOB字段 上面的方法只能做插入带有CLOB的操作 * @param sql String 例如:select workjson from tbl_lwprocess where processid = ? for update * @param params String[] 此处为?需要的值 * @param toClobString 需要写入大对象字段的字符串 * @return boolean */ public boolean updateClob(String sql, String[] params, String toClobString){ PreparedStatement pstmt = null;ResultSet rs = null; Writer write = null;oracle.sql.CLOB clob = null; //System.out.println("下面是预编译ExecSQL..."); System.out.println("预编译ExecSQL执行时间:"+new java.util.Date()+"; ExecSQL : " + sql); try{ if (!mflag){ con = DBConn.getConn(); con.setAutoCommit(false); } pstmt = con.prepareStatement(sql); //循环传入的参数数据 将数组内的参数 赋值给 预编译sql modified by guodanlong at 2012-05-28 for (int i = 0; i < params.length; i++) { System.out.println("传入参数:"+params[i]+" 的对象类型:"+params[i].getClass().getName()); pstmt.setObject(i+1, params[i]); } rs = pstmt.executeQuery(); if(rs.next()) { clob = (oracle.sql.CLOB)rs.getClob(1); } write = clob.getCharacterOutputStream(); write.write(toClobString); write.flush(); write.close(); rs.close(); pstmt.close(); if (!mflag){ con.commit(); con.close(); } } catch (Exception e){ // @@错误处理 System.out.println("### Error ExeSQL at execUpdateSQL: " + sql); try{ if (pstmt != null){ //由于描述的问题,导致执行的sql错误百出,因此pstmt的关闭需要特殊处理 try{ pstmt.close(); } catch (SQLException ex){ ex.printStackTrace(); } finally{ try{ System.out.println("Sql's bug is very big: " + sql); pstmt.close(); } catch (SQLException ex){} } } if (!mflag){ con.rollback(); con.close(); } } catch (SQLException ex){ //在这个地方,有可能会没有关闭连接 ex.printStackTrace(); return false; } return false; }finally{ try { write.close();pstmt.close();} catch (Exception e) {e.printStackTrace();} } return true; } /*** * 支持系统底层获取数据库大对象内容 * 每次只能获取一个大对象字段的全部内容 * 后续如有需要获取部分大对象内容请重载此方法 * 目前仅支持oracle * * 预编译sql执行查询,将预编译的sql查询结果返回! * @param sql String //预编译sql * @param params Object[] //预编译sql需要的参数 * @return String //返回预编译sql和参数组合后的sql命令执行后的结果集 * */ public String execClobSQL(String sql ,Object[] params) { PreparedStatement pstmt = null; ResultSet rs = null; String clobStr = ""; System.out.println("预编译ExecSQL执行时间:"+new java.util.Date()+"; ExecSQL : " + sql); if (!mflag) { con = DBConn.getConn(); } try { pstmt = con.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY , ResultSet.CONCUR_READ_ONLY); //循环传入的参数数据 将数组内的参数 赋值给 预编译sql modified by guodanlong at 2012-05-28 for (int i = 0; i < params.length; i++) { System.out.println("传入参数:"+params[i]+" 的对象类型:"+params[i].getClass().getName()); pstmt.setObject(i+1, params[i]); } rs = pstmt.executeQuery(); /** * 下面将结果集中的大对象流 读出并拼装成字符串返回 * 如果有记录去取出大对象的内容并处理 * 如果有记录 大对象的内容没有 则直接返回 */ if (rs.next()) { java.sql.Clob clob = rs.getClob(1); if(clob == null){//如果大对象字段为空 则直接返回""字符串 return clobStr; } Reader inStream = clob.getCharacterStream(); char[] c = new char[(int) clob.length()]; try {inStream.read(c);clobStr = new String(c); inStream.close(); } catch (IOException e) {e.printStackTrace();} //clobStr是读出并需要返回的数据,类型是String } rs.close(); pstmt.close(); if (!mflag) { con.close(); } } catch (SQLException e) { System.out.println("### Error ExeSQL at execSQL(String sql): " + sql); e.printStackTrace(); // @@错误处理 try { if (rs != null) { rs.close(); } if (pstmt != null) { //由于描述的问题,导致执行的sql错误百出,因此pstmt的关闭需要特殊处理 try { pstmt.close(); } catch (SQLException ex) { ex.printStackTrace(); } finally { try { System.out.println("Sql's bug is very big: " + sql); pstmt.close(); } catch (SQLException ex) {} } } if (!mflag) { con.close(); } } catch (SQLException ex) { ex.printStackTrace(); } } return clobStr; } public static void main(String[] args) { JdbcClobTest jdbcClobTest=new JdbcClobTest(); //查询CLOB字段 String cxsql = "select workjson from tbl_lwprocess"; String content = jdbcClobTest.execClobSQL(cxsql,new String[] {}); System.out.println(content); //插入String crsql = "insert into tbl_lwprocess (processid,workjson) values ('001',?) ";String[] crparams={"123测试大字符串"};jdbcClobTest.execUpdateClobSQL(crsql, crparams);content = jdbcClobTest.execClobSQL(cxsql,new String[] {}); System.out.println(content); //更新 String gxsql = "select workjson from tbl_lwprocess where 1 = ? for update ";String workjson = "{111naasdfasdfasdfasdfasdfasdfasdfme':null,'count':3,'nodes':[{'id':'node_1','name':'0000000010','type':'node','shape':'rect','number':1,'left':100,'top':80,'width':100,'height':40,'property':[{'id':'n_p_name','text':'select','value':'0000000010'}]},{'id':'node_2','name':'0000000003','type':'node','shape':'rect','number':2,'left':145,'top':193,'width':100,'height':40,'property':[{'id':'n_p_name','text':'select','value':'0000000003'}]}],'lines':[{'id':'line_3','name':'001','type':'line','shape':'line','number':3,'from':'node_1','to':'node_2','fromx':150,'fromy':120,'tox':145,'toy':193,'polydot':[],'property':[{'id':'l_p_id','text':'span','value':'line_3'},{'id':'l_p_name','text':'}]}]} f";String[] params={"1"};jdbcClobTest.updateClob(gxsql, params, workjson);content = jdbcClobTest.execClobSQL(cxsql,new String[] {}); System.out.println(content);} }
0 0
- 【ORACLE JDBC】Oracle中使用JDBC对CLOB操作,传说中关于666限制问题
- JDBC操作Oracle CLOB对象
- ORACLE用JDBC操作CLOB
- JDBC 对oracle 的clob ,blob类型的操作方式
- JDBC 对oracle 的clob ,blob类型的操作方式
- 使用JDBC操作基于Oracle的CLOB,BLOB字段类型
- JDBC 处理Oracle Clob字段
- Oracle jdbc 插入 clob blob
- oracle的CLOB和BLOB (jdbc实现对其操作示例代码)
- oracle的CLOB和BLOB (jdbc实现对其操作示例代码)
- Oracle中JDBC对BLOB和CLOB读取的专用处理和通用处理
- Oracle中JDBC对BLOB和CLOB读取的专用处理和通用处理
- 通过JDBC 操作 ORACLE BLOB,CLOB字段类型
- (转)通过JDBC 操作 ORACLE BLOB,CLOB字段类型
- 利用JDBC操作Oracle CLOB和BLOB类型数据
- jdbc学习:操作Oracle的CLOB和BLOB数据
- 关于 hibernate oracle jdbc处理 blob clob 字段
- 使用jdbc操作Oracle数据库
- 循环渐进Nagios---操作篇(二)配置Nagios
- 未分类--Windows API--CanShareFolderW
- 系统QUEUE
- Eclipse背景颜色设置(设置成豆沙绿色保护眼睛,码农保护色)
- 基于xml的springmvc配置例子
- 【ORACLE JDBC】Oracle中使用JDBC对CLOB操作,传说中关于666限制问题
- 学习的一些体会
- openssl 进行RSA加解密
- 它山之石
- Symfony2 中event的使用
- spring mvc HttpServletRequest
- 通过压缩png图片的方式减少ipa包的尺寸
- HTML页面无刷新评论
- iphone ios 如何减少安装包的大小