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

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).