我在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中完成?
请建议。
答案 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;