2013-11-02 3 views
1

Я создал функцию и хотите присвоить переменной результат запроса:Как объявить переменную с результатом запроса?

CREATE OR REPLACE FUNCTION GetData 
(
    OUT outValue integer 
) 
AS $$ 
DECLARE 
    records "Records"; 
BEGIN 
    records := (SELECT "Value1" FROM "Records"); 
    outValue := (SELECT sum("Value1") FROM records) 
END; 
$$ LANGUAGE plpgsql; 

Но, Сэя PostgreSQL:

"ERROR: subquery in an expression returned more than one row." 

Если объявить переменную типа <"Records"%ROWTYPE>, мы имеем ту же ошибку результата.

Как объявить переменную с результатом запроса?

ответ

1

Вы можете создать временную таблицу внутри функции и использовать его для запросов после заполнения:

create or replace function GetData() 
returns integer 
as $$ 
declare 
    outValue int; 
begin 
    create temporary table records(Value1 int); 

    insert into records 
    select Value1 from Table1; 

    outValue := (select sum(Value1) from records); 

    return outValue; 
end; 
$$ language plpgsql; 

sql fiddle demo

+0

Спасибо, это работа! –

1

Почему бы не объединить запросы?

... 
BEGIN 
    SELECT sum("Value1") INTO outValue FROM "Records"; 
END; 
... 
2

Если вы просто хотите, чтобы вернуть одно значение, почему не объявить функцию, как returns integer и использовать что-то вроде этого:

CREATE OR REPLACE FUNCTION GetData() 
    returns integer 
AS $$ 
    SELECT sum("Value1")::integer FROM "Records"; 
$$ LANGUAGE sql; 

Btw: Я бы настоятельно рекомендовал прекратить использование идентификаторы в кавычках и избавиться двойных кавычек. Это сэкономит вам массу неприятностей в долгосрочной перспективе.

+0

Спасибо за совет, но я хочу сделать один запрос, а затем результаты запроса для выполнения других запросов. –

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