Пример учебника Oracle по Jdbc для связывания CLOB

Я пытаюсь понять, как я могу пройти CLOB в базу данных с помощью JDBC, я использую Oracle 11g а также Oracle's JDBC Driver 12.1.0.1,

Я просматривал учебник Oracle по Jdbc и нашел этот пример кода. Он читает содержимое файла и записывает в экземпляр Clob, который затем записывает в базу данных, используя INSERT, Для удобства чтения я публикую только соответствующие части кода:

        Clob myClob = this.con.createClob();
        Writer clobWriter = myClob.setCharacterStream(1);
        String str = this.readFile(fileName, clobWriter);
        System.out.println("Wrote the following: " +
            clobWriter.toString());

        if (this.settings.dbms.equals("mysql")) 
        {
            System.out.println("MySQL, setting String in Clob " + "object with setString method");
            myClob.setString(1, str);
        }

        System.out.println("Length of Clob: " + myClob.length());

        String sql = "INSERT INTO COFFEE_DESCRIPTIONS " + "VALUES(?,?)";

        pstmt = this.con.prepareStatement(sql);
        pstmt.setString(1, coffeeName);
        pstmt.setClob(2, myClob);
        pstmt.executeUpdate();

Вот код для readFile метод:

    private String readFile(String fileName, Writer writerArg) throws FileNotFoundException, IOException {

    BufferedReader br = new BufferedReader(new FileReader(fileName));
    String nextLine = "";
    StringBuffer sb = new StringBuffer();
    while ((nextLine = br.readLine()) != null) 
    {
        System.out.println("Writing: " + nextLine);
        writerArg.write(nextLine);
        sb.append(nextLine);
    }

    // Convert the content into to a string
    String clobData = sb.toString();

    // Return the data.
    return clobData;
}

Я изменил приведенный выше пример кода, чтобы передать CLOB в процедуру PL/SQL.

 public String handleEmployeeReview(int empId , String fileName) throws IOException
 {
     Connection conn = null;
     CallableStatement callStmt = null;
     String reviewContent = null;

     try 
     {
         // Register the Oracle Jdbc driver 
         // Class.forName(JDBC_DRIVER_ORACLE);

         // Create a database connection
         conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PWD);

         // Create a query string
         String callProc = " { call HR.EMP_PKG.handle_employee_review ( ? , ? , ? ) } ";

         // Create a Callable Statement
         callStmt = conn.prepareCall(callProc);

         // Bind values to the first IN parameter
         callStmt.setInt(1, empId);


         // Create CLOB and use ClobWriter
         Clob reviewFileClob = conn.createClob();
         Writer clobWriter = reviewFileClob.setCharacterStream(1);
         String  reviewStr = this.readFile(fileName , clobWriter);
         callStmt.setClob(2, reviewFileClob);


         // Register OUT parameter
         callStmt.registerOutParameter(3, java.sql.Types.VARCHAR);

         // Execute the callable statement
         callStmt.execute();

         // Retreive the OUT parameters
         reviewContent = callStmt.getString(3);
         System.out.println("Employee with id : "+ empId + " has annual review : " + reviewContent);
     } 

Вот процедура PL/SQL:

  -- PURPOSE: Takes Clob and returns its contents
  -- Example of: PROCEDURE that takes a Clob as IN parameter
  PROCEDURE handle_employee_review(empId IN VARCHAR2 , empReviewDoc IN CLOB , reviewContent OUT VARCHAR2) IS
  BEGIN
    reviewContent := empReviewDoc || ' THIS IS COMING FROM THE DATABASE';
  EXCEPTION
    WHEN others THEN
    dbms_output.put_line('Error!');
  END handle_employee_review;

При запуске моего адаптированного кода я не вижу ничего отправляемого в базу данных. Как мне заставить этот код работать? Похоже на эту строчку writerArg.write(nextLine); в readFile метод не работает, как ожидалось? Вот вывод для моего кода:

Employee with id : 101 has annual review :  THIS IS COMING FROM THE DATABASE

Вот снимок моего отладчика. Я вижу, что данные записываются в CLOB's Writer

Если вы заметили в приведенном выше o/p, PL/SQL-код ничего не находит в CLOB.

С другой стороны, если я передаю содержимое в CLOB следующим образом (который также используется в примере учебника, но только для баз данных MYSQL). Я также передал содержимое файла в CLOB только с setString метод без использования экземпляра Clob's Writer. Работает просто отлично.

         Clob reviewFileClob = conn.createClob();
         String  reviewStr = this.readFile(fileName , clobWriter);
         reviewFileClob.setString(1, reviewStr);
         callStmt.setClob(2, reviewFileClob);

Это дает мне следующий вывод:

Employee with id : 101 has annual review : Employee Exceeds Expectations THIS IS COMING FROM THE DATABASE

ПРИМЕЧАНИЕ. Я сократил исходный код (удалены блоки try try, очистка ресурсов базы данных / файла), чтобы опубликовать только соответствующий код. Пост становился слишком длинным.

0 ответов

Другие вопросы по тегам