用Java调用Oracle存储过程

3

我正在使用 JDBC 瘦客户端驱动程序调用 Oracle 存储函数。
以下是代码。

class testSP 
{ 
  public static void main (String args []) 
                     throws SQLException, ClassNotFoundException 
  { 
      String driver_class = "oracle.jdbc.driver.OracleDriver"; 
      String connect_string = "jdbc:oracle:thin:@xxx.xx.xx.xx:1521:xxxx"; 

      Connection conn; 

      Class.forName(driver_class); 
      conn = DriverManager.getConnection(connect_string, "xxxx", "xxxx"); 

      // OracleCallableStatement ocs = 
      //    (OracleCallableStatement)conn.prepareCall(
      //        "{? = call acpks_stmt_gen.fn_stmt_gen(?,?,?,?,?,?)}");
      CallableStatement ocs = 
         conn.prepareCall(
            "{? = call acpks_stmt_gen.fn_stmt_gen(?,?,?,?,?,?)}");

      ocs.registerOutParameter(1, java.sql.Types.ARRAY);

      ocs.setString(2, "144000014");
      ocs.setString(3, "RET");
      ocs.setString(4, "N");
      ocs.setString(5, "3");
      ocs.setNull(6, java.sql.Types.DATE) ;
      ocs.setNull(7, java.sql.Types.DATE);



      ocs.executeUpdate(); 

     // java.sql.ResultSet rs2 = (java.sql.ResultSet) ocs.getResultSet();

  }

}

当我调用这个函数时,会得到以下异常:
Exception in thread "main" java.sql.SQLException: ORA-03115: unsupported network datatype or representation

我正在使用由Oracle提供的轻型驱动程序ojdbc6.jar
我将其添加到了我的类路径中。
谢谢。

你正在使用哪个版本的Oracle? - jmj
1
fn_stmt_gen 返回什么?可能只是类型冲突,有各种 OracleTypes 可能更合适。最好还是回到 OracleCallableStatement - Alex Poole
我尝试了OracleCallableStmt。同时fn_stmt_gen返回一个PL/SQL用户定义的集合类型。 - javaguy
1
如果 OracleTypes.ARRAY 和 OracleTypes.PLSQL_INDEX_TABLE 不起作用,我会尝试将其作为结果集返回;也许可以编写查询语句,类似于 select * from table(cast acpks_stmt_gen.fn_stmt_gen(?,?,?,?,?,?) as <your type>)?了解更多有关该函数的信息可能会有所帮助。 - Alex Poole
1个回答

4

尝试

  ocs.setString(6, "") ;
  ocs.setString(7, "");

替代

  ocs.setNull(6, java.sql.Types.DATE);
  ocs.setNull(7, java.sql.Types.DATE);

利用Oracle中空字符串与NULL相同的事实。
在我的当前项目中,我遇到了类似的空值问题,可以通过这种方式解决。(是的,这很丑陋)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接