2015-11-03 7 views
1

У меня есть старая процедура 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'); выход как на скриншоте: enter image description here Тогда, когда я пытаюсь fetch data i получить ошибку: ERROR: cursor "c" does not exist

+0

PostgreSQL не поддерживает хранимые процедуры, поэтому вы можете возвращать только один результат за раз. –

+5

Возможно. Проверьте это [сообщение] (http://stackoverflow.com/questions/756689/postgresql-function-returning-multiple-result-sets). –

+0

Не могли бы вы уточнить, что выбрано из трех таблиц и как вы хотите, чтобы он вернулся? Например, «refcursor» не является результирующим набором. Если столбцы трех таблиц идентичны в типе данных, вы можете «UNION» запросить в одном, а затем вернуть этот набор результатов. – Patrick

ответ

0

Y ou может эмулировать его через SETOF refcursor. Но это не очень хорошая идея. Этот шаблон T-SQL не поддерживается хорошо в Postgres и должен быть запрещен, когда это возможно. Функции поддержки PostgreSQL - функция может возвращать скаляр, вектор или отношение. Вот и все. Обычно в 90% можно переписать процедуры T-SQL для очистки функций PostgreSQL.

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