PostgreSQL的plpgsql函数如何将schema和表名作为参数实现动态查询
错误原因
你的方案存在两个核心错误,导致运行报错:
- 返回值类型不匹配:你在第一个
RETURN后直接返回了拼接后的SQL字符串,函数定义要求返回整数类型,数据库尝试把SQL字符串转成整数失败,触发报错,且这行之后的RETURN _check逻辑永远不会执行。 - 动态SQL执行逻辑错误:PL/pgSQL中拼接生成的动态SQL不能直接运行,必须用
EXECUTE关键字触发执行;且动态语句的结果赋值INTO子句要写在EXECUTE之后,不能写在拼接的SQL字符串内部。
另外你的写法还存在SQL注入风险,直接拼接用户传入的schema、表名参数,没有做标识符转义,遇到带特殊字符、大小写的表名也会运行失败。
正确写法
CREATE OR REPLACE FUNCTION public.my_function_119(schema text, tablename text) RETURNS INTEGER LANGUAGE plpgsql AS $function$ DECLARE _check INTEGER; BEGIN -- 用format函数的%I占位符自动转义标识符,避免注入和特殊字符问题 EXECUTE format('SELECT SUM(length/1000)::integer FROM %I.%I', schema, tablename) INTO _check; RETURN _check; END $function$;
内容的提问来源于stack exchange,提问作者EricBHK
相关产品推荐
相关产品推荐

