You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL的plpgsql函数如何将schema和表名作为参数实现动态查询

错误原因

你的方案存在两个核心错误,导致运行报错:

  1. 返回值类型不匹配:你在第一个RETURN后直接返回了拼接后的SQL字符串,函数定义要求返回整数类型,数据库尝试把SQL字符串转成整数失败,触发报错,且这行之后的RETURN _check逻辑永远不会执行。
  2. 动态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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:39:03