怎么一次换三百个程序?

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 吗?

Con*_*lls 7

如果您将过程脚本化到文件中,则搜索/替换可以简单地使用 sed 脚本沿着以下几行

s/\/file\/folder\/documents/directory_name/g
Run Code Online (Sandbox Code Playgroud)

(注意没有经过测试,就在我的头顶上,但你可以摆弄它)。

然后您可以重新加载存储过程。请注意,如果您正在使用代码库,您应该真正测试您在做什么,而不是对生产代码进行盲目搜索/替换。什么可能出错?


Jus*_*ave 5

我可能会做类似的事情

  • 调用DBMS_METADATA.GET_DDL以获取 CLOB 中每个对象的 DDL。
  • 编写在该 CLOB 上进行搜索和替换的代码。
  • 使用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)