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

PostgreSQL存储过程传入模式、表名参数实现动态查询结果存变量

问题原因

你的代码无法运行是因为静态SQL不支持直接拼接变量作为表名/模式名这类标识符,PostgreSQL的SQL解析器会直接把拼接语法判定为语法错误,同时直接拼接字符串还存在SQL注入风险。

正确实现代码
CREATE OR REPLACE PROCEDURE
schema.MyProcedure(MySchema_In varchar, MyTable_In varchar)
AS $$
DECLARE 
    RowCount int;
BEGIN
    -- 用动态SQL执行拼接后的查询,%I是标识符转义占位符,避免注入和语法问题
    EXECUTE format('SELECT COUNT(*) FROM %I.%I', MySchema_In, MyTable_In)
    INTO RowCount;
    
    RAISE NOTICE 'RowCount: %', RowCount;
END;
$$
LANGUAGE plpgsql;
实现说明
  • 这里用EXECUTE执行动态生成的SQL语句,支持把传入的参数拼接为可被识别的表名/模式名
  • format函数的%I是PostgreSQL专门用于标识符的占位符,会自动对传入的标识符做转义处理:如果传入的模式名/表名包含大小写、特殊字符或者和SQL关键字重名,会自动添加双引号包裹,同时可以避免SQL注入风险
  • EXECUTE ... INTO语法可以直接把动态SQL的查询结果赋值给变量,不需要额外写子查询嵌套,简化了代码逻辑
调用示例
-- 调用示例:查询public模式下users表的行数
CALL schema.MyProcedure('public', 'users');

内容的提问来源于stack exchange,提问作者JimmyBuffet_Express

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:09:03