Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / многострочный результат функции / 17 сообщений из 17, страница 1 из 1
21.02.2007, 11:09
    #34346248
Tertium Organum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
Опять-таки, портируя код с MSSQL на Postgre, вот с чем столкнулся.
У меня была в мs ф-ция, которая по заданным параметрам формировала селект, и выкидывала на выход его результат.
в Постгре я не смог найти вариант, как это сделать, вопрос тут в том, как выполнить в plpgsqlной фции select * from my_table а на выходе получить результат в setof my_table?
выяснилось, что plpgsqlная фция не может вызывать селект, а sqlная - не умеет юзать конструкции языка типа переменных и ветвлений (ну, последние только до from). я не прав?
(ваще дивлюсь, зачем так издеваться над разработчиком?)

как можно из plpgsql фции вернуть результат селекта, если это не один ров?

зы:
у меня родился вариант создавать в строке запрос на создачу вью, а потом его вызывать,
но это два вызова, то есть придется переписывать сёвый код, а это нельзя. там четко прописан вызов хп и забор ее результата :(
...
Рейтинг: 0 / 0
21.02.2007, 11:56
    #34346438
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
Tertium OrganumОпять-таки, портируя код с MSSQL на Postgre, вот с чем столкнулся.
У меня была в мs ф-ция, которая по заданным параметрам формировала селект, и выкидывала на выход его результат.
в Постгре я не смог найти вариант, как это сделать, вопрос тут в том, как выполнить в plpgsqlной фции select * from my_table а на выходе получить результат в setof my_table?
выяснилось, что plpgsqlная фция не может вызывать селект,


Chto-to vy ne tak ponimaete...
Illustratsia to, chto select * from i vozvrashenie SETOF v PL/PgSQL vozmnozhny:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
wsdb=# \d file_list
....
wsdb=# CREATE or replace FUNCTION xx() returns setof file_list as $$
declare x record;
begin
for x in select * from file_list LOOP
return next x;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION
wsdb=# select * from xx() ;
 ...................


V dannoi konkretnoi realizatsii tolko nado tolko pomnit' chto vse rez-ty zaprosa vo vremia ispolnenia PL/PGSQL'iny
budut nakaplivatsia v pamiati.
...
Рейтинг: 0 / 0
21.02.2007, 12:17
    #34346500
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
Tertium Organumкак можно из plpgsql фции вернуть результат селекта, если это не один ров?

Код: 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.
CREATE OR REPLACE FUNCTION my_func(IN p_id int4, OUT id_t1 int4, OUT t1_name text) AS
$BODY$declare
rec       record;
begin

    if (p_id is NULL) then
        p_id :=  1 ;
    else
        --;
    end if;

    for rec in
    select f1, f2
    from my_table
    where id = p_id
    loop
      id_t1      := rec.f1;
      t1_name := rec.f2;
      return next;
    end loop;

    return;
end;$BODY$
  LANGUAGE 'plpgsql' VOLATILE;
...
Рейтинг: 0 / 0
21.02.2007, 12:30
    #34346564
Tertium Organum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
спасибо, и правда получилось. правда пока не совсем понятно как оно работает,но и ладно. Но что значит "накапливаться"?
то есть если я делаю селект от функции, получаю кортеж и закрываю соединение, там чтото висит в буфере?
а если просто делается select * from mytable без фции? то результат его тоже будет в памяти или нет?

то есть я хочу сказать, на сколько это страшно, что результат в памяти?
...
Рейтинг: 0 / 0
21.02.2007, 13:46
    #34346948
СергейК
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
Tertium OrganumНо что значит "накапливаться"?
то есть я хочу сказать, на сколько это страшно, что результат в памяти?

Nu on nakaplivaetsia kogda idet ispolnenie "vnutrennego" selecta. T.e. PL/PgSQL'ina vyplevyvaet strochki ne po odnoi, a snachala zhdet, chto vnutrennii select poluchit vse rezultaty, i potom srazu vse vozvrashaet iz pamiati.

Tak chto nichego strashnogo v etom net. Esli vy tolko ne chitaete v takom odnom selecte sotni megabyt....

Nadeus' bolee ili menee poniatno..
...
Рейтинг: 0 / 0
21.02.2007, 15:15
    #34347387
Tertium Organum
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
да нет, вроде там не сотни мегабайт. спасибо за ответы!
...
Рейтинг: 0 / 0
21.02.2007, 23:44
    #34348661
.gc
.gc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
Tertium Organumспасибо, и правда получилось. правда пока не совсем понятно как оно работает,но и ладно. Но что значит "накапливаться"?
то есть если я делаю селект от функции, получаю кортеж и закрываю соединение, там чтото висит в буфере?
соединение закрыто -> процесс умер -> память фтопку

а если просто делается select * from mytable без фции? то результат его тоже будет в памяти или нет?

то есть я хочу сказать, на сколько это страшно, что результат в памяти?
так же страшно как SELECT ... ORDER BY ... LIMIT ... OFFSET ...
...
Рейтинг: 0 / 0
05.05.2007, 11:34
    #34506654
многострочный результат функции
СергейК Tertium OrganumОпять-таки, портируя код с MSSQL на Postgre, вот с чем столкнулся.
У меня была в мs ф-ция, которая по заданным параметрам формировала селект, и выкидывала на выход его результат.
в Постгре я не смог найти вариант, как это сделать, вопрос тут в том, как выполнить в plpgsqlной фции select * from my_table а на выходе получить результат в setof my_table?
выяснилось, что plpgsqlная фция не может вызывать селект,


Chto-to vy ne tak ponimaete...
Illustratsia to, chto select * from i vozvrashenie SETOF v PL/PgSQL vozmnozhny:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
wsdb=# \d file_list
....
wsdb=# CREATE or replace FUNCTION xx() returns setof file_list as $$
declare x record;
begin
for x in select * from file_list LOOP
return next x;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION
wsdb=# select * from xx() ;
 ...................


V dannoi konkretnoi realizatsii tolko nado tolko pomnit' chto vse rez-ty zaprosa vo vremia ispolnenia PL/PGSQL'iny
budut nakaplivatsia v pamiati.

А как быть, если в теле функции стоит не простенький SELECT * FROM ..., а сложный запрос из нескольких таблиц, тогда что же указывать в качестве возвращаемого типа SETOF?
...
Рейтинг: 0 / 0
07.05.2007, 08:17
    #34508414
Serik Akhmetov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
а) вы можете объявить свой тип
б) начиная с 8.1 в параметрах процедуры можно явно указывать IN/OUT
...
Рейтинг: 0 / 0
07.05.2007, 22:03
    #34511071
fayzullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
Указанный Serik Akhmetov`ым запрос на формирование функции у меня не сработал, но сработала следующая конструкция (версия субд 8.2):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE FUNCTION my_func(OUT p1 int4, OUT s1 varchar) RETURNS SETOF record AS
$BODY$
begin
  p1 :=  1 ;
  s1 := 'Вася';
  return next;
  p1 :=  2 ;
  s1 := 'Петя';
  return next;

  return;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

Но есть в продолжении темы вопрос: а что если я заранее не знаю сколько мне необходимо столбцов в результате, т.е., например, в зависимости от входных параметров мне необходимо вернуть либо 2, либо 5, либо набор записей из 20 столбцов? Таким образом, в принципе, можно сформировать в функции произвольный набор записей в качестве результата. Возможно ли такое?
...
Рейтинг: 0 / 0
08.05.2007, 16:04
    #34513233
fayzullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
Прочитал документацию и понял, что мой предыдущий вопрос имеет отрицательный ответ :(
...
Рейтинг: 0 / 0
08.05.2007, 17:34
    #34513575
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
до refcusor'ов добрались? )
...
Рейтинг: 0 / 0
11.05.2007, 13:29
    #34519018
fayzullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
st_sergдо refcusor'ов добрались? )

Это намек на то, что с их помощью можно реализовать то, что указано в моем вопросе? ) Если да, то не могли бы Вы привести пример.
...
Рейтинг: 0 / 0
11.05.2007, 13:37
    #34519054
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
в главе 37.8. Cursors см. примеры
...
Рейтинг: 0 / 0
11.05.2007, 13:40
    #34519072
st_serg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
гм, както грубо получилось ) сори
я имею ввиду что в конце главы приведены несколько примеров )
...
Рейтинг: 0 / 0
11.05.2007, 15:40
    #34519662
w
w
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
...
Рейтинг: 0 / 0
13.06.2007, 09:18
    #34590668
fayzullin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
многострочный результат функции
Благодарю
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / многострочный результат функции / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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