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






