PostgreSQL 函数 () 中的错误 "relation does not exist"
Error "relation does not exist" in PostgreSQL function()
函数定义:
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');
对于 table "tag" 和列 "name" returns 错误:
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 函数中选择 table 名称?
为此您需要动态 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;
函数定义:
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');
对于 table "tag" 和列 "name" returns 错误:
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 函数中选择 table 名称?
为此您需要动态 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;