Dividindo uma string usando regexp_substr 

Olá amigos,

Neste post vou falar sobre separação (Split) de uma variável SQL (Oracle) em mais de uma parte.

Diante de um problema, onde todos os arquivos estavam em uma mesma pasta(fisicamente) no servidor, tínhamos a necessidade de identificar e separar estes arquivos por módulo do sistema. Mas como?

No sistema, tínhamos armazenado o nome destes arquivos, por módulos e em tabelas diversas.

O desafio surgiu, porque havia mais de 20.000 (vinte mil) arquivos na pasta, misturados com arquivos temporais e com arquivos que não podíamos perder.

E se o servidor fosse reiniciado, tudo se perderia, pois estavam armazenados em uma pasta temporária.

Então, cheguei a uma solução de criar um script (comand) para executarmos no linux e fazer a separação dos arquivos.

Para explicar melhor, havia a seguinte situação:

Nome do armazenamento de arquivos, mesclado com o nome do módulo, com o nome do arquivo fisicamente e nome do arquivo original.

servidor-stogare://MODULO.c0206646-08dfs-4174-9c17-b88ddfs/3l8apU-5e275ed5-Aarquivo 20940093.pdf?nomereal 20940093.pdf

Precisávamos separar o nome do arquivo.

Com comando abaixo, obtive apenas o nome do arquivo.

select
ds_arquivo,
‘cp “‘ ||REGEXP_SUBSTR(replace(ds_arquivo, ‘servidor-stogare://MODULO.csss6646ss-8dfs-4174-9c17-b88ddfs/’,”), ‘[^?]+’, 1, 1) || ‘” pasta-backup’
from tabela_banco_dados

 

Resultado:

3l8apU-5e275ed5-Aarquivo 20940093.pdf

 

Então, concatenei com o comando de copia de arquivos do linux (CentOS) + nome do arquivo + nome do diretório de destino, para a copia e backup dos arquivos.

cp “3l8apU-5e275ed5-Aarquivo 20940093.pdf” pasta-backup

A partir deste exemplo, gerei uma lista (txt) de todos os arquivos anexados ao módulo do sistema, e executamos no servidor para os copiar para uma nova pasta.