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语句.使用存 ...
随机推荐
- Css元素居中设置
你对DIV CSS居中的方法是否了解,这里和大家分享一下,用CSS让元素居中显示并不是件很简单的事情,让我们先来看一下CSS中常见的几种让元素水平居中显示的方法. DIV CSS居中 用CSS让元素居 ...
- HDU 6034---Balala Power!(搜索+贪心)
题目链接 Problem Description Talented Mr.Tang has n strings consisting of only lower case characters. He ...
- 实验楼 1. k-近邻算法实现手写数字识别系统--《机器学习实战 》
首先看看一些关键词:K-NN算法,训练集,测试集,特征(空间),标签 举实验楼中的样例,通俗的讲讲K-NN算法:电影有两个分类(标签)-动作片-爱情片.两个特征--打斗场面--亲吻画面. 将那些数字和 ...
- 基于.net的微服务架构的开发测试环境运维实践
眼下,做互联网应用,最火的架构是微服务,最热的研发管理就是DevOps, 没有之一.微服务.DevOps已经被大量应用,它们已经像传说中的那样,可以无所不能.特来电云平台,通过近两年多的实践,发现完全 ...
- javascript编程解决黑白卡片问题
问题描述: 时间限制:1秒 空间限制:32768K 牛牛有n张卡片排成一个序列.每张卡片一面是黑色的,另一面是白色的.初始状态的时候有些卡片是黑色朝上,有些卡片是白色朝上.牛牛现在想要把一些卡片翻过来 ...
- reversing.kr easy crack 之write up
之前学逆向感觉学得一踏糊涂,这阶段好多师傅带我,一定要好好学,重新开始,认真学习. 来看打开可执行文件: 用ollydbg载入,单步执行后停到了入口点: 分析入口点,并没有加壳,于是F9执行程序,跳出 ...
- 记录easyui一些用法
自己备注,省的之后忘记.用到一个写一个,不断添加 1.form里的一些控件如textbox.combobox等添加额外的一些事件,如鼠标事件(mouseover.click等),键盘事件(keydow ...
- Mysql自动填充测试数据
前言 最近写了两个小脚本,一个应用于Mysql的自动填充测试数据,另外一个是bash写的定期删除日志文件,两个脚本如何使用,在GitHub上面都有所说明,这里不再赘述,这里主要是想聊一下Mysql的存 ...
- Centos 7.3 安装mysql5.7.19 各种调试就不多说了
mysql 5.7.19linux-glibc2.12 (x86_64) 安装 1.在安装目录进行解压2.mv解压目录为mysql3.创建mysql的用户 useradd -s /sbin/nolon ...
- NYOJ 69 数的长度(数学)
数的长度 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 N!阶乘是一个非常大的数,大家都知道计算公式是N!=N*(N-1)······*2*1.现在你的任务是计算出 ...