Ошибка «связь не существует» в функции PostgreSQL () - PullRequest
0 голосов
/ 25 июня 2019

Функция определена:

CREATE OR REPLACE FUNCTION len_chars(t_name VARCHAR, f_name VARCHAR) RETURNS BIGINT AS $$ 
BEGIN 
  SELECT sum(char_length(f_name)) FROM t_name; 
END; 
$$ LANGUAGE plpgsql;

Вызов из psql

SELECT len_chars('public.tag', 'name');

для таблицы «тег» и столбца «имя» возвращает ошибку:

psql: ERROR:  relation "t_name" does not exist
LINE 1: SELECT sum(char_length(f_name)) FROM t_name
                                             ^
QUERY:  SELECT sum(char_length(f_name)) FROM t_name
CONTEXT:  PL/pgSQL function len_chars(character varying,character varying) line 1 at SQL statement

Можно ли выбрать имя таблицы в функциях postgresql?

1 Ответ

2 голосов
/ 25 июня 2019

Для этого вам нужен динамический SQL. А для безопасного построения динамической строки SQL лучше всего использовать функцию format() с использованием заполнителей %I, чтобы при необходимости правильно обрабатывать идентификаторы в кавычках.

CREATE OR REPLACE FUNCTION len_chars(t_name VARCHAR, f_name VARCHAR) 
  RETURNS BIGINT AS $$ 
declare
  l_result bigint;  
BEGIN 
  execute format('SELECT sum(char_length(%I)) FROM %I', f_name, t_name)
    into l_result;
  return l_result; 
END; 
$$ LANGUAGE plpgsql;
...