PL / SQL块上的动态参数名称

时间:2016-11-03 16:27:00

标签: oracle plsql dynamic-sql

我试图使用动态PL / SQL为多个参数生成乘法算法。我同意有多种方法可以做到这一点,但这个乘法问题是我需要做的其他事情的PoC。

所以这是代码

declare
  var1    number := 1;
  var2    number := 2;
  output  number := 1;
  varname varchar2(10);
begin
  for counter in 1..2
  loop
    execute immediate q'[select var]'||counter||' * :val1 from dual' into output using output;
  end loop;

  dbms_output.put_line(output);
end;

所以我试图做的是在运行时生成参数名称,然后评估该参数名称。

这可行吗?在内心深处,我不这么认为......但是如果这不起作用,我希望避免巨大的痛苦。 :)。顺便说一句,我在Oracle 11GR2上。

以下是我运行代码时发生的事情。

Error starting at line : 1 in command -
declare
  var1    number := 1;
  var2    number := 2;
  output  number := 1;
  varname varchar2(10);
begin
  for counter in 1..2
  loop
    execute immediate q'[select var]'||counter||' * :val1 from dual' into output using output;
  end loop;

  dbms_output.put_line(output);
end;
Error report -
ORA-00904: "VAR1": invalid identifier
ORA-06512: at line 9
00904. 00000 -  "%s: invalid identifier"
*Cause:    
*Action:
Elapsed: 00:00:00.082

谢谢和问候。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

declare
  var1    number := 1;
  var2    number := 2;
  output  number := 1;
  varname varchar2(10);
begin

  for counter in 1..2 loop
      EXECUTE IMMEDIATE 'BEGIN :ret := var'||counter ||'; END;' USING OUT output;
       dbms_output.put_line(output);
  end loop;

end;

答案 1 :(得分:0)

这是你想要达到的目标吗?

DECLARE
   var1      NUMBER := 1;
   var2      NUMBER := 2;
   output    NUMBER := 1;
   varname   VARCHAR2 (10);
BEGIN
   FOR counter IN 1 .. 2 LOOP
      EXECUTE IMMEDIATE 'select ''var''||:val1*:counter from dual'
         INTO varname
         USING var1, counter;

      DBMS_OUTPUT.put_line (varname);
   END LOOP;
END;

结果:

var1 
var2