0

我正在调试一个 Java 应用程序,它通过一个瘦客户端连接到 Oracle DB。

代码如下所示:(我试图在这里简化用例,如果 t 实际上没有出现,请原谅我)

Connection conn = myEnv.getDbConnection();
CallableStatement call = conn.prepareCall(
         "{ ? = call SomePackage.SomeFunction (?)}");
call.registerOutParameter(1, OracleTypes.CURSOR);
for (int runCount = 0; runCount <= 1; runCount++) {
    currency = getCurrency(runCount); // NOTE: [0]=CAD, [1]=USD
    call.setString(2, currency);
    try { call.execute(); } catch { // BREAKS HERE! }
    ResultSet rset = (ResultSet)call.getObject(1);
    ... more code that I think is irrelevant as it does not use/affect "call"
}

当我运行此代码时,会发生以下情况:

  • 循环的第一次迭代,currency设置为“CAN”。

  • 循环的整个代码运行良好。

  • 循环的第二次迭代,currency设置为“USD”。

  • 调用抛出 SQLException ,"execute()"如下:

    ORA-01008: not all variables bound

为什么?

我最初的怀疑是它在某种程度上与registerOutParameter在 2d 迭代中没有被调用的循环之前的调用有关。但是在循环内移动该调用并不能解决问题。似乎execute()调用取消绑定了一些东西,但在循环内同时拥有两个绑定并没有帮助。

我错过了什么?

如果这是显而易见的事情,请保持温和 - 我对 Oracle 和瘦客户端知之甚少,并且在谷歌上搜索各种花哨的查询并没有得到任何回报。

一个额外的线索:当应用程序在带有 OCI 驱动程序的 Oracle 9 上时,这种设计似乎已经奏效了。我调试它的原因是有人将它“升级”到 Oracle 10.2 thi 客户端并且它坏了。

我的下一步可能应该将整个CallableStatement循环引入循环,但这会破坏我为什么首先使用准备好的语句的整个想法,不是吗?

4

2 回答 2

0

您是否尝试过添加call.clearParameters()到循环中?也许它会重置它需要再次执行的对象的一些内部状态。

于 2009-10-11T01:03:56.533 回答
0

通过 Oracle 支持电话获得的解释是这个版本的 Java (1.3) 与新的 Oracle 不兼容。Java 1.4 解决了这个问题。

于 2009-10-27T21:13:06.817 回答