Как прочитать результат в функции A из функции B - PullRequest
0 голосов
/ 03 октября 2018

У меня есть две функции postgres.Функция A вызывает функцию B, которая возвращает 2 записи типа varchar.

Функция A

 CREATE OR REPLACE FUNCTION A(
 IN r1 character varying,
 IN r2 character varying,
 OUT code character varying,
 OUT msg character varying)

 RETURNS record AS
 $BODY$

 BEGIN  

 perform function B(r1,r2);

 END; $BODY$
 LANGUAGE plpgsql VOLATILE

Делая

 select * from function A ('r1', 'r2')

Я получилкод столбца void и сообщение.

Функция Function A, функция B работает нормально, код возврата и сообщение.Как я могу прочитать эти два возвращаемых значения из функции A?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Вы можете использовать SELECT INTO, как было упомянуто ранее - но этот оператор предназначен для не простых выборок (имеет предложение FROM).Использование SELECT INTO только для получения результата из двух или более переменных функций может повлиять на производительность.Лучше всего использовать составную переменную или запись переменной и назначить команду.Всего:

DECLARE r record;
BEGIN
  r := B(r1, r2);
  RAISE NOTICE 'code: %, message: %', r.code, r.message;
  ...
0 голосов
/ 03 октября 2018

Когда вы делаете PERFORM, результат вашего SELECT отбрасывается, а это не то, что мы ищем.

Если ваша функция объявлена ​​с OUT параметрами, то вам нужночтобы заполнить их значениями, используя

SELECT ... INTO ...

Таким образом, способ сделать это - получить значения, поступающие из функции B, а затем заполнить ваши выходные параметры ими, например:

SELECT * INTO code, msg FROM B(r1, r2);

При этом ваша функция будет выглядеть следующим образом:

CREATE OR REPLACE FUNCTION A(
 IN r1 character varying,
 IN r2 character varying,
 OUT code character varying,
 OUT msg character varying)
RETURNS record AS
$BODY$
BEGIN  
  SELECT * INTO code, msg FROM B(r1, r2);
END; 
$BODY$
LANGUAGE plpgsql VOLATILE;

И вы должны называть ее следующим образом:

SELECT * FROM A('first_arg', 'second_arg');

Примечания:

  • Переосмыслите, если VOLATILE - это то, что вам действительно нужно.Вы можете быть в порядке с STABLE в зависимости от кода функции B.Это может немного ускорить процесс
  • Чтобы сократить объявление типа данных, character varying совпадает с varchar.Подумайте об этом.
...