由于将在本周末完成的迁移,我需要更改数据库中的大约 300 个过程和包。我们将从一台服务器迁移到 Exadata。
然而,数据库的开发方式非常草率。银行进行了一些直接写入磁盘的文本文件,但没有人使用目录。在 Exadata 中,由于使用了 DBFS,写入文件的路径会有所不同,为此我必须通过 UTL_FILE 更改所有调用。
我举个例子:目前代码是这样的:
file: utl_file.fopen = ('/file/folder/documents', filename, 'W');
我想做的:创建一个目录
create or replace directory directory_name as '/file/folder/documents';
将 300 程序更改为:
file: = utl_file.fopen ('directory_name', filename, 'W');
在迁移期间仅更改目录:
create or replace directory directory_name as '/dbfs/documents';
真正的问题:有没有一种方法可以让我一次搜索并替换更改数据库中的所有 300 个程序?我的意思是,有一种方法可以将所有“/file/folder/documents”更改为 directory_name?
如果您将程序编写到一个文件中,则搜索/替换可以通过 sed 脚本简单地完成,如下所示
(注意未经测试,就在我的脑海中,但你可以摆弄它)。
然后您可以重新加载存储过程。请注意,如果您正在使用代码库,您应该真正测试您在做什么,而不是对生产代码进行盲目搜索/替换。可能会出什么问题?
我可能会做类似的事情
DBMS_METADATA.GET_DDL
以获取 CLOB 中每个对象的 DDL。EXECUTE IMMEDIATE
执行新修改的 CLOB。像这样的东西可以
search_and_replace
实现你需要的任何逻辑