DB2数据库如何在存储过程中将表名作为参数使用
问题根因
静态SQL无法将传入的参数解析为表名这类标识符,你原有代码里的SELECT * FROM TABL_NAME会被数据库直接识别为查询名称固定为TABL_NAME的表,不会替换成你传入的参数值,必须通过动态SQL实现这类动态标识符的查询逻辑。
修正后的实现
你需要使用PREPARE语句预编译拼接好的动态SQL,再关联游标返回结果集,适配DB2语法的完整代码如下:
CREATE OR REPLACE PROCEDURE PROC(IN TABL_NAME VARCHAR(255)) SPECIFIC PROC LANGUAGE SQL DYNAMIC RESULT SETS 1 BEGIN DECLARE cur1 CURSOR WITH RETURN FOR stmt; DECLARE dyn_sql VARCHAR(1000); -- 拼接查询语句,生产环境建议增加表名合法性校验 SET dyn_sql = 'SELECT * FROM ' || TABL_NAME; PREPARE stmt FROM dyn_sql; OPEN cur1; END;
调用方法
直接传入目标表名即可,返回结果和直接执行对应表的全表查询完全一致:
CALL PROC('employee');
使用提示
- 动态拼接标识符存在SQL注入风险,生产使用前建议增加校验逻辑:比如先查询系统表判断传入的
TABL_NAME是否为真实存在的业务表,拦截恶意拼接的字符串 - 上述代码和你原有写法的语法特性保持一致,适用于DB2数据库
内容的提问来源于stack exchange,提问作者Кирилл Колубович
相关产品推荐
相关产品推荐

