stored-procedures - Sybase IN 和 OUT 参数

标签 stored-procedures jdbc sqlanywhere out-parameters jconnect

我对 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/

相关文章:

mysql - 重复条目 Mysql 主数据库

c# - 数据为空。不能对 Null 值调用此方法或属性

Mysql 多参数在存储过程中有多个查询

SQL Server 2008 插入后创建触发器...返回id...调用存储过程

java - jdbc 模型检测类

java - 错误说列数与值计数不匹配

java - 为什么service和dao的JDBC连接是一样的?

sybase - 在整个 Sybase 数据库中搜索一串数据

sybase - Sybase SQL Anywhere -O(大写)开关的作用是什么?