powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция вовзращает несколько наборов данных
7 сообщений из 7, страница 1 из 1
Функция вовзращает несколько наборов данных
    #39508070
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SQL Server в процедурах есть такая возможность - возвращать несколько наборов данных.
Пытаюсь сделать по аналогии функцию в PostgreSQL и вызывать и читать наборы данных в коде на c#

Делаю, как описано здесь
Stored Procedure - Working with Multiple Result Sets in C#

http://www.sqlines.com/postgresql/npgsql_cs_result_sets


Сделал функцию:

Код: 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.
CREATE OR REPLACE FUNCTION public.test_get_users2 (
  userid integer
)
RETURNS SETOF refcursor AS
$body$
DECLARE 
    ref1 refcursor :='ref1';
    ref2 refcursor :='ref2';
    ref3 refcursor :='ref3';
BEGIN
	OPEN ref1 FOR 
		SELECT user_id, user_name,* FROM users;
	RETURN NEXT ref1;

	OPEN ref2 FOR 
		SELECT id, company FROM customers;
	RETURN next ref2;

	OPEN ref3 FOR 
		SELECT id, forename, surname, company FROM suppliers;
	RETURN next ref3;
END;
$body$
LANGUAGE 'plpgsql';



Вызов:
Код: c#
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.
                    sql = @"DO LANGUAGE plpgsql $$ DECLARE
                                BEGIN
                                 SELECT test_get_users(0);
                                 FETCH ALL IN ""ref1"";
                                 FETCH ALL IN ""ref2"";
                                 FETCH ALL IN ""ref3"";
                            END $$;";
                    // Start a transaction as it is required to work with cursors in PostgreSQL
                    NpgsqlTransaction tran = connection.BeginTransaction();

                    using (NpgsqlCommand command =
                       new NpgsqlCommand(sql, connection))
                    {
                        command.CommandType = CommandType.Text;//.StoredProcedure;
                        var dr = command.ExecuteReader();
                        while (dr.Read())
                        {
                            Console.Write("{0}\n", dr[0]); // здесь показывает имена всех наборов
                        }
                        // Switch to the second result set
                        dr.NextResult();

                        // Output the rows of the second result set - здесь уже читать нечего
                        while (dr.Read())
                            Console.Write("{0}\t{1} \n", dr[0], dr[1]);



Что не так?

как прочитать наборы в pgAdmin?
...
Рейтинг: 0 / 0
Функция вовзращает несколько наборов данных
    #39508518
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Return next возвращает следующую строку в тот же setof, твоя функция возвращает один набор в три строки.
Нет никаких нескольких результсетов и посему NextResult неприменим.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Функция вовзращает несколько наборов данных
    #39776230
_Drive_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
p2.,

И что делать то???
Неужели "великий и могучий" Postgree НЕ УМЕЕТ возвращать разные result set-ы?????

Можно конечно извратится, возвращая данные через несколько разных termporary таблиц, но блин это же
не то что не красиво - это противно.

Столько всего навернуто а такой нужной вещи нет???
...
Рейтинг: 0 / 0
Функция вовзращает несколько наборов данных
    #39776251
Silender
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION public.test_get_users2 (
out ref1 refcursor,
out ref2 refcursor,
out ref3 refcursor,
in  userid integer
) AS
$body$
BEGIN
    ref1 :='ref1';
    ref2 :='ref2';
    ref3 :='ref3';
  OPEN ref1 FOR .....
...
Рейтинг: 0 / 0
Функция вовзращает несколько наборов данных
    #39776757
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Drive_Столько всего навернуто а такой нужной вещи нет???
А она действительно настолько нужная? Или это просто "шашечки" для религии "три процедуры это плохо, должна быть только одна"?..
...
Рейтинг: 0 / 0
Функция вовзращает несколько наборов данных
    #39776777
Partisan M
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Drive_Столько всего навернуто а такой нужной вещи нет???

Нужна, чтобы делать неправильно. Вам же лучше, если её нет.
...
Рейтинг: 0 / 0
Функция вовзращает несколько наборов данных
    #39776779
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov_Drive_Столько всего навернуто а такой нужной вещи нет???
А она действительно настолько нужная? Или это просто "шашечки" для религии "три процедуры это плохо, должна быть только одна"?..

Да это может быть оправданно в high TPS системах.
Потому что 3 вызова хранимок это 6 network round trip а 1 вызов - 2.
А учитывая что правильно написанные запросы работают обычно быстрее чем легкодоступный уровень скорости работы сети (иметь базу с средним временем на запрос 0.05ms вполне реально а вот сделать сеть с 90% latency меньше 0.05ms - это бооольшой геморой особенно в облаках).

Как по мне если именно в этом причина - надо возвращать набор json и не возится с курсорами потому что курсоры проблему Network latency на лишних обращениях к базе не решают а json - решает.
Тем более что json можно прямо в шаблонизатор скормить минуя все прослойки ORM и прочего (причем при везении шаблонизатор еще и у клиента будет в браузере работать).


--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Функция вовзращает несколько наборов данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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