Мне недавно нужно было создать такой скрипт. Это должно заменить неправильные символы Юникода во всей базе данных, поэтому я начинаю искать М вокруг:
--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';