powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Рекордсет
16 сообщений из 16, страница 1 из 1
Рекордсет
    #34612618
Acubed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

Осуществляю переезд из MSSQL в PostgreSQL, в связи с этим возник вопрос, возможно ли в PostgreSQL, и если возможно то как, результатом хранимой процедуры возвращать набор данных - рекордсет?

Спасибо.
...
Рейтинг: 0 / 0
Рекордсет
    #34612671
landy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Рекордсет
    #34613104
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наиболее правильно это реализуется так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE OR REPLACE FUNCTION fnc_qwerty ( p_id IN customers.id%TYPE)
RETURNS REFCURSOR AS
$BODY$
DECLARE
   rc   REFCURSOR;
BEGIN
   OPEN rc FOR
   SELECT col1,
          col2,
          col3
   FROM   tab1
   WHERE  id_fk = p_id;

   RETURN rc;
END;
$BODY$ LANGUAGE 'plpgsql' VOLATILE;

BEGIN;
SELECT fnc_qwerty ( 55 );

FETCH ALL IN "имя курсора, полученное в предыдущем SELECTе";

Можно сделать также через RETURN NEXT, тогда не надо будет делать FETCH. Но у этого способа много недостатков и я бы не рекомендовал его.
...
Рейтинг: 0 / 0
Рекордсет
    #34613187
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гм, и чем же refcursor "более правильный" нежели setof?
...
Рейтинг: 0 / 0
Рекордсет
    #34613331
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_sergгм, и чем же refcursor "более правильный" нежели setof?Присоединяюсь к вопросу.
...
Рейтинг: 0 / 0
Рекордсет
    #34613337
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_sergгм, и чем же refcursor "более правильный" нежели setof?тем, что нифига не джоницо, видима :0)
...
Рейтинг: 0 / 0
Рекордсет
    #34613386
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_sergгм, и чем же refcursor "более правильный" нежели setof?

1) SETOF должен быть определенного типа. В случае с курсором, мой селект ничем не ограничсен.
2) В случае с курсором я могу запросить только N записей (FETCH N IN ...). При SETOF, результат будет возвращен только после финального RETURN.
...
Рейтинг: 0 / 0
Рекордсет
    #34613517
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Thamerlan...

1) SETOF должен быть определенного типа. В случае с курсором, мой селект ничем не ограничсен.
2) В случае с курсором я могу запросить только N записей (FETCH N IN ...). При SETOF, результат будет возвращен только после финального RETURN.

1. определенного тип использовать не обязательно (см. out параметры). Неограниченный ничем селект, имхо, опасен тем, что в приложении вы не можете быть уверены в том, какой набор полей вернет вам refcursor (кол-во, порядок, наименование, тип)
2. в setof я могу добавить еще один параметр, который ограничит выдаваемый набор значений

еще преимущества refcursor'а?
...
Рейтинг: 0 / 0
Рекордсет
    #34613530
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_sergеще преимущества refcursor'а?
всмысле доказательства "правильности" )
...
Рейтинг: 0 / 0
Рекордсет
    #34613636
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_serg
1. определенного тип использовать не обязательно (см. out параметры). Неограниченный ничем селект, имхо, опасен тем, что в приложении вы не можете быть уверены в том, какой набор полей вернет вам refcursor (кол-во, порядок, наименование, тип)
2. в setof я могу добавить еще один параметр, который ограничит выдаваемый набор значений
еще преимущества refcursor'а?

Достаточно преимуществ, описанных мною выше.

1. Не понимаю, как OUT параметр может помочь?
Набор полей и тд... Вот простой пример парсинга результата REFCURSORA:
fields_cnt := PQnfields (sql_res);
for i:=0 to fields_cnt-1 do
dmp_data := dmp_data + PQfname(sql_res, i) + ', ';

Точно также тип данных и всё остальное. Не вижу проблемы.

2. Если вы возвращете мульон записей, то все они сначала будут помещены в память БД и потом целиком свалены на клиента. В случае курсора, вы FETCH'ите необходимое кол-во записей и сразу же получаете их , и далее в цикле, не нагружая ни сервер ни клиента.
...
Рейтинг: 0 / 0
Рекордсет
    #34613775
Serik Akhmetov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очень редко нужен миллион записей, обычно в процедуру сразу передается ограничивающий параметр.
а join'ить обычно нужно очень часто.
...
Рейтинг: 0 / 0
Рекордсет
    #34613906
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Thamerlan, вы предлагаете каждый раз при получении refcursor'а разбирать его структуру и сравнивать с ожидаемой? в принципе решаемо на клиенте, однако:
добавляется дополнительный overhead
полученный результат нельзя использовать в join'ах
возвращаемый refcursor существует только в транзакции

ps. по поводу out параметров см. документацию или ищите по форуму, уже не раз было.

ps2. я совсем не пытаюсь убедить вас, что использование refcursor'а "неправильно", я лишь хотел сказать, что "наиболее правильного" способа нет. существуют разные способы со своими достоинствами и недостатками. Какой из них использовать - зависит от конкретной задачи. Собственно поэтому ваш пост про "наиболее правильную реализацию", меня несколько, гм, озадачил.
...
Рейтинг: 0 / 0
Рекордсет
    #34614114
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
st_serg2Thamerlan, вы предлагаете каждый раз при получении refcursor'а разбирать его структуру и сравнивать с ожидаемой? в принципе решаемо на клиенте, однако:
добавляется дополнительный overhead
полученный результат нельзя использовать в join'ах
возвращаемый refcursor существует только в транзакции

ps. по поводу out параметров см. документацию или ищите по форуму, уже не раз было.

ps2. я совсем не пытаюсь убедить вас, что использование refcursor'а "неправильно", я лишь хотел сказать, что "наиболее правильного" способа нет. существуют разные способы со своими достоинствами и недостатками. Какой из них использовать - зависит от конкретной задачи. Собственно поэтому ваш пост про "наиболее правильную реализацию", меня несколько, гм, озадачил.

Хочу заметить, что понятия "правильно" и "неправильно" ввели именно вы :)
Я лишь написал, что вижу недостатки, которые и описал.
Вы, в свою очередь, описали преимущества.
...
Рейтинг: 0 / 0
Рекордсет
    #34614122
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ах, да "Наиболее правильно"... Вот эти свои слова: "Хочу заметить, что понятия "правильно" и "неправильно" ввели именно вы :)" беру обратно
...
Рейтинг: 0 / 0
Рекордсет
    #34614174
st_serg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ThamerlanМожно сделать также через RETURN NEXT, тогда не надо будет делать FETCH. Но у этого способа много недостатков и я бы не рекомендовал его.
вот здесь вы описание недостатков не приводили (впрочем, как и достоинств), да к томуже рекомендовали не использовать его. Хотя, как выяснилось, недостатков не так уж и много, да еще и достоинства есть )
...
Рейтинг: 0 / 0
Рекордсет
    #34614205
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-ж. Соглашусь, что каждому своё применение.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Рекордсет
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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