我想在所有正在使用它的数据库对象中搜索并替换DZONE到SZONE。我有一个查询,使用下面的查询搜索DZONE但不知道如何替换代码。
select name,text from user_source where text like '%DZONE';
答案 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';
希望有所帮助