从 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)中快速替换出现极高的相同字符?

尝试从 h2 数据库中检索 json 数据时出错

Oracle JDBC Clob 插入问题 ORA-00942

从clob列中提取xml元素时出错

将 XML 从 CLOB 列转换为 XMLType 列时出错