У меня есть старая процедура MSSQL, которую нужно портировать на функцию PostgreSQL. В основном процедура SQL состоит из CURSOR над выражением select. Для каждого объекта курсора у меня есть три оператора выбора, основанные на текущем выводе курсора.Функция PostgreSQl возвращает несколько динамических наборов результатов
FETCH NEXT FROM @cursor INTO @entityId
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT * FROM table1 WHERE col1 = @entityId
SELECT * FROM table2 WHERE col2 = @entityId
SELECT * FROM table3 WHERE col3 = @entityId
END
Таблицы из операторов SELECT имеют разные столбцы.
Я знаю, что PostgreSQL использует refcursor
, чтобы возвращать несколько наборов результатов, но вопрос в том, можно ли открывать и возвращать несколько динамических refcursors внутри цикла?
Поставщик данных Npgsql .NET используется для обработки результатов.
Postgres тестовый код только один курсор внутри цикла:
CREATE OR REPLACE FUNCTION "TestCursor"(refcursor)
RETURNS SETOF refcursor AS
$BODY$
DECLARE
entity_id integer;
BEGIN
FOR entity_id IN SELECT "FolderID" from "Folder"
LOOP
OPEN $1 FOR SELECT * FROM "FolderInfo" WHERE "FolderID" = entity_id;
RETURN NEXT $1;
CLOSE $1;
END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Затем код теста:
BEGIN;
SELECT * FROM "TestCursor"('c');
FETCH ALL IN c;
COMMIT;
SELECT * FROM "TestCursor"('c');
выход как на скриншоте: Тогда, когда я пытаюсь fetch data i получить ошибку: ERROR: cursor "c" does not exist
PostgreSQL не поддерживает хранимые процедуры, поэтому вы можете возвращать только один результат за раз. –
Возможно. Проверьте это [сообщение] (http://stackoverflow.com/questions/756689/postgresql-function-returning-multiple-result-sets). –
Не могли бы вы уточнить, что выбрано из трех таблиц и как вы хотите, чтобы он вернулся? Например, «refcursor» не является результирующим набором. Если столбцы трех таблиц идентичны в типе данных, вы можете «UNION» запросить в одном, а затем вернуть этот набор результатов. – Patrick