2016-06-11 3 views
0

Я хочу создать функцию в postgreSQL, которая считывает результат запроса с помощью курсора и возвращает результат в таблице. Я не очень хорошо знаком с курсорами, но я прилагаю усилия без каких-либо результатов. Выход был пустой таблицей. Вот мой код:Функция с курсором в postgreSQL

CREATE OR REPLACE FUNCTION getquery() 
RETURNS TABLE(ID INT, Totalprice DECIMAL) AS $$ 

DECLARE 
query_cursor CURSOR FOR SELECT CustomerID, TotalDue from SalesOrderHeader where TotalDue =(select max(TotalDue) from SalesOrderHeader); 

BEGIN 
OPEN query_cursor; 

CLOSE query_cursor; 

RETURN; 
END;$$ 

LANGUAGE plpgsql; 
+0

CURSOR может быть синонимом слова «Я хочу идти медленно». Существует даже антипаттерн для попытки работать с одной строкой за раз: RBAR - Row By Agonizing Row. Сценарии, где курсор имеет смысл, крайне редки. –

ответ

0

Вам не нужно CURSOR вообще, чтобы сделать это, вам даже не нужна функция. Но если вы действительно хотите CURSOR, то у вас должно быть FETCH строк и вернуть результаты. Вы должны вернуть результаты как SETOF sometype, потому что вы не можете объединить CURSOR с RETURNS TABLE. В общем, который выглядит следующим образом:

CREATE TYPE soh AS (ID integer, Totalprice decimal); 

CREATE FUNCTION getquery() RETURNS SETOF soh AS $$ 
DECLARE 
    query_cursor CURSOR FOR SELECT CustomerID, TotalDue FROM SalesOrderHeader 
          WHERE TotalDue = (select max(TotalDue) from SalesOrderHeader); 
    rec soh; 
BEGIN 
    OPEN query_cursor; 
    FETCH query_cursor INTO rec.ID, rec.Totalprice; -- Read a row from the cursor 
    WHILE FOUND LOOP 
    RETURN NEXT rec;         -- Return the data to the caller 
    FETCH query_cursor INTO rec.ID, rec.Totalprice; -- Keep on reading rows 
    END LOOP; 
    CLOSE query_cursor; 
    RETURN; 
END; 
$$ LANGUAGE plpgsql; 

Однако, ваш запрос будет возвращать только одну строку, так что LOOP не нужно здесь. И ваш запрос будет более эффективным, например:

SELECT CustomerID, TotalDue FROM SalesOrderHeader 
ORDER BY TotalDue DESC LIMIT 1; 
+0

Я пробовал это, и теперь вывод состоит только из 2 столбцов и количества строк, без данных. – georgia

+0

Теперь он работает, спасибо вам большое! – georgia

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