Luk*_*der 5 stored-procedures jdbc sqlanywhere jconnect out-parameters
我很疯狂Sybase JDBC驱动程序如何使用mixed IN
和OUT
parameters 处理存储过程.看看这个简单的存储过程:
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
Run Code Online (Sandbox Code Playgroud)
以下是我用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));
Run Code Online (Sandbox Code Playgroud)
但这导致了
1
null
Run Code Online (Sandbox Code Playgroud)
这是怎么回事??这是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));
Run Code Online (Sandbox Code Playgroud)
现在的结果是
1
2
Run Code Online (Sandbox Code Playgroud)
JDBC驱动程序是否秘密重新排序IN
和OUT
参数?
我正在使用SQL Anywhere 12和jconn3.jar
看起来像是驱动程序中的错误.
我怀疑有缺陷的驱动程序希望参数在顺序中传递/注册(即1,2,3,4).当你执行registerOut(2)时,语句显然忘记了你设置了(3):-)
或者,可能是,所有OUT应该在所有IN之后完成.然后,这是驱动程序中的错误.
UPDATE
等等,你没有改变第二个变种的程序?这个结果没有任何意义.除非,如你所说,司机重新排序.至少可以说,这是不寻常的.
更新2
我已经反编译了驱动程序.它做了一些非常有趣的游戏围绕参数,并且所有这些joggling我觉得他们有一个公平的潜在的bug,但到目前为止,我没有明白地看到它.
我注意到的唯一有趣的事情是,显然如果位置n的参数没有输出,驱动程序将向前扫描参数,直到它找到值; 如果找不到值,则转到下一行:
s.registerOutParameter(5,Types.INT);
...
// no out value at position 4, it will go to 5 and get the value
rs.getInteger(4);
Run Code Online (Sandbox Code Playgroud)
更新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));
Run Code Online (Sandbox Code Playgroud)
我用 Oracle 9.2 尝试过,它按预期工作。我认为这个问题与您的 JDBC 驱动程序有关,而不是与 JDBC 本身有关。
public static void main(String[] args) throws Exception {
Connection connection = getConnection();
CallableStatement c = connection.prepareCall("{ call 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));
}
Run Code Online (Sandbox Code Playgroud)
输出:
Connected to database
1
2
Run Code Online (Sandbox Code Playgroud)