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语句.使用存 ...
随机推荐
- [server]nginx 一系列命令
h1. 启动 nginx -c /usr/local/etc/nginx/nginx.conf h1. 停止 nginx -s stop h1. reload nginx -s reload h1.
- 一次浴火重生的MySQL优化(EXPLAIN命令详解)
一直对SQL优化的技能心存无限的向往,之前面试的时候有很多面试官都会来一句,你会优化吗?我说我不太会,这时可能很多人就会有点儿说法了,比如会说不要使用通配符*去检索表.给常常使用的列建立索引.还有创建 ...
- echarts_部分图表配置_堆叠折线图
echarts基本图表使用: 1.获取包裹元素(var myChart = echarts.init(document.getElementById('thisId'));)2.设置option(op ...
- Android对话框和帧动画
Android对话框 在一个例子中展示四种对话框. 设置四个按钮 <LinearLayout xmlns:android="http://schemas.android.com/apk ...
- Git时光机穿梭之版本回退
现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: Git is a distributed version control system. ...
- HDU--1358--KMP算法失配函数getfail()的理解--Period
/* Name: hdu--1358--Period Author: 日天大帝 Date: 20/04/17 10:24 Description: 长度/向后移动的位数 = 出现的次数 kmp其实匹配 ...
- 关于dfs+剪枝第一篇:hdu1010
最近进入了dfs关于剪枝方面的学习,遇到的第一道题就是hdu的1010.一道很基础的剪枝..可我不幸地wa了很多次(待会再解释wa的原因吧QAQ),首先我们来看一下题目. Problem Descri ...
- mysql的内连接,外连接(左外连接,右外连接)巩固
1:mysql的内连接: 内连接(inner join):显示左表以及右表符合连接条件的记录: select a.goods_id,a.goods_name,b.cate_name from tdb_ ...
- 【有意思的BUG】反转的水印
今天无意中看到一个图集,翻着翻着感觉到哪儿不对劲.是的,水印打反了,怎么会出现这样的局面我也不知道,可能就是手抖了吧. 通过与懂这方面知识的人请教,120%的可能是因为图片本身就自带水印,而不是因为后 ...
- pwntools使用简介2
大致框架 官网的一个简单样例 from pwn import * context(arch = 'i386', os = 'linux') r = remote() # EXPLOIT CODE GO ...