看起来像是驱动程序中的错误。
我怀疑有缺陷的驱动程序希望参数按顺序传递/注册(即 1,2,3,4)。当您执行 registerOut(2) 时,该语句显然会忘记您执行了 set(3) :-)
或者,可能是,所有 OUT 都应该在所有 IN 之后完成。话又说回来,这是驱动程序中的一个错误。
UPDATE
等等,你没有改变第二个变体的程序吗?这个结果并没有使any感觉。除非,正如你所说,驱动程序重新排序。这是unusual, 至少可以说。
UPDATE 2
我已经反编译了驱动程序。它围绕参数做了一些非常有趣的游戏,随着所有这些变化,我觉得它们很有可能出现错误,但到目前为止我还没有清楚地看到它。
我注意到的唯一有趣的事情是,显然如果位置n处的参数没有出来,驱动程序将向前扫描参数,直到找到该值;如果未找到值,则转到下一行:
s.registerOutParameter(5,Types.INT);
...
// no out value at position 4, it will go to 5 and get the value
rs.getInteger(4);
UPDATE 3
查看示例 1 中所有 4 个参数的输出可能会很有趣,即:
CallableStatement c = connection.prepareCall("{ call dba.p(?, ?, ?, ?) }");
c.setInt(1, 1);
c.setInt(3, 2);
c.registerOutParameter(2, Types.INTEGER);
c.registerOutParameter(4, Types.INTEGER);
c.execute();
System.out.println(c.getObject(1));
System.out.println(c.getObject(2));
System.out.println(c.getObject(3));
System.out.println(c.getObject(4));