gpt4 book ai didi

stored-procedures - Sybase IN 和 OUT 参数

转载 作者:行者123 更新时间:2023-12-04 17:04:35 24 4
gpt4 key购买 nike

我对 Sybase JDBC 驱动程序如何处理带有混合的存储过程很感兴趣 INOUT参数。看看这个简单的存储过程:

CREATE OR REPLACE PROCEDURE p (IN i1 INT, OUT o1 INT, IN i2 INT, OUT o2 INT)
BEGIN
set o1 = i1;
set o2 = i2;
END

这是我用 JDBC 调用它的方式:
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(2));
System.out.println(c.getObject(4));

但这导致
1
null

这是怎么回事??这是 JDBC 驱动程序中的一个非常邪恶的错误还是我完全遗漏了什么?通过反复试验,我发现这是一种工作方式:
c.setInt(1, 1);
c.setInt(2, 2);
c.registerOutParameter(3, Types.INTEGER);
c.registerOutParameter(4, Types.INTEGER);
c.execute();
System.out.println(c.getObject(3));
System.out.println(c.getObject(4));

现在的结果是
1
2

JDBC驱动是否偷偷重新排序 INOUT参数??

我正在使用 SQL Anywhere 12 和 jconn3.jar

最佳答案

看起来像是驱动程序中的错误。

我怀疑有问题的驱动程序希望按顺序传递/注册参数(即 1,2,3,4)。当您执行 registerOut(2) 时,该语句显然忘记您执行了 set(3) :-)

或者,可能是,所有的 OUT 都应该在所有的 IN 之后完成。再说一次,这是驱动程序中的错误。

更新

等等,你没有改变第二个变体的程序?该结果不会使 任何 感觉。除非,如您所说,驱动程序会重新排序。这是不寻常的,至少可以这么说。

更新 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);

更新 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));

关于stored-procedures - Sybase IN 和 OUT 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5837098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com