2016-11-04 7 views
1

У меня есть простой пользовательский определенную функцию следующим образом:В Plpgsql, как использовать пользовательскую функцию в другой заданной пользователем функции

create or replace function test() 
returns table (a float, b float) as 
$$ 
begin 
drop table if exists test1; 
create table test1(a float, b float); 
insert into test1 values(1,1),(2,1),(3,3); 
return query select * from test1; 
end; 
$$ language plpgsql; 

У меня есть еще определенная пользователем функция. В этом случае я хочу вызвать функцию выше.

create or replace function test2() 
returns table (a float) as 
$$ 
begin 
select test(); 
return query select a+b from test1; 
end; 
$$language plpgsql; 

после этого, когда я делаю:

select test2(); 

Это дает мне ошибку:

query has no destination for result data.

Если я свою вторую функцию следующим образом:

create or replace function test2() 
returns table (a float) as 
$$ 
select a+b from test(); 
$$language sql; 

Тогда я делаю select test2();

Он работает правильно. Я думаю, причина в том, что это не работает, когда я возвращаю что-то из функции sql, он возвращает таблицу, но когда я возвращаю что-то из функции plpgsql, он возвращает что-то похожее на кортеж. Например, (1,2). 1 будет первым атрибутом таблицы, 2 будет вторым. Это просто простой пример, я могу использовать sql вместо plpgsql для решения этой проблемы. Однако в моем реальном проекте я действительно хочу вызвать функцию plpgsql в другой функции plpgsql.

Тогда основная структура моей программы будет выглядеть следующим образом:

plpgsql function 1 
plpgsql function 2 
plpgsql function 3 

В моей главной функции plpgsql, я хочу назвать все эти три функции. Кто-нибудь имеет представление о том, как это сделать?

ответ

0

Как сообщение об ошибке говорит:

query has no destination for result data.

Значение, вы не можете выполнить SELECT в plpgsql функции без назначения для результата.
Используйте PERFORM вместо SELECT, если вы хотите отменить результат.

Похожие:

+0

Спасибо. он будет выполняться из (функции). –