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

Пример 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
Возврат из pl/pgsql функции двух и более результатов запросов
    #39711283
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
an2k,

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

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

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

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


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
Возврат из pl/pgsql функции двух и более результатов запросов
    #39711593
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Возврат из pl/pgsql функции двух и более результатов запросов
    #39713254
an2k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,

и эти фичи нельзя из еще одной фунции вызвать?
только вручную интерактивно по очереди?
...
Рейтинг: 0 / 0
Возврат из pl/pgsql функции двух и более результатов запросов
    #39713797
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Возврат из pl/pgsql функции двух и более результатов запросов
    #39713801
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так чуть честнее, с закрытием курсора:
Код: 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
Возврат из pl/pgsql функции двух и более результатов запросов
    #39776322
_Drive_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,
Спасибо!!!
А setof refcursor нельзя? или просто "неудобно"?
...
Рейтинг: 0 / 0
Возврат из pl/pgsql функции двух и более результатов запросов
    #39776345
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Drive_А setof refcursor нельзя? или просто "неудобно"?
Можно и setof refcursor.
...
Рейтинг: 0 / 0
Возврат из pl/pgsql функции двух и более результатов запросов
    #39776474
_Drive_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузанов,

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

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


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