PostgreSQL function()中的错误“关系不存在”

时间:2019-06-25 11:55:52

标签: sql postgresql function plpgsql dynamic-sql

函数定义:

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 个答案:

答案 0 :(得分:2)

为此您需要动态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;