Возможно ли разыменовать символьное значение как переменную?

Можно ли разыменовать строку как переменную? Ищу что-то вроде этого:

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 шт):

Автор решения: 0xdb

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» и необходимо пересмотрерть дизайн технического решения.

→ Ссылка