В чем смысл и использование registerOutParameter в вызываемых операторах

Я мог бы задать этот вопрос одному из моих коллег, но я решил, что если мне это нужно знать, то и другим новичкам тоже, поэтому лучше поставить его на переполнение стека.

Я пытаюсь работать с функцией registerOutParameter. Например:

callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);

Я понимаю, что registerOutParameter возвращает значения, которые возвращаются вместо ResultSet или в дополнение к нему. Я не могу себе представить, как это могло бы произойти или каков был бы возможный вариант использования.

Итак, вы знаете, что это не лень, до сих пор я смотрел на:

Просто кажется, что этот вопрос слишком прост, чтобы его осветить.

Фоновая информация, я делаю учебник по хранимым процедурам на www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/


person Brett    schedule 12.06.2016    source источник
comment
Я просто не могу представить, как это может произойти или каким может быть возможный вариант использования. вам нужно лучше объяснить, что именно вы не понимаете. Вы, например, смотрели на реализацию базы данных, которая поддерживает параметры стиля OUT (или даже IN OUT), например, Microsoft SQL Server? ИМО, вариант использования становится ясным, как только вы узнаете о его существовании. Очень надуманный пример см. на странице technet.microsoft. com/en-us/library/aa174792(v=sql.80).aspx, который показывает 3 (!) различных способа, которыми процедуры SQL Server могут возвращать значения.   -  person Mark Rotteveel    schedule 12.06.2016
comment
Спасибо @MarkRotteveel, как объяснено, я делаю учебник по адресу tutorials.jenkov.com/jdbc/callablestatement. .html. Учебник содержит строку callableStatement.registerOutParameter(1, java.sql.Types.VARCHAR);. Я пытаюсь понять, это просто устанавливает тип данных для параметров запросов или делает что-то еще?   -  person Brett    schedule 13.06.2016
comment
@MarkRotteveel, к вашему сведению, я никогда не слышал о IN OUT. Я проверил ссылку, которую вы прислали, но, похоже, на нее нет ссылок - не могли бы вы объяснить это в своем ответе, чтобы я мог проголосовать за нее.   -  person Brett    schedule 13.06.2016


Ответы (1)


Ваш вопрос очень тесно связан с тем, как хранимые процедуры выполняются в СУБД. Обратите внимание, что выполнение хранимой процедуры через CallableStatement сильно отличается от выполнения запроса SELECT, возвращающего ResultSet. При выполнении такого запроса СУБД вернет описание столбцов, и драйвер использует это описание, чтобы знать, чего ожидать от данных.

Спецификация JDBC говорит, что перед выполнением хранимой процедуры необходимо вызывать registerOutParameter для каждого параметра OUT. Это должно указать водителю, какие данные он должен ожидать. Почему? Потому что для многих СУБД нет возможности описать хранимую процедуру. Пользователь может определить выходные параметры через этот API. Водитель не смог бы разобраться в этом сам. Затем вы можете выполнить хранимую процедуру, а затем вызвать геттеры на CallableStatement, чтобы получить значение зарегистрированных вами выходных параметров.

person Jean de Lavarene    schedule 14.06.2016