Java Oracle的绑定CLOB的Jdbc教程示例

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

我试图理解如何使用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);
        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