i'm going nuts how sybase jdbc driver handles stored procedures mixed in
, out
parameters. check out simple stored procedure:
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
and here's how i'd call 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));
but results in
1 null
what's going on?? wicked bug in jdbc driver or missing something? trial , error, found way how works:
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));
now result is
1 2
does jdbc driver secretly re-order in
, out
parameters??
i'm using sql anywhere 12 , jconn3.jar
looks bug in driver.
i suspect buggy driver expects parameters passed/registered in order (i.e. 1,2,3,4). when registerout(2), statement apparently forgets did set(3) :-)
or, may be, out should done after in. again, bug in driver.
update
wait, didn't change procedure second variant? result doesn't make any sense. unless, said, driver reordering. unusual, least.
update 2
i have decompiled driver. pretty funny games around out parameters, , joggling feel have fair potential bug there, far not see plainly.
the funny thing noticed apparently if parameter @ position n not out, driver scan parameters forward until find value; if value not found, goes next row:
s.registeroutparameter(5,types.int); ... // no out value @ position 4, go 5 , value rs.getinteger(4);
update 3
it may interesting see output of 4 parameters in example 1, i.e.:
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));
Comments
Post a Comment