У меня есть старая процедура MSSQL, которую нужно перенести в функцию PostgreSQL. В основном процедура SQL состоит из CURSOR над оператором select. Для каждого объекта курсора у меня есть три оператора выбора на основе текущего вывода курсора.
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
для возврата нескольких наборов результатов, но вопрос в том, можно ли открывать и возвращать несколько динамических рефкурсоров внутри цикла?
Поставщик данных 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');
похож на скриншот: Затем, когда я пытаюсь получить данные, я получаю сообщение об ошибке: ERROR: cursor "c" does not exist
refcursor
не является результирующим набором. Если столбцы трех таблиц идентичны по типу данных, вы можетеUNION
объединить запросы в один, а затем вернуть этот набор результатов. - person Patrick   schedule 03.11.2015