Использование Execute

Возможно ли использование Execute для возвращения setof record?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

да

declare
  rec record;
begin
FOR rec IN EXECUTE 'select * from foo' 
loop
  RETURN NEXT rec ;
end loop;
 
end;

Огромное

Огромное спасибо. Но как данную структуру использовать в функции.
к примеру

сreate FUNCTION f () returns setof record 
AS $$
 DECLARE
  rec RECORD;
BEGIN
FOR rec IN EXECUTE 'select * from foo' 
LOOP
  RETURN NEXT rec ;
END LOOP;
END;
$$ LANGUAGE plpgsql

с вызововоми select f или select * from f возвращает ошибки.

тут есть 2

тут есть 2 варианта, которые изложены в документации и неоднократно фигурировали в форумах.

1 объявить поля при вызове

SELECT some_alias.field1,some_alias.field2.....  FROM f() some_alias(field1 int,field2 text...)

2 объявить поля в параметрах функции

сreate FUNCTION f (out field1 int, out field2 text.... ) returns setof RECORD 
AS $$
 DECLARE
  rec RECORD;
BEGIN
FOR rec IN EXECUTE 'select * from foo' 
LOOP
  RETURN NEXT rec ;
END LOOP;
END;
$$ LANGUAGE plpgsql

Вся загвоздка в

Вся загвоздка в том, что я использую EXECUTE именно для формирования запроса с переменным количеством полей.
методом "научного тыка" дошел до варианта типа:

CREATE OR REPLACE FUNCTION f (IN iV bigint, 
OUT oV1 character varying[], OUT oV2 character varying[])  RETURNS SETOF record 
AS $$
declare vr text:='';
r record;
begin
  begin end; -- блок формирования oV1, - поля, данные из которых необходимы
 
 FOR r IN EXECUTE 'Select '||array_to_string(oV1,',')||' from Table where ID='||iV loop
 vr=r;
 oV2=string_to_array(trim(BOTH '(' FROM trim(BOTH ')' FROM vr)),',');
 RETURN next;
 end loop;
 end IF; 
end;
$$  LANGUAGE 'plpgsql'; 

и теперь не знаю в чем могут быть проблемы при использование данного кода.

ну, очевидно,

ну, очевидно, что удалятся скобки в значениях, если они будут по краям и если в значениях будут запятые - появится ошибка. Лучше делать разделитель из нескольких символов.
к тому же, как вам такой вариант

FOR oV2 IN EXECUTE 'Select array['||array_to_string(oV1,',')||'] from Table where ID='||iV 
LOOP
   RETURN next;
END LOOP;

Спасибо, после

Спасибо, после Вашего замечания добавил ограничения для столбцов на использование символов "(",")", ",".
Очень интересный вариант, но при его использовании возникает проблема с преобразованием типов, т.к. в таблице находятся данные не только символьного типа, а также числа и даты. Возможно ли использование какого либо универсального типа, для выводимого массива?

Немного

Немного переделал предложенный вариант, и избавился от ошибки преобразования типов ))

FOR oV2 IN EXECUTE 'Select array['||array_to_string(oV1,'::varchar,')||'::varchar] from Table where ID='||iV 
LOOP
   RETURN next;
END LOOP;

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023