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

Get value from variable created on run time from another variable in Oracle PLSQL

我在 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 中完成?

求推荐。

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

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;

您想将字符串计算为 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 访问。这是我使用 public 包变量的示例:

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>

希望这对您有所帮助。