powered by simpleCommunicator - 2.0.57     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Sybase + JDBC + stored procedure. Возврат результатов.
12 сообщений из 12, страница 1 из 1
Sybase + JDBC + stored procedure. Возврат результатов.
    #36793561
dinosaurus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте,

Хочу разобраться как равотает 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 документации)

Спасибо
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36793635
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
16.08.2010 15:22, dinosaurus пишет:

> Хочу разобраться как равотает JDBC c хранимыми процедурами в Sybase.

Sybase - это контора, она не умеет выполнять ХП .
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36793938
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На клиента можно и не тянуть все наборы, все зависит от него и какие комманды он посылает. Но по большому счету, multi result set - это плохая идея. Нужно разбивать на атомарные процедуры, которые вызывать выборочно и последовательно, в зависимости от условий.
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36794308
dinosaurus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLerНа клиента можно и не тянуть все наборы, все зависит от него и какие комманды он посылает. Но по большому счету, multi result set - это плохая идея. Нужно разбивать на атомарные процедуры, которые вызывать выборочно и последовательно, в зависимости от условий.
Да, я согласен. Всё тянуть мне очень не нравится самому. Но разбивать на процедуры, это тоже еще та петрушка получится. Я просто думал, что может драйвер не будет тянуть все result sets на клиет, пока их перебираешь.

Но вообще, я немного разочарован. Я предполагал, что в Sybase должно поддерживаться что-то
типа: return #temporary_table. Т.е. декларация одного возвращаемого результата. На сколько, я видел
в Оракле и даже MSSQL такая фишка есть.

Может всетаки есть какие-то обходные пути, кроме разбиения на подпроцедуры?
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36794483
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все селекты без INTO уходят на клиента.
должен быть метод пропустить резалтсет (такой есть в родном драйвере) но весь резалтсет все равно тянется на клиента.

есть вариант не делать лишних селектов.
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36794555
dinosaurus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.все селекты без INTO уходят на клиента.
Про INTO я как-то и не подумал сам.
Может это и есть выход? Просто пихать ненужные селекты
во временные таблицы. А таблицы удалять по мере ненадобности.
А в конце процедуры сделать последний селект который и будет
единственным результатом. Что думаете?
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36795457
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer wrote:

Но по большому счету, multi result set - это
> плохая идея.

Это почему это ? Очень даже неплохая идея.
Одна транзакция, одна процедура, всё выдаёт, что
нужно. Куча преимуществ. А в чём проблемы ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36795461
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry. wrote:

> должен быть метод пропустить резалтсет (такой есть в родном драйвере) но
> весь резалтсет все равно тянется на клиента.

Так есть же ... MoreResults или как его там.
При этом что ВСЁ танется -- далеко не факт.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36795464
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dinosaurus wrote:

> единственным результатом. Что думаете?

А в чём кардинально проблема ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36800236
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Да проблем-то нет. Идеологически подразумевается, что все, что возвращает процедура, она должна вернуть. Иначе получается, что один делает передачу данных, но другому это не нужно и он кладет это сразу в корзину. Будем повышать энтропию вселенной? Я не против мультирезалтсетов, как класса, я говорил про их нелогичное применение в этом конкретном случае.
Гораздо лучше обрамить ненужные выборки условными операторами, чтобы сервер даже и не дергался их делать, если заранее известно, что клиент это будет игнорировать. А для этого можно либо передавать список условных кодов возвратных выборок в качестве параметра в одну процедуру, либо разбить одну процедуру на несколько атомарных.

P.S.: В случае же, когда все резалтсеты используются всегда, без всяких условностей, целесообразность применения мультирезалтсета не под вопросом.
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36800477
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iLLer wrote:

> Да проблем-то нет. Идеологически подразумевается, что все, что
> возвращает процедура, она должна вернуть. Иначе получается, что один
> делает передачу данных, но другому это не нужно и он кладет это сразу в
> корзину.

Так это ж просто делается. Делается N процедур -- имплементаций,
которые возвращают данные реально, и M процедур, которые комбинируют
вызовы нескольких из N процедур -- имплементаций для каждого конкретного
случая использования клиентом.

Будем повышать энтропию вселенной? Я не против
> мультирезалтсетов, как класса, я говорил про их нелогичное применение в
> этом конкретном случае.

Почему же, очень даже логично всё получать одним запросом.

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

Ну, или так. Но по мне лучше M процедур. Параметры и так могут быть
сложными, а тут ещё несколько добавится.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Sybase + JDBC + stored procedure. Возврат результатов.
    #36801433
dinosaurus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа,

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

Отказываться от промежуточных запросов, в общем случае, не хотелось бы, потому как,
иногда, надо сделать пару запросов, как то скомпоновать/обсчитать данные, а потом уже
возвращать финальный результат.

Исходя из этой дискусси и моих тестов, я делаю вывод, что имеет смысл использовать
временные таблицы для хранения промежуточных результатов. Например, если сделать вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create table Address (
    id int,
    street varchar( 30 ),
    country varchar( 30 )
)

create table Person ( 
    id int,
    name varchar( 30 ),
    surname varchar( 30 ),
    address_id int
)

create procedure sel_addr as
    select * into #tmpperson from Person 
    -- do something with #tmpperson
    delete from #tmpperson where id >  30 
    update #tmpperson set id =  20 *sin(id)
    -- here ------------------------
    select * from Address A, #tmpperson P where P.address_id = A.id   
    drop table #tmpperson

то в процедуре у нас 2 запроса, а результат возвращается
только один.

Я использовал вот этот код для получения этого результата.
Код: plaintext
1.
2.
3.
4.
5.
Connection conn = ....getConnection();
CallableStatement stmt = conn.prepareCall("execute sel_addr");
ResultSet rs = stmt.executeQuery();
		
print(rs);

При этом не требуется вызывать getMoreResults() метод.
Конечно я мог бы использовать курсор вместо временной таблицы,
но в этом случае я получил бы 2 ResultSet объекта. И как
результат выполнения Java кода получил бы первый select.
Хотя с курсором тоже можно исползовать INTO и тогда опять будет
все в порядке.

Т.е. самым полезным оказался ответ от Dmitry. Секрет заключается
в правильном использовании INTO.

Конструктивная критика все еще приветствуется, господа ...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Sybase + JDBC + stored procedure. Возврат результатов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]