日期:2014-05-16  浏览次数:20484 次

oracle数据库clob数据类型处理

目标:从文本文件中读取clob数据,并保存到oracle数据库中。

?

//创建文件流
BufferedReader br? = new BufferedReader(new FileReader("D:\\sq.js"));//建立一个文件读取流
String lineContent = "";//用于记录每一行内容的变量
//链接数据库
Class.forName("oracle.jdbc.driver.OracleDriver");//加载oracle数据库驱动
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "db_qb", "pw123456");

//oracle数据库JDBC链接字符串,其中:orcl是数据库实例名称,db_qb未数据库用户名,pw123456未密码
Statement st = con.createStatement();//给予数据库链接建立sql陈述对象。
System.out.println("数据库链接成功.");
con.setAutoCommit(false);//关闭自动认可模式
//循环从文本文件读出的数据
?for (int i = 0; (lineContent = br.readLine()) != null; i++) {
? //获得数据
? String str =""+lineContent;
? int f = str.indexOf("=");
? int l = str.length();
? String name =str.substring(0,f);//社区id
? String border=str.substring(f+1,l);//border
? System.out.println(name+"------"+border);
? //数据库结构 id number,border clob;
? //构造sql语句
?String insert ="update tb_gis_community? set border=empty_clob() where id='"+name+"'";//首先给border字段插入一个空的clob对象:empty_clob();(不然的话跟新失败)
?st.executeUpdate(insert);//执行更新语句
?// 锁定数据行进行更新,注意“for update”语句
?String update ="select border from tb_gis_community where id ='"+name+"' for update";//然后更新border字段为从文本文件读入的超长的clob值。
?ResultSet rs = st.executeQuery(update);//执行更新语句
?Writer outStream;//声明一个输出流
?if (rs.next()) {
??oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("border");//获得数据中border的值,并强制转换为clob对象
??outStream = clob.getCharacterOutputStream();//获得clob对象的字符输出流
??String data =border;// 获得从文本文件读取的border值
??char[] c = data.toCharArray();//将border转换为字符数组
??outStream.write(c, 0, c.length);//clob的字符输出流写入字符数组
??outStream.flush();//清空
??outStream.close();//关闭输出流
?}
?}
?con.commit();//提交操作
?con.close();//关闭数据库链接

?

?

?

目标:从oracle数据库中读取clob数据

?

String sql ="select t.point_x,t.point_y,t.border as border from gis_pcs_all t where t.pcs_name='"+name+"'";
//数据库结构:point_x number(20,8) x坐标;point_Y number(20,8) y坐标;border clob gis轮廓数据;
ResultSet res = this.executeQuery(sql);//执行查询的sql语句,获得结果集对象
String[] datas = new String[3];//声明一个大小为3的字符串数组,用来盛装结果
int count =0;
try {
?if(res.next()){
??datas[0] = res.getDouble(1)+"";//x坐标
??datas[1] = res.getDouble(2)+"";//y作保
??CLOB clob = (CLOB) res.getClob("border");//gis轮廓数据 需要强制转换为club对象,但这是不能够直接使用??
??if(clob!=null){
??????????? char[] chars = new char[(int) clob.length()];//(int)clob.length();//依据club对象大小,创建一个字符数据
??????????? //System.out.println(clob.getLength()+":::"+clob.length());//clob.getLength()和clob.length()两个长度不一样,前者大概是后者的两倍,且前者导致方块乱码
??????????? clob.getCharacterStream().read(chars);?? //用字符数组接受clob对象的字符输出流
??????????? String content = new String(chars);?? //根据字符数据实例化字符串对象,java程序可以直接使用了
???datas[2] =( content==null?"":content+"");//
???System.out.println("clob信息:"+datas[0]+"==="+content);
???return datas;
??}else{
???System.out.println("clob为空");
???return null;
??}
?}

?

?

?

?

?

<!-- 日志内容 结束 --><!-- 日志来源 开始 --><!-- 日志来源 结束 --><!-- 日志信息 开始 -