有没有办法动态使用变量名,我的意思是把它组成一个字符串,然后再使用它。
请不要告诉我使用数组,我所示的例子只是简化以获得更好的图片。
do $$
declare
var1 int:=1;
var2 int:=2;
var3 int:=3;
i int;
begin
raise notice 'Variable x %' , var1;
raise notice 'Variable x %' , var2;
raise notice 'Variable x %' , var3;
for i in 1..3 loop raise
notice 'Variable x %' , 'var' || i;
end loop;
end
$$
Result
NOTICE: Variable x 1
NOTICE: Variable x 2
NOTICE: Variable x 3
NOTICE: Variable x var1
NOTICE: Variable x var2
NOTICE: Variable x var3
所以我需要这样的东西,除了结果应该是数字而不是字符串Variable x var1
但是Variable x 1
并且执行不起作用
do
$$
declare
var1 text = 'car';
var2 text = 'truck';
var3 text = 'boat';
code text ;
begin
for i in 1..3 loop
code = 'Insert into My_table values (' || i || ',' || 'var' || i || ');';
execute code;
end loop;
end
$$
ERROR: column "var1" does not exist
LINE 1: Insert into My_table values (1,var1);
任何想法如何动态组合变量名称,正如我所说的那些例子很简单,只是为了说明我的观点。我需要在变量中更改多个数字,因此数组不适合我。
答案 0 :(得分:3)
您可以执行类似的操作,但如果要创建的变量超过16,000个,请务必小心:
$BODY$
declare
sql_text text;
_ptc int;
begin
sql_text = 'create table <schema>.<table> as
select id, process_date ' ;
for _ptc in select distinct(preferred_term_code) from <schema>.<table> order by 1
loop sql_text = sql_text || ', case when preferred_term_code = '||_ptc||' then 1 else 0 end as ptc_'||_ptc|| ' ';
raise notice '_ptc: %', _ptc;
end loop;
sql_text = sql_text || ' from <schema>.<table>
;';
execute sql_text;
grant select on <chema>.<table> to public;
raise notice 'Checks in the mail!';
end;
$BODY$
答案 1 :(得分:0)
PLpgSQL不支持任何方式,如何动态评估变量。对不起。没有像 eval 那样的东西。
答案 2 :(得分:0)
在pl / pgSQL中似乎没办法,但你可以为PostgreSQL安装pl / v8过程语言并使用JavaScript的eval功能。