Пример учебника 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, очистка ресурсов базы данных / файла), чтобы опубликовать только соответствующий код. Пост становился слишком длинным.