Usando expressão regular regexp_replace, oracle 10g ou superior

Hoje tive mais um exemplo da utilização de expressão regular e que ajudou a resolver fácil um problemão.

Na rotina de backup há uma tabela contendo vários endereços de destinos de backups contendo o seu IP e um destes endereços foi alterado, porem como alterar todos os registros de uma unica vez?

Vejamos como resolver o problema rápido e facil com expressão regular em vez de ficar procurando os campos e alterar linha por linha.

SQL> select * from bkp_dest;

       COD NOMDEST
---------- --------------------------------------------------
         1 /orabackup/dbprod/logico
         2 /orabackup/dbprod/fisico
         3 /orabackup/dbprod/arch
         4 //192.168.3.248/micro/logico
         5 //192.168.3.248/micro/arch
         6 //192.168.3.248/micro/fisico
         7 //192.168.2.248/micro/logico
         8 //192.168.2.248/micro/arch
         9 //192.168.2.248/micro/fisico
        10 //192.168.5.248/micro/logico
        11 //192.168.5.248/micro/arch
        12 //192.168.5.248/micro/fisico
        13 //192.168.3.249/micro/logico
        14 //192.168.3.249/micro/arch
        15 //192.168.3.249/micro/fisico
        16 //192.168.3.251/micro/logico
        17 //192.168.3.251/micro/arch
        18 //192.168.3.251/micro/fisico
        19 //192.168.3.248/micro2/logico
        20 //192.168.3.248/micro2/arch
        21 //192.168.3.248/micro2/fisico
        ...
269 rows selected

Encontrar os registros até é facil.

SQL> select * from bkp_dest where nomdest like '%3.248%';

       COD NOMDEST
---------- --------------------------------------------------
         4 //192.168.3.248/micro/logico
         5 //192.168.3.248/micro/arch
         6 //192.168.3.248/micro/fisico
        19 //192.168.3.248/micro2/logico
        20 //192.168.3.248/micro2/arch
        21 //192.168.3.248/micro2/fisico

Mas para alterar os 6 registros que poderiam ser mais de 100 teria que ficar fazendo update linha a linha?

Desejo alterar o ip 192.168.3.248 para 192.168.0.231

Usando a expressão regular podemos resolver isso mais rapidamente.

SQL> select cod,regexp_replace(NOMDEST,'3\.248','0.231') NOMDEST from bkp_dest where regexp_like(NOMDEST,'3\.248');

       COD NOMDEST
---------- --------------------------------------------------
         4 //192.168.0.231/micro/logico
         5 //192.168.0.231/micro/arch
         6 //192.168.0.231/micro/fisico
        19 //192.168.0.231/micro2/logico
        20 //192.168.0.231/micro2/arch
        21 //192.168.0.231/micro2/fisico

Vou aproveitar que já compreendi como será a minha expressão regular para alterar os registros para  atualizar os campos que preciso:

SQL> update bkp_dest set NOMDEST = regexp_replace(NOMDEST,'3\.248','0.231') where regexp_like(NOMDEST,'3\.248');

6 rows updated.

E com isso agora tenho somente 6 linhas atualizadas com os valores de ips corretos sem que eu precise ficar atualizando registro por registro com o novo endereço.

SQL> select * from bkp_dest;

       COD NOMDEST
---------- --------------------------------------------------
         1 /orabackup/dbprod/logico
         2 /orabackup/dbprod/fisico
         3 /orabackup/dbprod/arch
         4 //192.168.0.231/micro/logico
         5 //192.168.0.231/micro/arch
         6 //192.168.0.231/micro/fisico
         7 //192.168.2.248/micro/logico
         8 //192.168.2.248/micro/arch
         9 //192.168.2.248/micro/fisico
        10 //192.168.5.248/micro/logico
        11 //192.168.5.248/micro/arch
        12 //192.168.5.248/micro/fisico
        13 //192.168.3.249/micro/logico
        14 //192.168.3.249/micro/arch
        15 //192.168.3.249/micro/fisico
        16 //192.168.3.251/micro/logico
        17 //192.168.3.251/micro/arch
        18 //192.168.3.2451/micro/fisico
        19 //192.168.0.231/micro2/logico
        20 //192.168.0.231/micro2/arch
        21 //192.168.0.231/micro2/fisico
%name Usando expressão regular regexp replace, oracle 10g ou superior

Autor: Rafael Stoever

Bacharel em Sistema de Informação pela Uniasselvi, atualmente cursando Gerenciamento de Projetos em TI pela Pós Graduação Uniasselvi. Atuo como Analista de suporte a banco de dados – DBA pela Lumina Serviços em TI residente de Blumenau/ SC, OPN Certified Specialist, Certificado OCP 10g/11g/12c, OCE RAC10g e Linux 10g. Conhecimentos em Microsoft SqlSever, Mysql e programação web (php,asp).