stored procedures - Sybase IN and OUT parameters -


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