искать и заменять строку во всех исходных кодах объектов БД в базе данных Oracle - PullRequest
1 голос
/ 19 апреля 2011

Я хотел найти и заменить DZONE на SZONE во всех объектах базы данных, где он используется. У меня есть запрос для поиска DZONE, используя запрос ниже, но я не знаю, как заменить в коде.

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

Ответы [ 4 ]

4 голосов
/ 19 апреля 2011

сначала получите 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%')
)

, а затем примените источник к своей базе данных.сделать это для типов объектов, которые вы хотите изменить, в этом примере я выбрал только хранимые процедуры, пакеты и функции.Надеюсь, это поможет.

3 голосов
/ 19 апреля 2011

Вы не можете напрямую обновлять источник объекта.Вам необходимо идентифицировать все объекты и воссоздать их с измененным текстом - либо с обновленной версией того, что использовалось DDL для их создания, либо, если у вас его нет, извлекая полный текст, обновляя егои затем выполнить его.Возможно, вы могли бы сделать это с помощью динамического SQL, но это кажется немного опасным - лично я, вероятно, хотел бы проверить и проверить все, что я обновлял.

0 голосов
/ 23 мая 2017

Мне недавно нужно было создать такой скрипт. Это должно заменить неправильные символы Юникода во всей базе данных, поэтому я начинаю искать М вокруг:

--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';
0 голосов
/ 19 апреля 2011

Использовать запрос на обновление с предложением where

Update user_source 
Set text = 'SZONE'
Where text like '%DZONE';

надеется, что поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...