从 Oracle 10g 检索 CLOB 时出错
Posted
技术标签:
【中文标题】从 Oracle 10g 检索 CLOB 时出错【英文标题】:Error while retieving CLOB from Oracle 10g 【发布时间】:2014-01-31 13:52:06 【问题描述】:以下代码尝试在 JDBC 中从 oracle 数据库中检索 CLOB 文件。
代码:-
import java.io.FileWriter;
import java.io.Reader;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class Retrieving_Clob
public static void main(String[] args) throws Exception
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Properties p = new Properties();
p.put("user", "system");
p.put("password", "password");
Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe",p);
PreparedStatement pstmt = con.prepareStatement("select * from myclob");
ResultSet rs = pstmt.executeQuery();
rs.next();
Reader r = rs.getCharacterStream(1);
int ch;
File file = new File("H:/newFile.txt");
FileWriter fw = new FileWriter(file,true);
while((ch= r.read())!= -1)
fw.write((char)ch);
fw.close();
con.close();
我正在尝试从结果集 index=1 中检索 CLOB 文件。代码给了我以下错误:-
Exception in thread "main" java.lang.NullPointerException
at jdbc.Retrieving_Clob.main(Retrieving_Clob.java:41)
错误的行是:-
while((ch= r.read())!= -1)
错误的原因是什么以及如何解决问题?
注意:-在给定位置会创建一个指定名称的空白文件。
【问题讨论】:
使用select *
然后调用ResultSet.getX(1)
是非常hacky。最好选择特定列或通过列名(或两者)获取。
【参考方案1】:
错误表明r
为NULL。您从以下地址获得r
:
Reader r = rs.getCharacterStream(1);
来自http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSet.html#getCharacterStream%28int%29: (getCharacterStream) 返回: 包含列值的 java.io.Reader 对象; 如果值为 SQL NULL,则返回值为 null,在 Java 编程语言中。
所以看起来列值是NULL。
【讨论】:
谢谢。我观察到,如果我只是设置 Id(Integer),然后尝试通过 JDBC 更新给定 ID 的 clob 值,我的程序显示成功,但 Oracle 显示它为 NULL。但是,如果我同时更新这两个值,那么就没有问题,evrythng wrks fyn。任何想法为什么?使用 Oracle 10g Xe。 我不明白。您要更新哪些值? 好吧,我的表按这个顺序有两个值(CLOB,INT)。如果我只更新 SQL 命令中的 INT,然后我使用 JDBC 代码中的 WHERE 子句更新 clob 文件以匹配 INT 值已经在表中,我得到了上述错误。但是如果我从 JDBC 一起更新两个(CLOB,INT),那么它工作正常。 这听起来应该是一个单独的问题,因为我在您的代码中没有看到任何正在执行更新的内容。 你可以看看下面的链接,这是一个不同的问题,关于 Blob:link【参考方案2】:问题的原因显然是r
只是null
。求解将额外检查此变量中的null
:
if (r != null) ... while...
.
【讨论】:
以上是关于从 Oracle 10g 检索 CLOB 时出错的主要内容,如果未能解决你的问题,请参考以下文章
oracle 10G数据库如何插入clob字段的值的简单语句sql语句
如何在 CLOB 字段(Oracle 10g)中快速替换出现极高的相同字符?