迁移到 Weblogic 后 Oracle 存储过程损坏
我正在将我的 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)
...
我尝试过的一些操作都会导致相同的错误:
- 从 ojdbc14.jar 切换从 Oracle 网站
- 切换到 ojdbc6.jar 从 weblogic 的 lib 文件夹从 ojdbc14.jar 切换到 ojdbc6.jar
- 使用 WebLogic 控制台中定义的 JDBC 连接(Thin 和 Thin XA 驱动程序)
- 使用 java.sql.Types.OTHER 而不是 OracleTypes.CURSOR(尽管 Oracle 异常之后的数字从 246 更改为 1111)
- 将 registerOutParameter 语句移至我设置其他 68 个参数
- 之前以上
感谢您的帮助。
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:
- Switching from ojdbc14.jar to ojdbc6.jar from Oracle's website
- Switching from ojdbc14.jar to ojdbc6.jar from weblogic's lib folder
- Using the JDBC connection defined in the WebLogic console (both Thin and Thin XA drivers)
- Using java.sql.Types.OTHER instead of OracleTypes.CURSOR (Although the number after the Oracle exception changes from 246 to 1111)
- Moving the registerOutParameter statement to before I set the other 68 parameters
- Various combinations of the above
Thanks for any help.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我找到了解决方案。
简短版本:不要在 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