2014-01-31 174 views
0

以下代碼嘗試從JDBC中的oracle數據庫中檢索CLOB文件。從Oracle 10g中檢索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(); 
} 
} 

我試圖找回從ResultSet指數CLOB文件= 1,代碼是給我下面的錯誤: -

Exception in thread "main" java.lang.NullPointerException 
at jdbc.Retrieving_Clob.main(Retrieving_Clob.java:41) 

錯誤路線是: -

 while((ch= r.read())!= -1) 

錯誤的原因是什麼以及如何解決問題?

注意: -提供的名稱的空白文件正在給定位置創建。

+2

使用'select *',然後調用'ResultSet.getX(1)'很冒險。最好選擇特定列或按列名(或兩者)。 –

回答

0

問題的原因很明顯,r只是null。解決方案將在此變量中額外檢查null

if (r != null) ... while...

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,則Java編程語言中返回的值爲空

所以看來列值是NULL。

+0

Thnks。我觀察到,如果我只是設置Id(Integer),然後嘗試通過JDBC爲給定ID更新clob值,我的程序將顯示成功,但Oracle會將其顯示爲NULL。但是,如果我將這兩個值更新在一起,那麼就沒有問題了,那就是fyn。任何想法爲什麼?使用Oracle 10g Xe。 – Vivek

+0

我不明白。你正在更新哪些值? – Joe

+0

那麼我的表有兩個值(CLOB,INT)按順序。如果我只更新SQL命令的INT,然後使用JDBC代碼中的WHERE子句更新clob文件以匹配表中已有的INT值,上述錯誤。但是,如果我從JDBC更新兩個(CLOB,INT),那麼它工作正常。 – Vivek