迁移到 Weblogic 后 Oracle 存储过程损坏

发布于 2025-01-07 16:47:20 字数 2455 浏览 0 评论 0原文

我正在将我的 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. 从 ojdbc14.jar 切换从 Oracle 网站
  2. 切换到 ojdbc6.jar 从 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. 之前以上

感谢您的帮助。

I'm migrating my Java EE application from Java 1.4 to Java 6 and moving from OC4J to WebLogic 10.3.3. I'm running into a problem with a stored procedure call that worked in Java 1.4 on OC4J, but is no longer working in Java 6 on WebLogic. The stored procedure definition looks like:

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

Where rs_ref_cursor is:

type rs_ref_cursor is Ref CURSOR;

My java code looks like this:

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

...

This always results in this exception on the call to 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)
  ...

A few things I've tried that all result in the same error:

  1. Switching from ojdbc14.jar to ojdbc6.jar from Oracle's website
  2. Switching from ojdbc14.jar to ojdbc6.jar from weblogic's lib folder
  3. Using the JDBC connection defined in the WebLogic console (both Thin and Thin XA drivers)
  4. Using java.sql.Types.OTHER instead of OracleTypes.CURSOR (Although the number after the Oracle exception changes from 246 to 1111)
  5. Moving the registerOutParameter statement to before I set the other 68 parameters
  6. Various combinations of the above

Thanks for any help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦纸 2025-01-14 16:47:20

我找到了解决方案。

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

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

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

I found the solution.

Short version: don't enable fast-swap in weblogic.xml

Longer version: enabling fast swap screws up how ints work, so instead of the value of OracleTypes.CURSOR being -10, it was actually 246.

I was having the exact same problem as this guy: https://forums.oracle.com/forums/thread.jspa?threadID=1104780

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文