迁移到Weblogic后,Oracle存储过程中断

时间:2012-02-21 04:30:36

标签: java-ee jdbc weblogic weblogic-10.x jdk1.6

我正在将Java EE应用程序从Java 1.4迁移到Java 6,并从OC4J迁移到WebLogic 10.3.3。我遇到了一个存储过程调用的问题,该问题在OC4J上的Java 1.4中有效,但在WebLogic上不再适用于Java 6。存储过程定义如下所示:

create or replace procedure sp_report
    (
    /* snip 68 parameters */
    rs OUT pkg_recordset.rs_ref_cursor
     )
AS ...

rs_ref_cursor是:

type rs_ref_cursor is Ref CURSOR;

我的java代码如下所示:

public final static String CALL_REPORT = "{call SP_REPORT"
    + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,"
    + "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}";

...

DriverManager.registerDriver (new oracle.jdbc.OracleDriver());
conn = DriverManager.getConnection("jdbc:oracle:thin:@[server]:[port]:[sid]", "[username]", "[password]");
cstmt = conn.prepareCall(CALL_ALPHA_REPORT);
/* set 68 other parameters */
cstmt.registerOutParameter("rs", OracleTypes.CURSOR);

...

这总是会导致调用registerOutParameter时出现此异常:

SQL Exception: 17004: Invalid column type: 246
java.sql.SQLException: Invalid column type: 246
  at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
  at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
  at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199)
  at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263)
  at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271)
  at oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:3532)
  at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:127)
  at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:2181)
  at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:2094)
  at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1593)
  ...

我尝试过的一些事情都会导致同样的错误:

  1. 从Oracle网站的ojdbc14.jar切换到ojdbc6.jar
  2. 从weblogic的lib文件夹中的ojdbc14.jar切换到ojdbc6.jar
  3. 使用WebLogic控制台(Thin和Thin XA驱动程序)中定义的JDBC连接
  4. 使用java.sql.Types.OTHER而不是OracleTypes.CURSOR(尽管Oracle异常后的数字从246变为1111)
  5. 将registerOutParameter语句移至我设置其他68个参数之前
  6. 以上
  7. 的各种组合

    感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

简短版本:不要在weblogic.xml中启用快速交换

更长的版本:启用快速交换搞定了int的工作方式,因此OracleTypes.CURSOR的值不是-10,而是实际上是246.

我和这个家伙有同样的问题:https://forums.oracle.com/forums/thread.jspa?threadID=1104780