Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Возврат из pl/pgsql функции двух и более результатов запросов / 12 сообщений из 12, страница 1 из 1
01.10.2018, 20:48
    #39711270
an2k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
Заранее прошу прощения за длинные примеры.

Пример 1.
Код: plsql
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.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
create table t1 (
    f1 integer,
    f2 integer
);
insert into t1 values(10, 20);
insert into t1 values(11, 21);

create table t2 (
    f3 varchar(10),
    f4 varchar(10)
);
insert into t2 values('text10', 'text20');
insert into t2 values('text11', 'text21');


CREATE FUNCTION foo1()
    RETURNS  SETOF t1
    LANGUAGE plpgsql
    AS $$

DECLARE
r1 t1%rowtype ;

BEGIN

for r1 in
  select * from t1
loop
  return next r1 ;
end loop;

END;
$$ security definer ;


select * from foo1();
/*
 f1 | f2
----+----
 10 | 20
 11 | 21
(2 строки)
*/

CREATE FUNCTION foo2()
    RETURNS  SETOF t2
    LANGUAGE plpgsql
    AS $$
DECLARE
r2 t2%rowtype ;
BEGIN

for r2 in
  select * from t2
loop
  return next r2 ;
end loop;

END;
$$ security definer ;

select * from foo2();
/*
   f3   |   f4
--------+--------
 text10 | text20
 text11 | text21
*/




Пример 2.
Код: plsql
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.
33.
34.
35.
36.
37.
38.
39.
CREATE FUNCTION foo12()
    RETURNS  SETOF t1,t2
    LANGUAGE plpgsql
    AS $$

DECLARE
r1 t1%rowtype ;
r2 t2%rowtype ;

BEGIN

for r1 in
  select * from t1
loop
  return next r1 ;
end loop;

for r2 in
  select * from t2
loop
  return next r2 ;
end loop;

END;
$$ security definer ;

select * from foo12();
/*
 f1 | f2
----+----
 10 | 20
 11 | 21
(2 строки)

   f3   |   f4
--------+--------
 text10 | text20
 text11 | text21
*/



Вопрос:
Почему Пример 1 работает, а Пример 2 нет?
Как вернуть из одной функции два результата, двух (или более) запросов к разным таблицам?
...
Рейтинг: 0 / 0
01.10.2018, 21:11
    #39711283
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
an2k,

так вы не можете вернуть 2 разных resultset. Из функции можно вернуть setof только одного вида.
Но вот как вы этот setof делаете - полностью ваше дело. Большой толпой return next, несколькими return query, да хоть language sql с union all. Но результат должен быть одного и того же типа. В общем-то, как для union all.
...
Рейтинг: 0 / 0
02.10.2018, 05:57
    #39711390
an2k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
т.е. выхода/обхода/хитрости никакой нет?
как нибудь вызвать две функции одним разом?

только внешним скриптом, а изнутри никак?
...
Рейтинг: 0 / 0
02.10.2018, 10:24
    #39711496
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
an2kт.е. выхода/обхода/хитрости никакой нет?
как нибудь вызвать две функции одним разом?

только внешним скриптом, а изнутри никак?

Вызвать две - легко. Хоть десять.
Вы не можете 2 recordset разной структуры вернуть с одного вызова.
Альтернатива - возвращать вместо record - JSON у которого всеравно структуры нет и тогда возвращайте чего хотите и потом сами в этой каше разбирайтесь или возвращать набор из нескольких курсоров и потом вычитывайте ваши ответы оттуда.


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
02.10.2018, 12:48
    #39711593
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
an2kт.е. выхода/обхода/хитрости никакой нет?
как нибудь вызвать две функции одним разом?

только внешним скриптом, а изнутри никак?
Из функции можно вернуть несколько курсоров и дальше с ними работать.
Код: sql
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.
postgres=# create function foo (t1_rc in out refcursor, t2_rc in out refcursor)
postgres-# as $$
postgres$# begin
postgres$#     open t1_rc for select * from t1;
postgres$#     open t2_rc for select * from t2;
postgres$# end;
postgres$# $$ language plpgsql;
CREATE FUNCTION
postgres=# begin;
BEGIN
postgres=# select foo('rc1', 'rc2');
    foo    
-----------
 (rc1,rc2)
(1 row)

postgres=# fetch all in rc1;
 f1 | f2 
----+----
 10 | 20
 11 | 21
(2 rows)

postgres=# fetch all in rc2;
   f3   |   f4   
--------+--------
 text10 | text20
 text11 | text21
(2 rows)

postgres=# commit;
COMMIT
...
Рейтинг: 0 / 0
04.10.2018, 20:51
    #39713254
an2k
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
Павел Лузанов,

и эти фичи нельзя из еще одной фунции вызвать?
только вручную интерактивно по очереди?
...
Рейтинг: 0 / 0
05.10.2018, 19:25
    #39713797
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
an2k,
Почему нет.
Код: sql
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.
do $$
declare
    rc1 refcursor := 'rc1';
    rc2 refcursor := 'rc2';
    rec1 record;
    rec2 record;
begin
    perform foo('rc1', 'rc2');

    loop
        fetch rc1 into rec1;
        exit when not found;
        raise notice '%', rec1;
    end loop;
    loop
        fetch rc2 into rec2;
        exit when not found;
        raise notice '%', rec2;
    end loop;
end;
$$ language plpgsql;

NOTICE:  (10,20)
NOTICE:  (11,21)
NOTICE:  (text10,text20)
NOTICE:  (text11,text21)
DO
...
Рейтинг: 0 / 0
05.10.2018, 19:48
    #39713801
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
Вот так чуть честнее, с закрытием курсора:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
do $$
declare
    rc1 refcursor := 'rc1';
    rc2 refcursor := 'rc2';
    rec1 record;
    rec2 record;
begin
    perform foo(rc1, rc2);

    loop
        fetch rc1 into rec1;
        exit when not found;
        raise notice '%', rec1;
    end loop;
    close rc1;
    loop
        fetch rc2 into rec2;
        exit when not found;
        raise notice '%', rec2;
    end loop;
    close rc2;
end;
$$ language plpgsql;


Ну и ссылка на документацию.
...
Рейтинг: 0 / 0
19.02.2019, 17:13
    #39776322
_Drive_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
Павел Лузанов,
Спасибо!!!
А setof refcursor нельзя? или просто "неудобно"?
...
Рейтинг: 0 / 0
19.02.2019, 17:31
    #39776345
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
_Drive_А setof refcursor нельзя? или просто "неудобно"?
Можно и setof refcursor.
...
Рейтинг: 0 / 0
19.02.2019, 21:33
    #39776474
_Drive_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
Павел Лузанов,

Я это к тому что не знаю есть ли в jdbc postgree такой Java тип как КУРСОР, ведь в случае out refcursor - получается, что это выходная переменная типа refcursor. И после вызова такой функции ее надо OPEN и FETCH (в терминах Java)
...
Рейтинг: 0 / 0
20.02.2019, 08:43
    #39776559
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возврат из pl/pgsql функции двух и более результатов запросов
_Drive_,

Так надо посмотреть в документации на драйвер jdbc .
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Возврат из pl/pgsql функции двух и более результатов запросов / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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