plpgsql 中的动态变量名(字符串到变量名)

Posted

技术标签:

【中文标题】plpgsql 中的动态变量名(字符串到变量名)【英文标题】:Dynamic variable names in plpgsql (String to variable name) 【发布时间】:2015-08-17 12:57:07 【问题描述】:

有没有办法动态使用变量名,我的意思是把它组合成一个字符串然后使用它。

请不要告诉我使用数组,我展示的示例只是为了更好的图片而简化。

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);

关于如何动态组合变量名的任何想法,正如我所说,这些示例很简单,只是为了说明我的观点。我需要更改的不仅仅是变量中的数字,因此数组不是我的解决方案。

【问题讨论】:

什么是'pr'?为什么不打印? postgres 中最接近类似 eval 功能的东西是 EXECUTE,但 在计算的命令字符串上没有替换 PL/pgSQL 变量。任何必需的变量值都必须在构造时插入到命令字符串中;或者您可以使用参数 - 所以不,它不能按照您要求的方式完成。事实上,使用数组也无济于事(通常,但也许像哈希表/映射之类的东西可能会对您有所帮助(如 hstorejson(b) wildplasser: pr 是 var,它只是变量的快捷方式,但在我的语言中,我在复制后翻译了它,我忘了重写这个,所以对代码没有影响......但是我有编辑它 【参考方案1】:

您可以这样做,但如果要创建的变量超过 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$

【讨论】:

【参考方案2】:

PLpgSQL 不支持任何方式,如何动态评估变量。对不起。没有像 eval 这样的东西。

【讨论】:

【参考方案3】:

pl/pgSQL似乎没有办法,但是你可以为PostgreSQL安装pl/v8过程语言并使用javascript的eval特性。

【讨论】:

以上是关于plpgsql 中的动态变量名(字符串到变量名)的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL VBA 里面如何动态获取字符串转换为变量名?

JavaScript变量

JavaScript标识符与关键字和保留字

python 根据字符串动态的生成变量名并且赋值

Bash 中的动态变量名

如何访问树枝中的动态变量名?