powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Получить 3 набора записей из функции
16 сообщений из 16, страница 1 из 1
Получить 3 набора записей из функции
    #38906791
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С клиента (на delphi) требуется вызвать функцию сервера, которая возвратит 3 множества записей, разумеется с разной структурой. *Важное уточнение: от обмена клиент-сервер требуется максимальное быстродействие, при условии что часть клиентов подключена через медленное соединение.

В PL/pgSQL пока разбираюсь не настолько, чтобы сообразить, возможно ли вернуть их через out-параметры, да и непонятно, как с клиента-то их прочитать. Скорее всего, так нельзя...

Значит, придётся возвратить только один набор, а остальные получить отдельными вызовами. Тогда сервер должен временно сохранить эти наборы до последующих вызовов с клиента. Видимо, следует задействовать временные таблицы? Или лучше, учитывая (*), упаковать эти наборы в bytea - наборы и передать сразу..?

Какая бест-практик в моём случае?
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38906921
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_avzС клиента (на delphi) требуется вызвать функцию сервера, которая возвратит 3 множества записей, разумеется с разной структурой. *Важное уточнение: от обмена клиент-сервер требуется максимальное быстродействие, при условии что часть клиентов подключена через медленное соединение.

В PL/pgSQL пока разбираюсь не настолько, чтобы сообразить, возможно ли вернуть их через out-параметры, да и непонятно, как с клиента-то их прочитать. Скорее всего, так нельзя...

Значит, придётся возвратить только один набор, а остальные получить отдельными вызовами. Тогда сервер должен временно сохранить эти наборы до последующих вызовов с клиента. Видимо, следует задействовать временные таблицы? Или лучше, учитывая (*), упаковать эти наборы в bytea - наборы и передать сразу..?

Какая бест-практик в моём случае?

варианта три
1)вернуть 1 большой json ответ
2)вернуть 3 массива составных типов (тот же json просто сериализация другая)
3)вернуть 3 курсора и клиентом затем из них вычитать 3мя дополнительными ззапросами

PS: через out параметры вы задачу не решите. через временные таблицы не советую - очень дорогое решение.
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38906922
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_avzС клиента (на delphi) требуется вызвать функцию сервера, которая возвратит 3 множества записей, разумеется с разной структурой.


Этого не может быть, потому что этого не может быть никогда. :-)
В plpg/sql типизация сильная.
Можно конечно извратиться, чтобы одна функция возвращала 3 разных типа, но это будет полный изврат. Так лучше не делать

_avzВ PL/pgSQL пока разбираюсь не настолько, чтобы сообразить, возможно ли вернуть их через out-параметры, да и непонятно, как с клиента-то их прочитать. Скорее всего, так нельзя...


Считайте что нельзя!
Так будет лучше, в т.ч. и вам.

_avz
Значит, придётся возвратить только один набор, а остальные получить отдельными вызовами. Тогда сервер должен временно сохранить эти наборы до последующих вызовов с клиента. Видимо, следует задействовать временные таблицы? Или лучше, учитывая (*), упаковать эти наборы в bytea - наборы и передать сразу..?

Какая бест-практик в моём случае?

Бест-практик в вашем случае выбросить глупости из головы.
Делать нужно правильно!
Т.е. если вам нужно три разных результата, то нужно делать три разных запроса.
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38906934
_avz,

много букв, мало деталей сути задачи, характеристик и связей результатов.
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38906945
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_avzС клиента (на delphi) требуется вызвать функцию сервера, которая возвратит 3 множества записей, разумеется с разной структурой. *Важное уточнение: от обмена клиент-сервер требуется максимальное быстродействие, при условии что часть клиентов подключена через медленное соединение.

В PL/pgSQL пока разбираюсь не настолько, чтобы сообразить, возможно ли вернуть их через out-параметры, да и непонятно, как с клиента-то их прочитать. Скорее всего, так нельзя...

Значит, придётся возвратить только один набор, а остальные получить отдельными вызовами. Тогда сервер должен временно сохранить эти наборы до последующих вызовов с клиента. Видимо, следует задействовать временные таблицы? Или лучше, учитывая (*), упаковать эти наборы в bytea - наборы и передать сразу..?

Какая бест-практик в моём случае?а NextRecordset (или что-то около) в ADO отключили ?

