Redshift存储过程动态变量问题:表名无法正确替换
解决AWS Redshift存储过程中动态替换SQL表名的问题
你的问题出在:代码只是从rwr_dataops.test表中取出了带占位符i的原始SQL语句,但没有对占位符做替换操作,所以输出的还是未处理的原始语句。
要实现将占位符i替换为变量值test4,需要显式使用字符串替换逻辑,以下是修改后的代码:
create or replace procedure ro.template() language plpgsql as $$ declare i varchar(20); original_sql varchar(100); final_sql varchar(100); begin i='test4'; -- 从表中取出带占位符的原始建表SQL execute 'select query from rwr_dataops.test where id=3' into original_sql; -- 将原始SQL中的占位符i替换为变量值test4 final_sql = replace(original_sql, 'i', i); -- 打印最终生成的SQL raise info '%', final_sql; -- 如果需要执行这个建表语句,取消下面一行的注释 -- execute final_sql; end; $$ call ro.template();
关键说明:
- 使用Redshift支持的
replace函数完成字符串替换,把原始SQL里的占位符i替换为变量i的实际值test4 - 如果需要直接执行生成的建表语句,只需去掉
execute final_sql;前的注释即可
你也可以直接在查询时完成替换,写法如下:
create or replace procedure ro.template() language plpgsql as $$ declare i varchar(20); final_sql varchar(100); begin i='test4'; -- 查询时直接替换占位符 execute 'select replace(query, ''i'', ''' || i || ''') from rwr_dataops.test where id=3' into final_sql; raise info '%', final_sql; -- execute final_sql; end; $$ call ro.template();
这种写法要注意单引号的转义:Redshift中字符串里的单引号需要用两个单引号表示,所以拼接变量时要写成''' || i || '''。
内容的提问来源于stack exchange,提问作者user20449096
相关产品推荐
相关产品推荐

