【问题标题】:Oracle Stored Procedure Broke after Migrating to Weblogic迁移到 Weblogic 后 Oracle 存储过程中断
【发布时间】:2012-02-21 04:30:35
【问题描述】:

我正在将我的 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 控制台中定义的 JDBC 连接(Thin 和 Thin XA 驱动程序)
  4. 使用 java.sql.Types.OTHER 代替 OracleTypes.CURSOR(虽然 Oracle 异常后的数字从 246 变为 1111)
  5. 将 registerOutParameter 语句移到我设置其他 68 个参数之前
  6. 以上的各种组合

感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    我找到了解决办法。

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

    更长的版本:启用快速交换会破坏整数的工作方式,因此 OracleTypes.CURSOR 的值不是 -10,而是实际上是 246。

    我遇到了和这个人完全相同的问题:https://forums.oracle.com/forums/thread.jspa?threadID=1104780

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-19
      • 1970-01-01
      • 2011-12-15
      • 2014-08-06
      • 1970-01-01
      相关资源
      最近更新 更多