PostgreSQL函数参数无法取值:删除语句提示表不存在
解决PostgreSQL函数动态指定表名删数的报错问题
报错原因
你写的这个函数用的是静态SQL,执行delete from tablename where id<4;时,PostgreSQL不会把tablename识别为传入的参数值,而是直接去查找名为tablename的物理表,所以会抛出"relation 'tablename' does not exist"的错误。
正确实现方式
要动态指定表名操作数据,必须使用动态SQL(通过EXECUTE语句执行),同时为了避免SQL注入、兼容带特殊字符/模式的表名,推荐用format()函数安全拼接SQL语句:
CREATE OR REPLACE FUNCTION cdc.audit_refresh(tablename text) RETURNS integer AS $$ BEGIN -- %I占位符会自动对表名(含模式名如cdc.adf_test)进行标识符转义 EXECUTE format('DELETE FROM %I WHERE id < 4', tablename); RETURN 1; END; $$ LANGUAGE plpgsql; -- 调用函数 SELECT cdc.audit_refresh('cdc.adf_test');
实用优化:返回实际删除行数
如果需要知道本次操作删除了多少条数据,可以修改函数,通过GET DIAGNOSTICS获取受影响行数:
CREATE OR REPLACE FUNCTION cdc.audit_refresh(tablename text) RETURNS integer AS $$ DECLARE deleted_rows integer; BEGIN EXECUTE format('DELETE FROM %I WHERE id < 4', tablename); GET DIAGNOSTICS deleted_rows = ROW_COUNT; RETURN deleted_rows; END; $$ LANGUAGE plpgsql;
内容的提问来源于stack exchange,提问作者Ishaan Gupta
相关产品推荐
相关产品推荐

