Похоже на ошибку в драйвере.
Я подозреваю, что неисправный драйвер ожидает, что параметры будут переданы / зарегистрированы в порядке (т. Е. 1,2,3,4). Когда вы выполняете registerOut (2), оператор, очевидно, забывает, что вы установили (3): -)
Или, может быть, все OUT должны быть выполнены после всех IN. Опять же, это ошибка в драйвере.
UPDATE
Подождите, вы не изменили процедуру для второго варианта? Этот результат не имеет смысла . Если, как вы сказали, водитель не меняет порядок. Что необычно , если не сказать больше.
ОБНОВЛЕНИЕ 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
Может быть интересно увидеть выходные данные всех 4 параметров в примере 1, т.е.:
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));