Огромное спасибо. Но как данную структуру использовать в функции.
к примеру
с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 возвращает ошибки.
с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 именно для формирования запроса с переменным количеством полей.
методом "научного тыка" дошел до варианта типа:
CREATEORREPLACEFUNCTION 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;
Спасибо, после Вашего замечания добавил ограничения для столбцов на использование символов "(",")", ",".
Очень интересный вариант, но при его использовании возникает проблема с преобразованием типов, т.к. в таблице находятся данные не только символьного типа, а также числа и даты. Возможно ли использование какого либо универсального типа, для выводимого массива?
да
Огромное
Огромное спасибо. Но как данную структуру использовать в функции.
к примеру
с вызововоми select f или select * from f возвращает ошибки.
тут есть 2
тут есть 2 варианта, которые изложены в документации и неоднократно фигурировали в форумах.
1 объявить поля при вызове
2 объявить поля в параметрах функции
Вся загвоздка в
Вся загвоздка в том, что я использую EXECUTE именно для формирования запроса с переменным количеством полей.
методом "научного тыка" дошел до варианта типа:
и теперь не знаю в чем могут быть проблемы при использование данного кода.
ну, очевидно,
ну, очевидно, что удалятся скобки в значениях, если они будут по краям и если в значениях будут запятые - появится ошибка. Лучше делать разделитель из нескольких символов.
к тому же, как вам такой вариант
Спасибо, после
Спасибо, после Вашего замечания добавил ограничения для столбцов на использование символов "(",")", ",".
Очень интересный вариант, но при его использовании возникает проблема с преобразованием типов, т.к. в таблице находятся данные не только символьного типа, а также числа и даты. Возможно ли использование какого либо универсального типа, для выводимого массива?
Немного
Немного переделал предложенный вариант, и избавился от ошибки преобразования типов ))