sql - PostgreSQL 函数 () 中的错误 "relation does not exist"

标签 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');

对于表“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 函数中选择表名?

最佳答案

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

关于sql - PostgreSQL 函数 () 中的错误 "relation does not exist",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56753496/

相关文章:

mysql - 不从 MySQL 中选择重复项

sql - 查找所有带有希伯来名字的记录

sql - 我只想按日期搜索没有时间戳的内容

python +postgresql : Convert string literal to regex

c++ - 在 C++ 中的合并排序中传递数组时出错

javascript - 让订单出现在确认警报框中

function - floor()/int() 函数实现

sql iif语句连接表问题

php - MySQL 和 PHP 中按日期排序并重视今天的日期

java - 将逗号分隔的字符串作为参数传递给数据库时