1

我在尝试为使用 JDBC 为 Oracle DB 调用的存储过程处理 IN OUT 游标时遇到了很多问题。您可以在下面看到我是如何调用/尝试调用存储过程并处理输出的。相同的代码(在注释掉的部分稍作修改)成功地使用内联 SQL 选择语句有效地完成了相同的事情,但我们希望在 Java Web 服务之外隐藏数据库的结构和使用,理想情况下. 另外,该方法存在性能问题。

我发现一些关于网络的非常晦涩的论坛帖子解释说这要么不能使用带有 IN OUT 游标的 JDBC 来完成,要么 JBoss 最终处理此 DataSource 连接的方式存在一些基本问题(请参阅下面的更新)。

根据我转换可调用语句结果的方式的各种排列,我看到 nullPointerException 或以下内容:

“引用光标无效”

存储过程参数定义为:

PROCEDURE "MYSTOREDPROC" (
cursor1 IN OUT MYPACKAGE.MYREFCURSOR,
parm1              IN VARCHAR2,
parm2              IN VARCHAR2) IS


public static final String CALL_TO_STORED_PROCEDURE = 
    "{ call MYSTOREDPROC(?, ?, ?) }";

conn = getConnection();

stmt = conn.prepareCall(CALL_TO_STORED_PROCEDURE );         
// Register the Out Parameter Type (Oracle Cursor)
stmt.registerOutParameter(1, OracleTypes.CURSOR);

// Set the Input Parameters
stmt.setString(2, p1);
stmt.setString(3, p2);

//result = stmt.executeQuery();
stmt.execute();
result = (ResultSet)stmt.getObject(1);

while (result.next()) { // dostuff }

我尝试了其他方法来准备通话,例如:

//stmt = conn.prepareCall(CALL_TO_STORED_PROCEDURE , ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
//stmt = conn.prepareCall(CALL_TO_STORED_PROCEDURE , ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);

更新:

使用下面的条件,我可以将连接转换为特定于 oracle 的连接,并从该连接句柄准备存储过程调用,但在尝试时我仍然收到(java.sql.SQLException: ORA-01001: invalid cursor)引用执行可调用语句的结果。

if(conn instanceof org.jboss.resource.adapter.jdbc.WrappedConnection) {
WrappedConnection wc = (WrappedConnection)conn;
oconn = (oracle.jdbc.OracleConnection)wc.getUnderlyingConnection();

在这一点上,我有点在黑暗中摇摆。这可能与 Jboss 5.1 完全相关吗?我必须想象有某种方法可以让它工作,但我对 PL/SQL 和游标的概念知之甚少,甚至不知道这里可能出了什么问题。

4

0 回答 0