Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
Ребята, пришел из мира Билли Гейтса :) тобиш с MSSQL. Научился писать функции, которые возвращают единственное значение. Никак не получается сделать функцию, которая бы возвращала набор строк из таблиц, причем разных. Как правильно определить тип возвращаемых данных. Буду очень признателен, за простой пример. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2006, 19:47 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
PS в мире виндов можно просто было написать хранимую процедуру и потом ее дергать примерно так: exec my_stored_proc('param1', 34) Или вообще присвоить рекордсету set rs=cn.exec('my_stored_proc('param1', 34)') Как такое же провернуть в постгре? Что то туго у меня получается. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2006, 19:50 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
Если я правильно понял вопрос, то все что нужно это об'явить возвращаемое значение как SET OF и возвращать строки из функции RETURN NEXT. А потом вызывать ф-цию: SELECT * FROM myfunc(); В доке все довольно прозрачно описано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2006, 21:31 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
Получается, чтобы вернуть набор данных из разных таблиц (в функции сложный запрос с параметрами) я должен создать предварительно этот тип в Постргре? Или можно как то по другому? Этож типов не насоздаешься :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2006, 14:32 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
Вот пример ф-ции (на pl/pgsql) DECLARE result text; myrec RECORD; BEGIN FOR myrec IN <тут пишете сколь-угодно сложный селект из скольких угодно таблиц> LOOP <тут делаете что хотите с данными полученной записи> <ну, например, result := myrec.поле; > RETURN NEXT result; -- Возвращаете result для текущей записи END LOOP; END; Цикл повторяется столько раз сколько получилось записей в результате вашего сложного запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2006, 15:45 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
Спасибо 2 Igor! Все стало на места более менее! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2006, 16:17 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
Не дает покоя вопрос производительности... Ведь крутить цикл по тысячам записей это ужасно... Не могу понять почему такие проблемы с возвращением набора записей из процедуры? Ведь если отрабатывает запрос с объединениями и тд. там работает оптимизатор, и пр. скорость максимальна. А тут циклы, ну куда это годиться? Либо чего то не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 09:20 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
QuasarНе дает покоя вопрос производительности... Ведь крутить цикл по тысячам записей это ужасно... Не могу понять почему такие проблемы с возвращением набора записей из процедуры? Ведь если отрабатывает запрос с объединениями и тд. там работает оптимизатор, и пр. скорость максимальна. А тут циклы, ну куда это годиться? Либо чего то не понимаю. специально для тебя PostgreSQL 8.1.4 Documentation 32.4.4. SQL Functions as Table Sources All SQL functions may be used in the FROM clause of a query, but it is particularly useful for functions returning composite types. If the function is defined to return a base type, the table function produces a one-column table. If the function is defined to return a composite type, the table function produces a column for each attribute of the composite type. Here is an example: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. As the example shows, we can work with the columns of the function's result just the same as if they were columns of a regular table. Note that we only got one row out of the function. This is because we did not use SETOF. That is described in the next section. 32.4.5. SQL Functions Returning Sets When an SQL function is declared as returning SETOF sometype, the function's final SELECT query is executed to completion, and each row it outputs is returned as an element of the result set. This feature is normally used when calling the function in the FROM clause. In this case each row returned by the function becomes a row of the table seen by the query. For example, assume that table foo has the same contents as above, and we say: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Currently, functions returning sets may also be called in the select list of a query. For each row that the query generates by itself, the function returning set is invoked, and an output row is generated for each element of the function's result set. Note, however, that this capability is deprecated and may be removed in future releases. The following is an example function returning a set from the select list: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 09:33 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
Спасибо, конечно, но это я читал неоднократно. С одной таблицей все хорошо и просто, а когда запрос сложный, например, с объединениями типа SELECT f1.t1, f1.t2, f1.t3 ... FROM table1 as t1 INNER JOIN table2 as t2 .... Нужно будет создавать тип с полями f1.t1, f1.t2 ... для каждой такой процецедуры? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 10:41 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
QuasarСпасибо, конечно, но это я читал неоднократно. С одной таблицей все хорошо и просто, а когда запрос сложный, например, с объединениями типа SELECT f1.t1, f1.t2, f1.t3 ... FROM table1 as t1 INNER JOIN table2 as t2 .... Нужно будет создавать тип с полями f1.t1, f1.t2 ... для каждой такой процецедуры?сделайте вью по этому запросу - автоматом создастся тип. Дальше пользуйте этот тип в выводах. Или возвращайте SETOF RECORD, а при использовании каждый раз описывайте тип возврата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 10:47 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
Чтобы не быть голословным: Есть функция ---------------------------------------------- CREATE OR REPLACE FUNCTION get_people3() RETURNS SETOF record AS $BODY$declare r record; curs refcursor; begin open curs for select fam, im from people; fetch curs into r; return next r; return; end$BODY$ ------------------------------------------------ вызываю в pgadmin ее сл. образом select * from get_people3() as (fam varchar, im varchar); Возвращает только первую запись. Где грабли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 12:01 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
да нафига тебе plpgsql Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.06.2006, 12:10 |
|
||
|
Быстрый старт
|
|||
|---|---|---|---|
|
#18+
И вообще не забывайте про модификатор out у параметров функции ( pg 8 and above.). В этом случае не надо описывать тип - достаточно разрулить возвращаемыми параметрами.. к примеру Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.06.2006, 11:58 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33787687&tid=2006270]: |
0ms |
get settings: |
4ms |
get forum list: |
8ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
38ms |
get topic data: |
5ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 311ms |

| 0 / 0 |
