Oracle действительно не предназначен для такого поведения. Единственный способ добиться этого - использовать динамический PL / SQL для получения требуемой функциональности:
declare
v_field_value varchar2(2000);
begin
FOR rec1 IN (SELECT * FROM table1) LOOP
FOR rec2 IN (SELECT * FROM table2) LOOP
EXECUTE IMMEDIATE 'begin :value := :rec1.'
|| :rec2.field_name || '; end;'
USING OUT v_field_value, IN rec1;
IF v_field_value <> '*' THEN
...
END IF;
END LOOP;
END LOOP;
end;
Однако, если этот подход может работать, это не значит, что вы должны его использовать. Например, если ваше поле не является строкой, Oracle неявно преобразует значение, что может привести к значению, отличному от ожидаемого. Если бы это был мой код, я бы использовал его только в качестве крайней меры, после рассмотрения возможности реализации той же функциональности вне базы данных и изменения структуры базы данных, чтобы избежать необходимости в коде такого типа.
Исходя из комментария об ошибке, упомянутой в комментарии, я изменил код, чтобы передавать записи с использованием переменных связывания.