Поскольку вы запросили PL / SQL, вот решение с вложенным циклом:
create table table1 (col1, col2) as
select 'Rpt1', '(A + B(1-D))/C' from dual union all
select 'Rpt2', '-A' from dual union all
select 'Rpt3', 'C+D' from dual;
create table table2 (col1, col2) as
select 'A', 100 from dual union all
select 'B', 200 from dual union all
select 'C', 300 from dual union all
select 'D', 400 from dual;
set serveroutput on
declare
result varchar2(100);
begin
for r1 in (select col1, col2 from table1)
loop
result := r1.col2;
for r2 in (select col1, col2 from table2 where result like '%' || col1 || '%')
loop
result := replace(result, r2.col1, r2.col2);
end loop;
dbms_output.put_line(r1.col1 || ' = ' || result);
end loop;
end;
/
Rpt1 = (100 + 200(1-400))/300
Rpt2 = -100
Rpt3 = 300+400
PL/SQL procedure successfully completed.
Я предположил, что знаки доллара на самом деле не присутствуют в table2
; если они есть, вам нужно их обрезать, если не хотите, то в выводе.