Использовать REGEXP_REPLACE с указанной маской:
select x.*,
regexp_replace(str, '.*<a>(.*)</a>.*', '\1'), -- anything between <a> </a>
regexp_replace(str, '.*(<dov>.*</dov>).*', '\1'), -- anything between <dov> </dov> tag (tag included)
regexp_replace(str, '.*<pde><a>(.*)</a></pde>.*', '\1'), -- anything between <pde><a> </a></pde>
regexp_replace(str, '.*<pde><a>(<dov>.*</dov>)</a></pde>.*', '\1') -- anything between <pde><a> </a></pde> that is inside <dov> </dov> tag (tag included)
from (select '<pde><a><dov>784512</dov></a></pde>' as str from dual) x;