Мне нужна функция, которая использует идентификатор для выбора таблиц dos и возвращает другую таблицу со значениями процесса из этих таблиц.
Давайте рассмотрим эти таблицы:
таблица sum1_suffix
id | digit1
----+--------
1 | 2
2 | 8
3 | 7
4 | 5
таблица sum2_suffix
id | digit2
----+--------
1 | 7
2 | 3
3 | 9
4 | 1
Моя функция:
CREATE OR REPLACE FUNCTION public.add(IN tablesuffix character varying)
RETURNS TABLE(result integer) AS
$BODY$
DECLARE
var_r record;
tabla_s1 character varying;
tabla_s2 character varying;
cadena_sql TEXT; --for debugging
BEGIN
tabla_s1 := quote_ident(CONCAT('sum1_',tablesuffix));
tabla_s2 := quote_ident(CONCAT('sum2_',tablesuffix));
EXECUTE
--cadena_sql :=
'FOR var_r IN( SELECT ' ||
tabla_s1 ||'.digit1 , '||tabla_s2 ||'.digit2
FROM '||tabla_s1||','||tabla_s2||
' WHERE '||tabla_s1||'.id ='|| tabla_s2||'.id)
LOOP
result := var_r.digit1 + var_r.digit2
RETURN NEXT;
END LOOP;';
RAISE NOTICE 'cadena sql es %',cadena_sql;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION public.add(character varying)
OWNER TO postgres;
Наконец, я вызываю функцию:
select * from add('suffix');
Но я получаю эту ошибку:
ERROR: syntax error at or near "FOR"
LINE 1: FOR var_r IN( SELECT sum1_code.digit1 , sum2_code.digit2
^
Также я пытаюсь изменить эту строку:
'FOR var_r IN(SELECT ' ||
таким образом:
'FOR '||var_r ||' IN(SELECT ' ||
Но тогда я получаю следующую ошибку:
ERROR: record "var_r" is not assigned yet
DETAIL: The tuple structure of a not-yet-assigned record is indeterminate.
CONTEXT: SQL statement "SELECT 'FOR '||var_r ||' IN(SELECT ' ||
...........
(Примечание: я не использовал FORMAT () в EXECUTE, потому что в реальном запросе у меня есть около 20 I% аргументов, и для меня это более читабельно, не используйте этот способ, по крайней мере, пока я исправили основную проблему.)