Ошибка при связывании CLOB с Oracle 10g

Следующий код пытается получить файл CLOB из базы данных Oracle в JDBC.

Код:-

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();
}
}

Я пытаюсь получить файл CLOB из набора результатов index = 1, код выдает следующую ошибку: -

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

Ошибочная строка: -

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

В чем причина ошибки и как решить проблему?

Примечание. - В указанном месте создается пустой файл с указанным именем.


person Vivek    schedule 31.01.2014    source источник
comment
Использование select * с последующим вызовом ResultSet.getX(1) - это очень хакерский метод. Лучше либо выбрать конкретный столбец, либо получить по имени столбца (или и то, и другое).   -  person lance-java    schedule 31.01.2014


Ответы (2)


Ошибка указывает, что 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.

person Joe    schedule 31.01.2014
comment
Спасибо. Я заметил, что если я просто установлю Id (Integer), а затем попытаюсь обновить значение clob через JDBC для данного идентификатора, моя программа покажет успех, но Oracle покажет, что это NULL. Однако, если я обновляю оба значения вместе, проблем нет, evrythng wrks fyn. Любая идея, почему? Использование Oracle 10g Xe. - person Vivek; 31.01.2014
comment
Я не понимаю. Какие значения вы обновляете? - person Joe; 31.01.2014
comment
Моя таблица имеет два значения (CLOB, INT) в этом порядке. Если я обновляю только INT из команд SQL, а затем обновляю файл clob, используя предложение WHERE из кода JDBC, чтобы оно соответствовало значению INT, уже находящемуся в таблице, я получаю вышеупомянутая ошибка. Но если я обновляю оба (CLOB, INT) вместе из JDBC, тогда он работает нормально. - person Vivek; 31.01.2014
comment
Похоже, это должен быть отдельный вопрос, поскольку я не вижу в вашем коде ничего, что делало бы ОБНОВЛЕНИЯ. - person Joe; 01.02.2014
comment
Можете ли вы взглянуть на следующую ссылку, это другая проблема, касающаяся Blob: ссылка - person Vivek; 03.02.2014

Причина проблемы, очевидно, в том, что r - это просто null. Решением будет дополнительная проверка на null в этой переменной:

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

person Andremoniy    schedule 31.01.2014