从运行时创建的变量中获取Oracle PLSQL中另一个变量的值

时间:2015-07-01 13:25:37

标签: oracle plsql plsqldeveloper

我在unix中有这个东西,例如下面的

filename1_temp=3
var1=filename1
var2=${var1}_temp
var3=\$${var2}

所以基本上var3包含存储在变量filename1_temp中的值,即3.我需要在oracle PL / SQL中实现此实现。例如

filename1_temp:=3
var1:="filename1";
var2:=var1||"_temp";
var3:=???

我将如何在PL / SQL中完成?

请建议。

2 个答案:

答案 0 :(得分:1)

您希望将字符串计算为PL / SQL代码。基本上下面的代码应该按照你的要求进行,但遗憾的是它不起作用:

declare
  filename1_temp constant varchar2(32767) := 'magic';
  var1 constant varchar2(32767) := 'filename1';
  var2 constant varchar2(32767) := var1 || '_temp';
  var3 varchar2(32767);
  function eval(p_var in varchar2) return varchar2 is
    v_ret varchar2(32767);
  begin
    execute immediate 'begin :ret := ' || p_var || '; end;'
      using out v_ret;
    return v_ret;
  end;
begin
  dbms_output.put_line('var3 = ' || var3);
  var3 := eval(var2); -- expecting magic
  dbms_output.put_line('var3 = ' || var3);
end;
/

失败了:

ORA-06550: line 1, column 15:
PLS-00201: identifier 'FILENAME1_TEMP' must be declared

因为execute immediate在SQL上下文中运行,并且它不知道匿名PL / SQL块的详细信息。所以你必须也可以从SQL访问变量。这是我使用公共包变量的示例:

create or replace package so49 is
  filename1_temp varchar2(32767);
end;
/
show errors

declare
  var1 constant varchar2(32767) := 'so49.filename1';
  var2 constant varchar2(32767) := var1 || '_temp';
  var3 varchar2(32767);
  function eval(p_var in varchar2) return varchar2 is
    v_ret varchar2(32767);
  begin
    execute immediate 'begin :ret := ' || p_var || '; end;'
      using out v_ret;
    return v_ret;
  end;
begin
  so49.filename1_temp := 'magic';
  dbms_output.put_line('var3 = ' || var3);
  var3 := eval(var2); -- expecting magic
  dbms_output.put_line('var3 = ' || var3);
end;
/

神奇的事情发生了:

SQL> @so49

var3 =
var3 = magic

PL/SQL procedure successfully completed.

SQL>

希望这有帮助。

答案 1 :(得分:0)

我不确定你在寻找什么,但你想要这种东西..

declare
  filename1_temp number(4);
  var1           number(4);
  var2           varchar2(100);
  var3           varchar2(100);
begin
  filename1_temp := 3 ;
  var1 := filename1_temp;
  var2           := to_char(var1) || '_temp';
  var3           := var2;
  dbms_output.put_line(var3);
end;
相关问题