2014-01-17 1 views
0

Я ищу возможность извлекать несколько DataTables (в пределах одного DataSet), используя npgsql и функцию postgres (хранимую процедуру). Хотя моя функция postgres вообще работает уже, я не возвращаю 2 отдельные таблицы, но только одну таблицу, содержащую все результаты всех запросов (как при выполнении функции через pgAdmin, так и через npgsql/NpgsqlDataAdapter.Fill).Postgres эквивалент MS-SQL SELECT DataSet необходимо (возвращать несколько таблиц в одном запросе)

Смотрите мой упрощенный пример здесь:

CREATE OR REPLACE FUNCTION "MyFunction"(_parameter character varying) 
RETURNS SETOF "MyView" AS 
$BODY$ 
DECLARE 
BEGIN 
return query SELECT * FROM "MyView" WHERE "Col1" = 'A' AND "Col2" = _parameter; 
return query SELECT * FROM "MyView" WHERE "Col1" = 'B' AND "Col2" = _parameter; 
END 
$BODY$ 
LANGUAGE plpgsql VOLATILE 
COST 100 
ROWS 1000; 

Использование вызывающего абонента:

SELECT * FROM "MyFunction"('abc'); 

не Eсть ли способ получить возвратило DataSet, содержащий ОТДЕЛЬНЫЕ DataTables с использованием npgsql.dll? Запрос необязательно должен выполняться через функцию postgres - если можно будет получить такой DataSet с отдельными таблицами, просто используя ngpsql ExecuteScalar, что было бы даже предпочтительнее ... Спасибо за любое предложение!

+0

Хм. Я знаю код, который возвращает несколько наборов результатов для 'NpgsqlDataReader.NextResult()' довольно хорошо (я переписал его несколько лет назад), и 'NpgsqlDataAdapter.Fill()' должен вызывать на это, но этот код я не хорошо знать. Может быть, что 'NpgsqlDataAdapter.Fill()' неправильно обрабатывает 'NpgsqlDataReader.NextResult()' и что это ошибка. –

+0

@FranciscoJunior был бы человеком, который знал бы. –

+0

Спасибо Jon Hanna, я сделал свою функцию, используя NpgsqlDataReader.NextResult(). При сравнении этого решения с методом SqlDataAdapter.Fill() этот подход требует довольно много работы и многих строк кода, однако он работает :-) – Loonis

ответ

0

Не должно работать - PostgreSQL не поддерживает набор многопотоков. С помощью одного трюка вы можете вернуть набор возвращаемых курсоров.

RETURN QUERY посылает результат на вывод, но нет чистой границы между результатами двух применений RETURN QUERY. Это то же самое, что и UNION.

RETURN QUERY SELECT 1; 
RETURN QUERY SELECT 1; 
RETURN; 

такой же, как:

RETURN QUERY SELECT 1 UNION SELECT 2; 
RETURN; 

 Смежные вопросы

  • Нет связанных вопросов^_^