目标:从文本文件中读取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;
}
}
<!-- 日志内容 结束 --><!-- 日志来源 开始 --><!-- 日志来源 结束 --><!-- 日志信息 开始 -->