Java Oracle的绑定CLOB的Jdbc教程示例
我试图理解如何使用JDBC将CLOB传递给数据库。我使用的是Oracle 11g和Oracle的JDBC驱动程序12.1.0.1 我正在浏览Oracle的Jdbc教程和。它读取文件内容并写入Clob实例,然后使用INSERT将Clob实例写入数据库。为了可读性,我只发布代码的相关部分:Java Oracle的绑定CLOB的Jdbc教程示例,java,jdbc,database-connection,instantiation,Java,Jdbc,Database Connection,Instantiation,我试图理解如何使用JDBC将CLOB传递给数据库。我使用的是Oracle 11g和Oracle的JDBC驱动程序12.1.0.1 我正在浏览Oracle的Jdbc教程和。它读取文件内容并写入Clob实例,然后使用INSERT将Clob实例写入数据库。为了可读性,我只发布代码的相关部分: Clob myClob = this.con.createClob(); Writer clobWriter = myClob.setCharacterStream(1);
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方法的代码:
我修改了上面的示例代码,将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.writenextLine;在readFile中,方法是否未按预期工作?以下是我的代码的输出:
Employee with id : 101 has annual review : THIS IS COMING FROM THE DATABASE
这是我的调试器的快照。我确实看到数据被写入CLOB的编写器
如果您注意到在上面的o/p中,PL/SQL代码在CLOB中找不到任何内容
另一方面,如果我以教程示例中也使用但仅用于MYSQL数据库的以下方式将内容传递给CLOB。我还使用setString方法将文件内容传递给CLOB,而不使用CLOB的Writer实例。它很好用
这为我提供了以下输出:
Employee with id : 101 has annual review : Employee Exceeds Expectations THIS IS COMING FROM THE DATABASE
注意:我已经剥离了原始代码,删除了try-catch块,清理了数据库/文件资源,只发布了相关代码。这篇文章有点太长了
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