Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Осуществляю переезд из MSSQL в PostgreSQL, в связи с этим возник вопрос, возможно ли в PostgreSQL, и если возможно то как, результатом хранимой процедуры возвращать набор данных - рекордсет? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 08:34 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
Наиболее правильно это реализуется так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Можно сделать также через RETURN NEXT, тогда не надо будет делать FETCH. Но у этого способа много недостатков и я бы не рекомендовал его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 11:50 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
гм, и чем же refcursor "более правильный" нежели setof? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 12:07 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
st_sergгм, и чем же refcursor "более правильный" нежели setof?Присоединяюсь к вопросу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 12:34 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
st_sergгм, и чем же refcursor "более правильный" нежели setof?тем, что нифига не джоницо, видима :0) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 12:36 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
st_sergгм, и чем же refcursor "более правильный" нежели setof? 1) SETOF должен быть определенного типа. В случае с курсором, мой селект ничем не ограничсен. 2) В случае с курсором я могу запросить только N записей (FETCH N IN ...). При SETOF, результат будет возвращен только после финального RETURN. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 12:46 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
Thamerlan... 1) SETOF должен быть определенного типа. В случае с курсором, мой селект ничем не ограничсен. 2) В случае с курсором я могу запросить только N записей (FETCH N IN ...). При SETOF, результат будет возвращен только после финального RETURN. 1. определенного тип использовать не обязательно (см. out параметры). Неограниченный ничем селект, имхо, опасен тем, что в приложении вы не можете быть уверены в том, какой набор полей вернет вам refcursor (кол-во, порядок, наименование, тип) 2. в setof я могу добавить еще один параметр, который ограничит выдаваемый набор значений еще преимущества refcursor'а? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 13:23 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
st_sergеще преимущества refcursor'а? всмысле доказательства "правильности" ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 13:24 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
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'ите необходимое кол-во записей и сразу же получаете их , и далее в цикле, не нагружая ни сервер ни клиента. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 13:48 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
очень редко нужен миллион записей, обычно в процедуру сразу передается ограничивающий параметр. а join'ить обычно нужно очень часто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 14:19 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
2Thamerlan, вы предлагаете каждый раз при получении refcursor'а разбирать его структуру и сравнивать с ожидаемой? в принципе решаемо на клиенте, однако: добавляется дополнительный overhead полученный результат нельзя использовать в join'ах возвращаемый refcursor существует только в транзакции ps. по поводу out параметров см. документацию или ищите по форуму, уже не раз было. ps2. я совсем не пытаюсь убедить вас, что использование refcursor'а "неправильно", я лишь хотел сказать, что "наиболее правильного" способа нет. существуют разные способы со своими достоинствами и недостатками. Какой из них использовать - зависит от конкретной задачи. Собственно поэтому ваш пост про "наиболее правильную реализацию", меня несколько, гм, озадачил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 14:53 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
st_serg2Thamerlan, вы предлагаете каждый раз при получении refcursor'а разбирать его структуру и сравнивать с ожидаемой? в принципе решаемо на клиенте, однако: добавляется дополнительный overhead полученный результат нельзя использовать в join'ах возвращаемый refcursor существует только в транзакции ps. по поводу out параметров см. документацию или ищите по форуму, уже не раз было. ps2. я совсем не пытаюсь убедить вас, что использование refcursor'а "неправильно", я лишь хотел сказать, что "наиболее правильного" способа нет. существуют разные способы со своими достоинствами и недостатками. Какой из них использовать - зависит от конкретной задачи. Собственно поэтому ваш пост про "наиболее правильную реализацию", меня несколько, гм, озадачил. Хочу заметить, что понятия "правильно" и "неправильно" ввели именно вы :) Я лишь написал, что вижу недостатки, которые и описал. Вы, в свою очередь, описали преимущества. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 15:44 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
Ах, да "Наиболее правильно"... Вот эти свои слова: "Хочу заметить, что понятия "правильно" и "неправильно" ввели именно вы :)" беру обратно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 15:46 |
|
||
|
Рекордсет
|
|||
|---|---|---|---|
|
#18+
ThamerlanМожно сделать также через RETURN NEXT, тогда не надо будет делать FETCH. Но у этого способа много недостатков и я бы не рекомендовал его. вот здесь вы описание недостатков не приводили (впрочем, как и достоинств), да к томуже рекомендовали не использовать его. Хотя, как выяснилось, недостатков не так уж и много, да еще и достоинства есть ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2007, 15:58 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=34613636&tid=2005335]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
41ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 316ms |

| 0 / 0 |