есть стандратный бэд паттерн -- открыть три курсора и держать транзакцию открытой с клиента -- распространён у аров-калоедов. но это особенности ара-кала, как вструмента, им диктуют. жалко их
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38906960
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Bogukварианта три
1)вернуть 1 большой json ответдля моего клиента не самое удобное (компоненты pgDAC не поддерживают)
2)вернуть 3 массива составных типов (тот же json просто сериализация другая)Спасибо за идею, посмотрю как с этим в pgDAC, но думаю что придётся вручную разбирать.
3)вернуть 3 курсора и клиентом затем из них вычитать 3мя дополнительными ззапросамиспасибо, поизучаю такую возможность
через временные таблицы не советую - очень дорогое решение. В том смысле, что быстродействие будет не очень? Например, если создать эти темп. таблицы один раз за сессию, а в каждом вызове функции их перезаполнять?
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38906970
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgulДелать нужно правильно!
Т.е. если вам нужно три разных результата, то нужно делать три разных запроса. Вообще - да, только тогда получится что самый тяжёлый запрос будет выполнен трижды, в то время как в моём случае возможно подобрать все нужные данные, исполнив его единожды.
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38906976
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Ыа NextRecordset (или что-то около) в ADO отключили ? на клиенте используется библиотека pgDAC.
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38906994
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запись массивов записей_avz,

много букв, мало деталей сути задачи, характеристик и связей результатов.Деталями задачи грузить не хотелось бы, вопрос больше про возможности, имеющиеся у субд.
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38907078
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_avzmad_nazgulДелать нужно правильно!
Т.е. если вам нужно три разных результата, то нужно делать три разных запроса. Вообще - да, только тогда получится что самый тяжёлый запрос будет выполнен трижды, в то время как в моём случае возможно подобрать все нужные данные, исполнив его единожды.

Так сделайте один запрос в котором возвратиться все что надо. :-)
Потом раскидайте по нужным вам спискам.
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38907158
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mad_nazgul_avzпропущено...
Вообще - да, только тогда получится что самый тяжёлый запрос будет выполнен трижды, в то время как в моём случае возможно подобрать все нужные данные, исполнив его единожды.

Так сделайте один запрос в котором возвратиться все что надо. :-)
Потом раскидайте по нужным вам спискам.так не получится в рамках одного запроса.
детали, если интересноГрубо говоря, наборы такие: 1) список ид объектов, выбираемых по сложному условию, на отбор которых сервер тратит много времени 2) набор с детальной информацией по объектам из списка 1, причём записей там на порядок меньше. 3)большой объём (много колонок) по небольшой части объектов из списка 1.
Причём на клиентах с медленной (модемной!) связью проверено: один большой запрос на большой блок данных выполняется намного быстрее, чем сотни мелких, забирающих те же данные. Отсюда желание забрать все за один раз.
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38907173
?Ы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_avz,

кста, подумал, если сказать с клиента одним предложением
Код: plsql
1.
2.
3.
4.
5.
6.
BEGIN;
SELECT * FROM returned_3_cursor_function();
FETCH ALL FROM "mycurs1";
FETCH ALL FROM "mycurs2";
FETCH ALL FROM "mycurs3";
END;


то библой с NextRecordset [или аналогом ] можно будет возвраты перебрать, при этом с клиента транзакцию не держать (что всегда чревато висящим "idle in transaction" соединением при отвалившемся клиенте).
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38907174
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пока решил второй и третий наборы запаковать на сервере в bytea-блоки, которые будут возвращены через out-параметры и разобраны на клиенте.

Решение не извращения ради, а только для скорости обмена :)
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38907177
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_avzнаборы такие: 1) список ид объектов, выбираемых по сложному условию, на отбор которых сервер тратит много времени 2) набор с детальной информацией по объектам из списка 1, причём записей там на порядок меньше. 3)большой объём (много колонок) по небольшой части объектов из списка 1.
Это всё охватывающие множества. Что мешает вернуть один набор из "много колонок", у которого для ненужных объектов в ненужных колонках будет NULL?
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38907179
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?Ы_avz,

кста, подумал, если сказать с клиента одним предложением
Код: plsql
1.
2.
3.
4.
5.
6.
BEGIN;
SELECT * FROM returned_3_cursor_function();
FETCH ALL FROM "mycurs1";
FETCH ALL FROM "mycurs2";
FETCH ALL FROM "mycurs3";
END;


то библой с NextRecordset [или аналогом ] можно будет возвраты перебрать, при этом с клиента транзакцию не держать (что всегда чревато висящим "idle in transaction" соединением при отвалившемся клиенте).

Да, я уже подумал над этим вариантом.
...
Рейтинг: 0 / 0
Получить 3 набора записей из функции
    #38907184
Фотография _avz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov_avzнаборы такие: 1) список ид объектов, выбираемых по сложному условию, на отбор которых сервер тратит много времени 2) набор с детальной информацией по объектам из списка 1, причём записей там на порядок меньше. 3)большой объём (много колонок) по небольшой части объектов из списка 1.
Что мешает вернуть один набор из "много колонок", у которого для ненужных объектов в ненужных колонках будет NULL? одному объекту может соответствовать несколько деталей, но для большинства (90%) объектов деталей вообще нет.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Получить 3 набора записей из функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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