|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
Здравствуйте, Хочу разобраться как равотает JDBC c хранимыми процедурами в Sybase. Я планирую писать хранимые процедуры с довольно сложной логикой внутри, которые на выход должны выдавать ResultSet. Поэтому, я хотел бы разобраться как это правильно делать. Поискав в сети, я нашел, что для этого не требуется декларировать выходные параметры. Я просто создаю примерно вот такую процедуру: create procedure myproc as select * from Address select * from Person потом, я запускаю её через JDBC драйвер. Создаю CallableStatement и из него достаю resultSet1 = callableStatement.getResultSet() соотватственно получаю результат выполнения "select * from Address". далее судя по документации если я делаю callableStatement.getMoreResults(); resultSet2 = callableStatement.getResultSet(); то должен получит результат выполнения "select * from Person". Если меня на выходе интересует только результат "select * from Person", то будет ли resultSet1 грузиться на клиент? Если да, то как это обойти? Можно ли как то сразу добраться до результата напрямую, минуя getMoreResults() вызов? Может кто-то может подсказать какие-то другие подходы долучения ResultSet-а из процедуры? Еще буду благодарен за ссылки на описание работы JDBC c Sybase + stored procedures. (Кроме Sybase документации) Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2010, 14:22 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
16.08.2010 15:22, dinosaurus пишет: > Хочу разобраться как равотает JDBC c хранимыми процедурами в Sybase. Sybase - это контора, она не умеет выполнять ХП . Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2010, 14:45 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
На клиента можно и не тянуть все наборы, все зависит от него и какие комманды он посылает. Но по большому счету, multi result set - это плохая идея. Нужно разбивать на атомарные процедуры, которые вызывать выборочно и последовательно, в зависимости от условий. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2010, 16:22 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
iLLerНа клиента можно и не тянуть все наборы, все зависит от него и какие комманды он посылает. Но по большому счету, multi result set - это плохая идея. Нужно разбивать на атомарные процедуры, которые вызывать выборочно и последовательно, в зависимости от условий. Да, я согласен. Всё тянуть мне очень не нравится самому. Но разбивать на процедуры, это тоже еще та петрушка получится. Я просто думал, что может драйвер не будет тянуть все result sets на клиет, пока их перебираешь. Но вообще, я немного разочарован. Я предполагал, что в Sybase должно поддерживаться что-то типа: return #temporary_table. Т.е. декларация одного возвращаемого результата. На сколько, я видел в Оракле и даже MSSQL такая фишка есть. Может всетаки есть какие-то обходные пути, кроме разбиения на подпроцедуры? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2010, 19:04 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
все селекты без INTO уходят на клиента. должен быть метод пропустить резалтсет (такой есть в родном драйвере) но весь резалтсет все равно тянется на клиента. есть вариант не делать лишних селектов. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2010, 22:07 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
Dmitry.все селекты без INTO уходят на клиента. Про INTO я как-то и не подумал сам. Может это и есть выход? Просто пихать ненужные селекты во временные таблицы. А таблицы удалять по мере ненадобности. А в конце процедуры сделать последний селект который и будет единственным результатом. Что думаете? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2010, 23:31 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
iLLer wrote: Но по большому счету, multi result set - это > плохая идея. Это почему это ? Очень даже неплохая идея. Одна транзакция, одна процедура, всё выдаёт, что нужно. Куча преимуществ. А в чём проблемы ? Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2010, 13:40 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
Dmitry. wrote: > должен быть метод пропустить резалтсет (такой есть в родном драйвере) но > весь резалтсет все равно тянется на клиента. Так есть же ... MoreResults или как его там. При этом что ВСЁ танется -- далеко не факт. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2010, 13:42 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
dinosaurus wrote: > единственным результатом. Что думаете? А в чём кардинально проблема ? Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2010, 13:43 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
MasterZiv, Да проблем-то нет. Идеологически подразумевается, что все, что возвращает процедура, она должна вернуть. Иначе получается, что один делает передачу данных, но другому это не нужно и он кладет это сразу в корзину. Будем повышать энтропию вселенной? Я не против мультирезалтсетов, как класса, я говорил про их нелогичное применение в этом конкретном случае. Гораздо лучше обрамить ненужные выборки условными операторами, чтобы сервер даже и не дергался их делать, если заранее известно, что клиент это будет игнорировать. А для этого можно либо передавать список условных кодов возвратных выборок в качестве параметра в одну процедуру, либо разбить одну процедуру на несколько атомарных. P.S.: В случае же, когда все резалтсеты используются всегда, без всяких условностей, целесообразность применения мультирезалтсета не под вопросом. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2010, 14:22 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
iLLer wrote: > Да проблем-то нет. Идеологически подразумевается, что все, что > возвращает процедура, она должна вернуть. Иначе получается, что один > делает передачу данных, но другому это не нужно и он кладет это сразу в > корзину. Так это ж просто делается. Делается N процедур -- имплементаций, которые возвращают данные реально, и M процедур, которые комбинируют вызовы нескольких из N процедур -- имплементаций для каждого конкретного случая использования клиентом. Будем повышать энтропию вселенной? Я не против > мультирезалтсетов, как класса, я говорил про их нелогичное применение в > этом конкретном случае. Почему же, очень даже логично всё получать одним запросом. > это будет игнорировать. А для этого можно либо передавать список > условных кодов возвратных выборок в качестве параметра в одну процедуру, > либо разбить одну процедуру на несколько атомарных. Ну, или так. Но по мне лучше M процедур. Параметры и так могут быть сложными, а тут ещё несколько добавится. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2010, 15:14 |
|
Sybase + JDBC + stored procedure. Возврат результатов.
|
|||
---|---|---|---|
#18+
Господа, В моем случае действительно интересует вернуть именно один результат. При этом, не должно быть лишних пересылок между клиентом и сервером. Отказываться от промежуточных запросов, в общем случае, не хотелось бы, потому как, иногда, надо сделать пару запросов, как то скомпоновать/обсчитать данные, а потом уже возвращать финальный результат. Исходя из этой дискусси и моих тестов, я делаю вывод, что имеет смысл использовать временные таблицы для хранения промежуточных результатов. Например, если сделать вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
то в процедуре у нас 2 запроса, а результат возвращается только один. Я использовал вот этот код для получения этого результата. Код: plaintext 1. 2. 3. 4. 5.
При этом не требуется вызывать getMoreResults() метод. Конечно я мог бы использовать курсор вместо временной таблицы, но в этом случае я получил бы 2 ResultSet объекта. И как результат выполнения Java кода получил бы первый select. Хотя с курсором тоже можно исползовать INTO и тогда опять будет все в порядке. Т.е. самым полезным оказался ответ от Dmitry. Секрет заключается в правильном использовании INTO. Конструктивная критика все еще приветствуется, господа ... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.08.2010, 23:03 |
|
|
start [/forum/topic.php?fid=55&msg=36800477&tid=2010561]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 170ms |
0 / 0 |