PgAdmin中trim全库文本函数报错:operator does not exist解决咨询
修复PostgreSQL批量修剪文本字段函数的字符串拼接错误
问题分析
你编写的trim_all_text函数试图批量修剪public schema下所有基表的文本字段,但运行时出现错误:
ERROR: operator does not exist: unknown + information_schema.sql_identifier
LINE 1: SELECT QL += 'UPDATE ' + IT.TABLE_SCHEMA + '.'
核心问题有两个:
- 误用了字符串拼接方式(PostgreSQL不支持
+拼接,且原代码的变量赋值逻辑错误) - 动态SQL的构造方式不安全,且存在SQL Server语法混用的问题
正确的函数实现
以下是修复后的函数代码,直接遍历目标字段并执行修剪操作:
CREATE OR REPLACE FUNCTION trim_all_text() RETURNS void AS $$ DECLARE rec record; BEGIN -- 遍历public schema下所有基表的文本类型字段 FOR rec IN SELECT it.table_schema, it.table_name, ic.column_name FROM information_schema.tables it JOIN information_schema.columns ic ON it.table_name = ic.table_name AND it.table_schema = ic.table_schema WHERE it.table_schema = 'public' AND it.table_type = 'BASE TABLE' AND ic.data_type IN ('character varying', 'character', 'text') LOOP -- 动态执行UPDATE语句,安全修剪字段前后空格 EXECUTE format( 'UPDATE %I.%I SET %I = TRIM(%I)', rec.table_schema, rec.table_name, rec.column_name, rec.column_name ); END LOOP; END; $$ LANGUAGE plpgsql;
关键修复点
- 替换错误的赋值逻辑:用
FOR ... IN循环遍历符合条件的字段,替代原代码中错误的PERFORM赋值方式 - 安全拼接动态SQL:使用
format()函数的%I占位符,自动处理标识符转义,避免SQL注入和特殊命名的表/字段报错 - 简化修剪函数:PostgreSQL的
TRIM()函数直接实现前后空格修剪,无需嵌套LTRIM(RTRIM()) - 修正数据类型匹配:PostgreSQL中没有
nvarchar/nchar类型,只需要匹配character varying(对应varchar)、character(对应char)和text即可 - 移除SQL Server语法:去掉原代码中
[表名]这类SQL Server的标识符写法,改用PostgreSQL标准的标识符处理方式
内容的提问来源于stack exchange,提问作者kitchenprinzessin
相关产品推荐
相关产品推荐

