Rai*_*lla 3 oracle stored-procedures oracle-10g
由于本周末将完成的迁移,我需要更改数据库中大约 300 个过程和包。我们将从一台服务器迁移到 Exadata。
然而,数据库的开发方式非常草率。银行执行了一些直接写入磁盘的文本文件,但没有人使用目录。在 Exadata 中,由于使用了 DBFS,写入文件的路径会有所不同,为此我必须通过 UTL_FILE 更改所有调用。
让我举个例子:目前的代码是这样的:
file: utl_file.fopen = ('/file/folder/documents', filename, 'W');
Run Code Online (Sandbox Code Playgroud)
我想做什么:创建一个目录
create or replace directory directory_name as '/file/folder/documents';
Run Code Online (Sandbox Code Playgroud)
更改 300 程序:
file: = utl_file.fopen ('directory_name', filename, 'W');
Run Code Online (Sandbox Code Playgroud)
在迁移期间只更改目录:
create or replace directory directory_name as '/dbfs/documents';
Run Code Online (Sandbox Code Playgroud)
真正的问题:有没有一种方法可以搜索并替换一次更改数据库中的所有 300 个程序?我的意思是,有一种方法可以将所有 '/file/folder/documents' 更改为 directory_name 吗?
如果您将过程脚本化到文件中,则搜索/替换可以简单地使用 sed 脚本沿着以下几行
s/\/file\/folder\/documents/directory_name/g
Run Code Online (Sandbox Code Playgroud)
(注意没有经过测试,就在我的头顶上,但你可以摆弄它)。
然后您可以重新加载存储过程。请注意,如果您正在使用代码库,您应该真正测试您在做什么,而不是对生产代码进行盲目搜索/替换。什么可能出错?
我可能会做类似的事情
DBMS_METADATA.GET_DDL以获取 CLOB 中每个对象的 DDL。EXECUTE IMMEDIATE执行新修改的CLOB。像这样的东西可以search_and_replace实现你需要的任何逻辑
DECLARE
l_ddl CLOB;
BEGIN
FOR x IN (SELECT * FROM dba_objects WHERE <<objects you want to change>>)
LOOP
l_ddl := dbms_metadata.get_ddl( x.object_type,
x.object_name,
x.owner );
search_and_replace( l_ddl,
'/file/folder/documents',
'DIRECTORY_NAME' );
EXECUTE IMMEDIATE l_ddl;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)