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
相关产品推荐
相关产品推荐

