For a single line of sql code, you could do something like:

declare
pct1 varchar2(100) := 'Daddy';
pct2 varchar2(100) := 'Mommy';
pct3 varchar2(100) := 'Baby';
x varchar2(1000);
begin
select replace(replace(replace('%1 bear is the largest, %2 bear is in the middle and %3 bear is smallest','%1',pct1),'%2',pct2),'%3',pct3) into x from dual;
dbms_output.put_line(x);
end;
/

I did this from the SQL*PLUS command prompt, so I declared my variables in the anonymous block. Obviously, you could use variables available in the session to which you are connected. The limitation is the number of REPLACE statements you wish to/can nest. I don't know the functional limit, but it gets tougher to manage the code when the nesting goes beyond a certain level.

Good luck!