Возможно ли разыменовать символьное значение как переменную?
Можно ли разыменовать строку как переменную? Ищу что-то вроде этого:
declare
my_var CONSTANT varchar2(50) := 'test';
my_var_ref CONSTANT varchar2(50) := 'my_var';
begin
DBMS_OUTPUT.PUT_LINE(&my_var_ref) -- выведет "test"
end;
Этот код конечно не работает, он для того, чтобы наглядно показать, что пытаюсь сделать.
В качестве параметра процедуры передать имя переменной:
declare
my_var CONSTANT varchar2(50) := 'test';
my_var_ref CONSTANT varchar2(50) := 'my_var';
begin
my_func(&my_var_ref) --передать my_var вместо my_var_ref
end;
Свободный перевод вопроса Oracle PL/SQL - Dereference a string as a variable от участника @user5507535
Ответы (1 шт):
TL;DR Нет, так нельзя разыменовать переменную.
Для поведения как вопросе - получить значение переменной по ее имени, скорее всего подойдёт решение с ассоциативной коллекцией. То есть, сохранить значение переменной по ключу с именем переменной:
declare
type arr is table of varchar2 (32) index by varchar2 (32);
var constant varchar2 (8) := 'test 123';
refs arr := arr ('var'=>var);
function func (ref varchar2) return varchar2 is
begin
return (refs(ref));
end;
begin
dbms_output.put_line (func ('var'));
end;
/
test 123
Хотя можно воспользоватся "динамическим PL/SQL", и такое решение выглядит рабочим:
create or replace package pack as
var varchar2(50);
function getval (ref varchar2) return varchar2;
end pack;
/
create or replace package body pack as
function getval (ref varchar2) return varchar2 is
ret varchar2 (32);
begin
execute immediate '
begin
:val := '||ref||';
end;' using out ret;
return ret;
end getval;
begin
var := 'test 123';
end pack;
/
exec dbms_output.put_line (pack.getval ('pack.var'));
test 123
Но это скорее всего будет не совсем удачным решением, так как, если возникает потребность в динамическом PL/SQL, то возможно это «Ошибка XY» и необходимо пересмотрерть дизайн технического решения.