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;
}
}
clob字段的值插入和查询N种方法【包括java调用存储过程传入clob参数】的更多相关文章
- mysql性能优化总结(MySql避免重复插入记录的几种方法)
如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了:(area,age,salary),(area,age).(area)三个索引,这被称为最佳左前缀特性.因此我们在创 ...
- SQLServer 批量插入数据的两种方法
SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...
- 小白鼠排队(map容器插入数据的四种方法)
题目描述 N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用“red”,“ ...
- SQL 2005批量插入数据的二种方法
SQL 2005批量插入数据的二种方法 Posted on 2010-07-22 18:13 moss_tan_jun 阅读(2635) 评论(2) 编辑 收藏 在SQL Server 中插入一条数据 ...
- MySql避免重复插入记录的几种方法
本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,有需要的朋友可以参考一下 方案一:使用ign ...
- ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法 ,聚合,分组,F查询,Q查询,事务 )
必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...
- Birt中实现字段拆分为表的还有一种方法
来源: http://developer.actuate.com/community/forum/index.php? /topic/36204-split-data-row/. 将字段拆分为 ...
- MyBatis 批量插入数据的 3 种方法!
批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 ...
- C# 调用存储过程操作 OUTPUT参数和Return返回值
本文转载:http://www.cnblogs.com/libingql/archive/2010/05/02/1726104.html 存储过程是存放在数据库服务器上的预先编译好的sql语句.使用存 ...
随机推荐
- [JAVASCRIPT]实现页面复制至电脑剪贴板
一. 方法 方1: window.clipboarddata 可惜不支持chrome , chrome 下会提示找不到 clipboarddata 对象 方2: 采用国外大牛写的ZeroClipbo ...
- redis 一般性使用概述
最近一段时间与redis接触比较频繁.发现有些东西还是工作中经常会用到的,自己也花了点时间巩固下.本篇文章主要是以总结性的方式梳理,因为redis的主题很大,任何一个技术点展开都是几篇文章的量.也可以 ...
- git 安装 和 基本操作
林纳斯的小故事 感兴趣的同学可以自己百度一下 版本控制常用svn git @@@svn 1 搭建环境 server:visualSVN Serverserver port: https 默认443ht ...
- 【原创】IE11惊现无厘头Crash BUG(三招搞死你的IE11,并提供可重现代码)!
前言 很多人都知道我们在做FineUI控件库,而且我们也做了超过 9 年的时间,在和浏览器无数次的交往中,也发现了多个浏览器自身的BUG,并公开出来方便大家查阅: 分享IE7一个神奇的BUG(不是封闭 ...
- Json 工具介绍 fastjson gson jackson
1. fastjson fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致, 是目前Java语言中最快的J ...
- rabbitmq重装之后无法加入原有cluster的bug解析
背景: 一台controller node,一台compute1节点 两台机器的host文件均已经进行hostname解析 两节点本已经加入了同一rabbitmq cluster 但controlle ...
- java笔录---反射机制(1)
引言 为了方便记忆java的反射机制,在这里仔细的总结了一下.主要是怕以后忘记了,这样也方便回忆.因为最近利用空余时间深入的了解spring和Mybatis框架, 像spring中核心模块IO ...
- python-插入排序
所谓插入排序,就是检查第i个数字,若比它的左边的数字小,则进行交换,一直持续这个动作,直到它的左边的数字比它还要小,则停止. #coding:utf-8def insertion_sort(nums) ...
- TeamCity : Build 失败条件
允许用户配置 Build 失败的条件是很有用的功能,它是我们配置复杂 Build 流程的基础.TeamCity 为用户自定义 Build 失败条件提供了很好的支持.这些条件大体上可以分为两类,分别是: ...
- [SCOI2007]压缩 区间dp
明显是个区间dp,但是我区间dp就是个渣... f[i][j]表示区间i到j最短的字符长度:假设前面加了个M,所以初始化f[i][i]=2;当然最开始是不算M的,所以f[1][1]=1;然后就可以区间 ...