Preciso alterar cerca de 300 procedures e packages no banco de dados, devido a uma migração que realizarei neste final de semana. Faremos uma migração de um servidor para o Exadata.
No entanto, o banco de dados foi desenvolvido de maneira muito descuidada. O banco executa vários arquivos de texto gravados diretamente no disco, mas ninguém usa diretórios. No Exadata, o caminho para escrever os arquivos será diferente devido ao uso do DBFS, para isso devo alterar todas as chamadas via UTL_FILE.
Deixe-me dar um exemplo: Atualmente o código é este:
file: utl_file.fopen = ('/file/folder/documents', filename, 'W');
O que eu quero fazer: criar um diretório
create or replace directory directory_name as '/file/folder/documents';
Altere os 300 procedimentos para:
file: = utl_file.fopen ('directory_name', filename, 'W');
Durante a migração, altere apenas o diretório:
create or replace directory directory_name as '/dbfs/documents';
A verdadeira questão: Existe uma maneira de fazer uma pesquisa e substituir alterando todos os 300 procedimentos no banco de dados de uma vez? Quero dizer, existe uma maneira de alterar todos os '/file/folder/documents' para directory_name?
Se você criar um script dos procedimentos para um arquivo, a pesquisa/substituição pode ser trivialmente dome com um script sed ao longo das linhas de
(nota não testada, apenas de cabeça, mas você pode mexer nisso).
Em seguida, você pode recarregar os procedimentos armazenados. Observe que, se você está brincando com a base de código, deve realmente testar o que está fazendo, em vez de fazer uma pesquisa/substituição cega no código de produção. O que poderia dar errado?
Eu provavelmente faria algo como
DBMS_METADATA.GET_DDL
para obter o DDL para cada objeto em um CLOB.EXECUTE IMMEDIATE
para executar o CLOB recém-modificado.Algo assim onde
search_and_replace
implementa qualquer lógica que você precisa