从 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>
希望这对您有所帮助。
我在 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>
希望这对您有所帮助。