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参数】的更多相关文章

  1. mysql性能优化总结(MySql避免重复插入记录的几种方法)

    如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了:(area,age,salary),(area,age).(area)三个索引,这被称为最佳左前缀特性.因此我们在创 ...

  2. SQLServer 批量插入数据的两种方法

    SQLServer 批量插入数据的两种方法-发布:dxy 字体:[增加 减小] 类型:转载 在SQL Server 中插入一条数据使用Insert语句,但是如果想要批量插入一堆数据的话,循环使用Ins ...

  3. 小白鼠排队(map容器插入数据的四种方法)

    题目描述 N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子.现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色.帽子的颜色用“red”,“ ...

  4. SQL 2005批量插入数据的二种方法

    SQL 2005批量插入数据的二种方法 Posted on 2010-07-22 18:13 moss_tan_jun 阅读(2635) 评论(2) 编辑 收藏 在SQL Server 中插入一条数据 ...

  5. MySql避免重复插入记录的几种方法

    本文章来给大家提供三种在mysql中避免重复插入记录方法,主要是讲到了ignore,Replace,ON DUPLICATE KEY UPDATE三种方法,有需要的朋友可以参考一下 方案一:使用ign ...

  6. ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法 ,聚合,分组,F查询,Q查询,事务 )

    必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...

  7. Birt中实现字段拆分为表的还有一种方法

    来源:     http://developer.actuate.com/community/forum/index.php? /topic/36204-split-data-row/. 将字段拆分为 ...

  8. MyBatis 批量插入数据的 3 种方法!

    批量插入功能是我们日常工作中比较常见的业务功能之一,之前我也写过一篇关于<MyBatis Plus 批量数据插入功能,yyds!>的文章,但评论区的反馈不是很好,主要有两个问题:第一,对 ...

  9. C# 调用存储过程操作 OUTPUT参数和Return返回值

    本文转载:http://www.cnblogs.com/libingql/archive/2010/05/02/1726104.html 存储过程是存放在数据库服务器上的预先编译好的sql语句.使用存 ...

随机推荐

  1. Spring 学习笔记(七)—— 切入点表达式

    为了能够灵活定义切入点位置,Spring AOP提供了多种切入点指示符. execution———用来匹配执行方法的连接点 语法结构:   execution(   方法修饰符  方法返回值  方法所 ...

  2. Hbase单机安装部署

    Hbase单机安装部署 http://blogxinxiucan.sh1.newtouch.com/2017/07/27/Hbase单机安装部署/ 下载Hbase Hbase官网下载地址 http:/ ...

  3. HDU1035 Robot Motion

    Problem Description A robot has been programmed to follow the instructions in its path. Instructions ...

  4. BeanFactory VS FactoryBean

    1. BeanFactory BeanFactory定义了 IOC 容器的最基本形式,并提供了 IOC 容器应遵守的的最基本的接口,也就是Spring IOC 所遵守的最底层和最基本的编程规范.在   ...

  5. Angular4.0从入门到实战打造在线竞拍网站学习笔记之三--依赖注入

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 依赖注入(Dependency Injection) 正常情况下,我们写的代码应该是这样子的: let product = ne ...

  6. 【原创】-- C# 点滴积累 -- String

    一.string.Format() 将[数字字符串]转为两位小数显示的字符串: dt = dtResult.Select(it => new CommodityPriceLimitEntity ...

  7. 写移动端必备的meta标签

    <meta name="renderer" content="webkit" /> <meta http-equiv="X-UA-C ...

  8. [Git] 1、常用Git命令行总结(一)

    一.GIT CLONE最常用的有如下几个 1.最简单直接的命令:git clone xxx.git 2.如果想clone到指定目录:git clone xxx.git “指定目录” 3.clone时创 ...

  9. Spring思维导图(MVC篇)

    写在前面 生活就像海洋,只有意志坚强的人才能到达彼岸. 已经很久没有发文章了呀,想必大家都挂念我了,哈哈. 温故而知新,今天一起来复习一下spring mvc的内容吧. spring mvc简介与运行 ...

  10. VC++动态链接库(DLL)编程深入浅出

    1.概论 先来阐述一下DLL(Dynamic Linkable Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量.函数或类.在仓库的发展史上经历了“无库-静 ...