Функция, которая перебирает таблицы, вызываемые программно - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужна функция, которая использует идентификатор для выбора таблиц 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% аргументов, и для меня это более читабельно, не используйте этот способ, по крайней мере, пока я исправили основную проблему.)

1 Ответ

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

Я заметил, что в функции есть несколько ошибок:

Первый

Нельзя использовать структуру управления с EXECUTE

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;';    

Второй

Не существует оператора + для типа символа, который изменяется.

result := var_r.digit1 + var_r.digit2

Учитывая эти моменты, возможно, это сработает

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));

--cadena_sql :=
 FOR var_r IN EXECUTE 'SELECT ' || 
        tabla_s1 ||'.digit1 , '||tabla_s2 ||'.digit2 
   FROM '||tabla_s1||','||tabla_s2||
 ' WHERE '||tabla_s1||'.id ='|| tabla_s2||'.id'
 LOOP
        result := var_r.digit1::int + var_r.digit2::int;
        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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...