Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
Я могу вернуть RETURNS SETOF integer. А если мне надо вернуть рекордсет из запсией типа: integer, varchar, bit Как ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 13:37 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
WinnipuhЯ могу вернуть RETURNS SETOF integer. А если мне надо вернуть рекордсет из запсией типа: integer, varchar, bit Как ?или CREATE TYPE my_type AS.... (см доку на CREATE TYPE) и ...RETURNS SETOF my_type ... или же через "псевдотип" RECORD: ...RETURNS SETOF RECORD ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 13:51 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
спасибо, вот функция, компилируется нормально, но при выборке пишет ошибку ERROR: a column definition list is required for functions returning "record" ---------------- CREATE OR REPLACE FUNCTION GetChildren(var_node_id uuid) RETURNS SETOF RECORD AS $body$ DECLARE result RECORD; BEGIN create temporary table tst( node_id uuid, parent_id uuid, level integer not null default 0 ) on commit drop; -- здесь заполняется временная таблица for result in select node_id,parent_id,level from tst LOOP return NEXT result; END LOOP; RETURN; END; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 13:55 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
определил композитный тип, в принципе - нормальное, быстрое решение (Y) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 14:01 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
вот тебе пример рекордсета вобще не связанного с данными в бд ... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Код: plaintext Надеюсь на этом примере понятно показанно как это делается? Или еще вопросы будут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 14:08 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
Winnipuhспасибо, вот функция, компилируется нормально, но при выборке пишет ошибку ERROR: a column definition list is required for functions returning "record" SELECT для ф-ии с типом "рекорд" требует указания "листа определения колонок" т.е. определение типа вывода переносится на этап SELECT-а . Все см в доке, или тут - поиском (возможно - по фрагменту сообщения). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 14:08 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
то :4321 в восьмерке появились параметры in и out и необходимость определять тип результата функции или указывать список колонок для типа record уже отпала. так что ежели у воспрошающего pG 8 - то пусть пишет как я привел выше. Это значительно облегчает жизнь.. Ежели не 8 тады ой.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 14:18 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
Или вот так - расширим примерчик: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 14:34 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
версия 8, так проще, спасибо. Еще вопрос из этой же функции: из-за того, что создаю временную таблицу не могу повторно вызвать функцию, пишет ошибку ОИД. пришлось использовать execute 'insert into tst(node_id,parent_id) select id,parent_id from nodes where parent_id=var_node_id;'; вопрос: здесь var_node_id - это входной параметр функции, и execute не видит его. как быть?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 15:11 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
Несколько вариантов 1 Собирать самому запрос полностью r примеру: Код: plaintext 1. 2. 3. 4. 5. 2. Отказаться от временной таблицы. в том примере что ты привел - временная таблица - в принципе не нужна.. Можно данные сразу выдавать наружу через return next; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 17:35 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
2 domanix: увы, нужна, самое интересное за этим скрыто -- здесь заполняется временная таблица вот в T-SQL как сделано, я формирую список всех потомков дерева BEGIN declare @rows int insert into @out(node_id,parent_id) select [id], parent_id from dbo.nodes where parent_id=@node_id set @rows=@@ROWCOUNT while(@rows>0) begin update @out set [level]=[level]+1 insert into @out(node_id,parent_id) select [id], parent_id from dbo.nodes where parent_id in (select node_id from @out where [level]=1) set @rows=@@ROWCOUNT; if(@rows=0) break; end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 17:49 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
Winnipuh2 domanix: увы, нужна, самое интересное за этим скрыто -- здесь заполняется временная таблица вот в T-SQL как сделано, я формирую список всех потомков дерева что мешает вам выводить набор потомков в качестве ф-ии (которую кстати можно джойнить как обычную таблицу), а не заполнять зачем-то времянку? Или вы хотите ее опосля проиндексировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 17:57 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
4321 Winnipuh2 domanix: увы, нужна, самое интересное за этим скрыто -- здесь заполняется временная таблица вот в T-SQL как сделано, я формирую список всех потомков дерева что мешает вам выводить набор потомков в качестве ф-ии (которую кстати можно джойнить как обычную таблицу), а не заполнять зачем-то времянку? Или вы хотите ее опосля проиндексировать? нет, мне нужен только список, рекордсет на выходе. node_id, parent_id, level Я так формировал в mssql процедуре, в цикле заполняется временная таблица и потом селект из нее. с одной стороны врем таблица, а сдругой я использую тип uuid, который не преобразовывается ни в какой другой... не совсем понял Вашу идею. как?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 18:09 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
в T-SQL я избавился от рекурсии. Возможно здесь рекурсивно обойти?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 18:11 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
как такое решение? :-) CREATE OR REPLACE FUNCTION "public"."getchildren" (var_node_id "public"."uuid", var_level integer) RETURNS SETOF "public"."parent_record" AS $body$ DECLARE result RECORD; DECLARE rows_conter integer; DECLARE query text; BEGIN if exists(select id,parent_id,1 from nodes where parent_id=var_node_id) then for result in select id,parent_id,1 from nodes where parent_id=var_node_id LOOP select * from GetChildren(id, level+1); return NEXT result; END LOOP; end if; RETURN; END; $body$ LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 18:19 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
что вам мешает открывать рекордсет не по селекту к таблице, а скажем по выборке вида: select * from myrecordset(100); или вы хотите потом измываться над данными? так ничто вам не мешает вызывать вашу ф-ю из другой, в которой и еще раз преобразовывать данные. единственное место, где возможно оправдана именно темповая таблица, это когда вы собираетесь ее ну очень многократно вызывать в некой другой процедуре, а гарантировать, что вызов этой вашей ф-ии|таблицы будет произведен один раз для всех ее вхождений в вызывающую - вы не можете. а использовать ф-ию можно примерно так: select * from myrecordset(100) AS r INNER JOIN my_table USING(id) ; ах да, вспомнил. Вы еще можете захотеть менять данные темповой выборки руками (с тем, чтобы потом куда-то влить). Если это - ваш случай, то видимо да, вам будет удобно работать с темповой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2006, 18:21 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
domanix Код: plaintext 1. 2. 3. 4. Проблема аналогичная, но количество и название выходных столбцов неизвестно заранее - SQL генерируется динамически и потом выдаётся через Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2006, 09:36 |
|
||
|
как вернуть рекордсет из функции?
|
|||
|---|---|---|---|
|
#18+
Нет в таком случае нужно указывать внешнему запросу вызвавшему такую функцияю какие колонки и какого типа вернутся. в противном случае парсер и планировщик не смогут узнать а какие типы и какие колонки возвращает данная функция. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2006, 10:54 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=33888911&tid=2006193]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 252ms |
| total: | 406ms |

| 0 / 0 |
