情景:使用Oracle 的clob字段存储大内容。如果使用其他的类型,数据超过时会报错:java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column
也许很多人会疑问为什么会报这个错,这个是因为Oracle在存储时,如果发现内容超过4000的话,会自动强转成long类型,但是你数据其实不是long类型的,所以会报这个错误。
不说别的了,我们在set PreparedStatement 的时候,必须使用stmt.setClob(new Clob),但是jdk里面的Clob是接口,并不是所有的数据库供应商都实现了接口,Oracle实现了这个接口。
先来看API:
CLOB clob = oracle.sql.CLOB.createTemporary((OracleConnection) conn, true,CLOB.DURATION_SESSION);
问题:createTemporary的构造函数需要三个参数,第一个是Oracle的connection,第二个表示当前的Clob是否需要缓存,第三个表示当前Clob的持续时间。具体怎么用?
connection必须是Oracle的,jdbc的不行,其他服务器插件封装过的也不行。此处展开谈获取Oracle的连接。
如果是单纯的驱动连接肯定很简单:
DriverManager.registerDriver(new OracleDriver());
connection = DriverManager.getConnection(getUrl(),getUserID(),getPassword());
但是一般我们数据连接都是通过服务器配置,从环境中lookup来的,这样不同的服务器插件会有不同的封装,比如Jboss会封装成org.jboss.resource.adapter.jdbc.jdk6.WrappedConnectionJDK,所以想要获取对底层的驱动连接引用,必须使用meta信息(以jboss为例)。
Connection myCon = originalCon.getMetaData().getConnection();
这样获取的connection就是环境加载是装载的驱动连接。
第二个参数表示是否用缓存,这个按照个人要求。
第三个参数表示Clob的持续时间,一般我们用DURATION_SESSION,表示当前session范围内有效(不是httpsession),一般用于客户端连接。还有其他的值DURATION_CALL,一般用于存储过程的调用。
这样完整的set prepare statement 方法就是这样的:
Connection conn = con.getMetaData().getConnection();
CLOB clob = oracle.sql.CLOB.createTemporary((OracleConnection) conn, true,CLOB.DURATION_SESSION);
clob.setString(1, strFldValue);
stmt.setClob(iFldIndex, clob);
clob.freeTemporary();
free方法必须要在stmt提交之后调用,这里只是模拟代码。如果提前清楚会报错:
java.sql.SQLException: ORA-22922: nonexistent LOB value
记录以备查阅。
补充一点,在jdk1.6以后,jdk已经支持了oracle的Clob字段,也就是不用到底层取Oracle的连接了,而是直接使用jdk的标准接口访问:
clob =conn.createClob();
clob.setString(1, strFldValue); stmt.setClob(iFldIndex, clob);
分享到:
相关推荐
JDBC读写Oracle的CLOB字段
JDBC方式操作CLOB字段实例代码 。
主要是整合了jdbc处理clob类型的增删改查方法,有需要的同学可以看下
oracle中使用jdbc读写clob字段,很多细节介绍,内容全面。
Oracle如何插入CLOB字段值,附件为简单的示例代码。Oracle如何插入CLOB字段值,附件为简单的示例代码。
本篇文章是对jdbc处理oracle的clob字段进行了详细的分析介绍,需要的朋友参考下
最近在用oracle的过程中用到了对blob字段模糊查询的问题,对oracle来说,我并不是高手,找了很多的资料终于能够查出来了。 blob字段直接用 select * from table_name where column like ‘%%'查找的时候是不能实现...
通过jdbc读取oracle数据库的clob类型的字段转换为string类型
针对oracle中blob字段的操作,能批量快速的插入大字段,效率非常高
本篇是对使用jdbc,hibernate处理clob/blob字段进行了详细的分析介绍,需要的朋友参考下
oracle的jdbc驱动程序,用这个版本的操作Clob,blob类型的数据很方便。 博文链接:https://zhenjw.iteye.com/blog/173419
oracle 10g jdbc 驱动 可以使用getString 取clob字段
下面以程序实例说明通过JDBC操纵Oracle数据库LOB类型字段的几种情况。 先建立如下两个测试用的数据库表,Power Designer PD模型如下: 建表SQL语句为:CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)CREATE
这是Hibernate3引入的新特性,对于包含重量级大数据的表字段,这种抽取方式提高了对大字段操作的灵活性,否则加载Tfile对象的结果集时如果总是返回fileContent,这种批量的数据抽取将可以引起数据库的"洪泛效应"。...
jdk1.7 达梦驱动包,此为2020.4月分最新jar包,解决clob更新报错等问题,另外请注意,达梦不支持大字段类型比较,distinct,union ,order by,group by, max() 等等语句都属于字段比较. 大字段类型有text,blob,clob 等等
swing开发的数据库管理工具,系统自带常用的主流数据库驱动包,其他数据库可以扩展添加(只要添加数据库jdbc驱动的jar包就可以),可以创建和查看用户表(数据可导出成Excel和txt,可以下载或以图片格式直接查看blob字段),...
5.2.1 记录和字段、行和列 5.2.2 SQL数据类型 5.2.3 完整性约束 5.3 创建表 5.4 使用JDBC创建表 5.4.1 DriverManager 5.4.2 驱动程序 5.4.3 连接 5.4.4 Statement 5.5 使用ALTER TABLE改变表 5.6 删除或...