我正在调试一个 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
循环引入循环,但这会破坏我为什么首先使用准备好的语句的整个想法,不是吗?