情景:使用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字段
总的来说,处理Oracle数据库中的CLOB字段,关键在于正确地创建和使用Clob对象,并结合JDBC API进行操作。在处理大量文本数据时,注意优化数据读写策略,以避免内存溢出等问题。以上所述的增删改查方法是基础操作,...
JDBC方式操作CLOB字段实例代码 。
在 Java 中操作 CLOB 字段需要使用 Oracle 的 JDBC 驱动程序,首先我们需要在 Java 项目中引入 Oracle 的 JDBC 驱动程序,然后使用 Connection 对象连接到 Oracle 数据库,最后使用 PreparedStatement 或 Statement ...
### 数据库读取CLOB字段 #### 概述 在Oracle数据库中,CLOB(Character Large Object)是一种用于存储大量文本数据的数据类型。CLOB能够容纳4GB的文本信息,适用于存储如文章、报告或者XML文档等大型文本数据。...
Oracle如何插入CLOB字段值,附件为简单的示例代码。Oracle如何插入CLOB字段值,附件为简单的示例代码。
这篇文档将详细阐述如何在JDBC中有效地读取和操作Oracle数据库的CLOB字段,并将其转换为String类型。 首先,理解CLOB对象的特性是关键。CLOB是一种BLOB(Binary Large Object)的变种,专用于存储字符数据。在JDBC...
由于Clob字段通常用于存储大量文本数据,如果使用传统的JDBC方式处理,代码将会相当复杂。但随着数据库技术的发展,越来越多的数据库厂商提供了更加简单的方式来操作这些大字段。例如,Oracle数据库提供了支持以...
Spring和Hibernate框架结合使用可以有效地进行CLOB字段的操作。以下是实现这一功能的关键步骤和注意事项: 1. **配置SessionFactory** 在Spring配置文件中,你需要创建一个`SessionFactory` bean,同时指定一个`...
为了将 SQL Server 中的 Image 类型数据导出到 Oracle 的 CLOB 字段中,我们需要使用Java 语言和 JDBC 驱动程序。下面是一个示例代码,演示如何将 SQL Server 中的 Image 类型数据导出到 Oracle 的 CLOB 字段中: ...
这个问题在标题和描述中已经提及,即在对CLOB字段进行“like”操作时,查询速度会变得非常缓慢。 首先,尝试将CLOB字段直接转换为VARCHAR2类型进行查询,如以下语句所示: ```sql select * from table_name where ...
例如,使用Java的JDBC操作Oracle数据库中的Clob字段: ```java // 假设已有连接conn和PreparedStatement ps String sql = "INSERT INTO table_name (clob_column) VALUES (?)"; ps.setClob(1, new java.io.String...
在Java编程中,Oracle的CLOB(Character Large Object)数据类型用于存储大量...通过这些步骤,你可以实现对CLOB字段的插入、读取和更新操作。在实际应用中,可能还需要考虑异常处理、事务管理和性能优化等方面的问题。
CLOB 字段处理 CLOB(Character Large OBject)是 Oracle 中的一种...CLOB 字段处理需要使用 Oracle 的 JDBC 驱动程序和 oracle.sql.CLOB 类,通过 PreparedStatement 对象和 ResultSet 对象来实现数据的存储和读取。
- JDBC提供了对CLOB字段的操作接口,包括`java.sql.Clob`,通过它可以在数据库和应用程序之间读写CLOB数据。 3. **empty_clob()函数**: - 在插入CLOB数据时,如果值是空的,可以使用Oracle SQL的`empty_clob()`...
其中,`hibernate.jdbc.batch_size`设置为0表示禁用批处理,这对于处理CLOB字段尤为重要,因为批处理可能会导致CLOB数据被截断。 #### 三、Hibernate HBM文件配置 在Hibernate映射文件(HBM文件)中,也需要正确...
在Java中处理Oracle的CLOB字段,首先需要导入相关的Java SQL包以及Oracle JDBC驱动特有的类。这些包括`java.sql.*`,`java.io.*`,以及`oracle.jdbc.driver.*`和`oracle.sql.*`。这一步是建立与Oracle数据库连接的...
接下来是一个具体的示例,展示了如何使用JDBC操作包含Blob和Clob字段的数据库表。 1. **创建包含Blob和Clob字段的表**: ```java String url = "jdbc:derby:clobberyclob;create=true"; Class.forName("org....