搜索并替换oracle数据库中所有db对象源代码中的字符串

时间:2011-04-19 09:49:38

标签: oracle

我想在所有正在使用它的数据库对象中搜索并替换DZONE到SZONE。我有一个查询,使用下面的查询搜索DZONE但不知道如何替换代码。

select name,text from user_source where text like '%DZONE';

4 个答案:

答案 0 :(得分:4)

首先获取ddl并将其假脱机到文本文件中供您查看:

select regexp_replace (dbms_metadata.get_ddl (object_type, object_name, USER),'DZONE','SZONE') 
from (
select distinct object_name, object_type
 from user_procedures where object_name in (select name from user_source where text like '%DZONE%')
)

将源应用于数据库。 为您要修改的对象类型执行此操作,在此示例中,我只选择了存储过程,包和函数。 我希望它有所帮助。

答案 1 :(得分:3)

您无法直接更新对象的来源。您需要识别所有对象并使用修改后的文本重新创建它们 - 或者使用最初用于创建它们的DDL的更新版本,或者如果您没有,则通过提取全文,更新它,然后执行它。你可以用动态SQL做到这一点,但这似乎有点危险 - 我个人可能想要检查并验证我正在更新的所有内容。

答案 2 :(得分:0)

我最近需要创建这样的脚本。这是为了替换所有数据库中的错误unicode字符,所以我开始搜索all all around:

--text with encoding problems

SET SERVEROUTPUT ON SIZE 100000

DECLARE
 CURSOR c1 IS
 SELECT owner, table_name, column_name
              FROM all_tab_columns
              WHERE owner = 'your-owner-name' and data_type LIKE '%CHAR%';
 --
 c1rec c1%ROWTYPE;
 --
 l_sql VARCHAR2(1000);
BEGIN
 FOR r1 IN c1 LOOP
    l_sql := 'DECLARE '||
             '   CURSOR c1 IS '||
             '   SELECT '||r1.column_name||
             '   FROM   '||r1.table_name||' WHERE '||r1.column_name||' like ''%Ã%''; '||
             '   c1rec c1%ROWTYPE; '||
             'BEGIN '||
             '   FOR r1 IN c1 LOOP '||
             '      dbms_output.put_line('''||r1.table_name||'.'||r1.column_name||': ''|| r1.'||r1.column_name||'); '||
             '   END LOOP; '||
             'END; ';

    EXECUTE IMMEDIATE l_sql;
 END LOOP;
END;
/

将打印所有单词问题(根据需要修改所有者或数据类型)

好的,但之后,您需要修复数据库(替换)。嗯,这对于oracle pl / sql来说更有趣

--generating updates with encoding problems

SET SERVEROUTPUT ON SIZE 100000

DECLARE
 CURSOR c1 IS
 SELECT owner, table_name, column_name
              FROM all_tab_columns
              WHERE owner = 'your-owner-name' and data_type LIKE '%CHAR%';
 --
 c1rec c1%ROWTYPE;
 --
 l_sql VARCHAR2(1000);
BEGIN
 FOR r1 IN c1 LOOP
    l_sql := 'DECLARE '||
             '   CURSOR c1 IS '||
             '   SELECT '||r1.column_name||
             '   FROM   '||r1.table_name||' WHERE '||r1.column_name||' like ''%Ã%''; '||
             '   c1rec c1%ROWTYPE; '||
             'BEGIN '||
             '   FOR r1 IN c1 LOOP '||
             '      dbms_output.put_line(''UPDATE '||r1.table_name||' SET '||r1.column_name||' = ''''''|| r1.'||r1.column_name||'||'''''' WHERE '||r1.column_name||' = ''''''|| r1.'||r1.column_name||'||'''''';''); '||
             '   END LOOP; '||
             'END; ';

    --dbms_output.put_line( l_sql );

    EXECUTE IMMEDIATE l_sql;
 END LOOP;
END;
/

将输出一系列更新命令,您应该使用修复程序进行调整。

UPDATE PERSON SET NAME = 'ÿângela' WHERE NAME = 'ÿângela';
UPDATE ROOM SET DESCRIPCION = 'Sala de reparacÿn' WHERE DESCRIPCION = 'Sala de reparacÿn';
...

类似的东西:

UPDATE PERSON SET NAME = 'Ángela' WHERE NAME = 'ÿângela';
UPDATE ROOM SET DESCRIPCION = 'Sala de reparación' WHERE DESCRIPCION = 'Sala de reparacÿn';
...

根据问题,您可以自动执行此部分(如果您设法处理报价地狱)

提示:这是一个带有替换

的更新
SET SERVEROUTPUT ON SIZE 100000

DECLARE
 CURSOR c1 IS
 SELECT owner, table_name, column_name
              FROM all_tab_columns
              WHERE owner = 'your-owner-name' and data_type LIKE '%CHAR%';
              --uncomment to shorten the search and debug
              --AND table_name = 'some-table'
 --
 c1rec c1%ROWTYPE;
 --
 l_sql VARCHAR2(1000);
BEGIN
 FOR r1 IN c1 LOOP
    l_sql := 'DECLARE '||
             '   CURSOR c1 IS '||
             '   SELECT '||r1.column_name||
             '   FROM   '||r1.table_name||' WHERE '||r1.column_name||' like ''%ÿ%''; '||
             '   c1rec c1%ROWTYPE; '||
             'BEGIN '||
             '   FOR r1 IN c1 LOOP '||
             '      dbms_output.put_line(''UPDATE '||r1.table_name||' SET '||r1.column_name||' = REPLACE('||r1.column_name||',''''%ÿ%'''',''''ó'''')''||'' WHERE '||r1.column_name||' = ''''''|| r1.'||r1.column_name||'||'''''';''); '||
             '   END LOOP; '||
             'END; ';

    --uncomment to debug         
    --dbms_output.put_line( l_sql );

    EXECUTE IMMEDIATE l_sql;
 END LOOP;
END;
/

输出类似于:

UPDATE VEHICLE SET NAME = REPLACE(NAME,'%ÿ%','ó') WHERE NAME = 'Camiÿn';

答案 3 :(得分:-4)

将更新查询与where子句

一起使用
Update user_source 
Set text = 'SZONE'
Where text like '%DZONE';

希望有所帮助