2016-11-28 5 views
1

У нас есть база данных Oracle, и мы используем PL/SQL Developer для редактора. Существует старая функция javascript, которая использовалась тысячи раз в разных процедурах. Нам нужно заменить имя этой функции. Есть ли способ в PL/SQL Developer найти и заменить слово во всех процедурах и все вхождения, такие как другие текстовые редакторы или IDE (Netbeans, Visual Studio, Eclipse, Android Studio)?Найти вхождения текста и заменить их новым словом в PL/SQL Developer?

+0

Где вы хотите его заменить? В исходном коде PL/SQL хранимых процедур и пакетов? – Codo

+0

Да, в исходном коде PL/SQL хранимых процедур и пакетов. – mismanc

+0

Вы можете искать все такие вхождения: 'SELECT * FROM ALL_SOURCE WHERE TEXT LIKE '% function_name%''. – Codo

ответ

1

Я попытался написать код для вашей цели, надеюсь, что это поможет!

Сначала вам нужна таблица для хранения результатов:

CREATE TABLE NEW_SOURCES 
(
    OLD_NAME  VARCHAR2 (256 BYTE), 
    NEW_NAME  VARCHAR2 (256 BYTE), 
    SOURCE  CLOB, 
    CHANGE_DATE DATE 
); 

Теперь функцию, чтобы сделать это:

CREATE OR REPLACE FUNCTION GENERATE_REFACTOR (
               P_OLD_NAME IN VARCHAR2, 
               P_NEW_NAME IN VARCHAR2 
              ) 
    RETURN NUMBER --Returns number of objects if success and -1 otherwise 
IS 
    CURSOR CUR_OBJ (
     P_NAME IN VARCHAR2) 
    IS 
     SELECT NAME, TYPE, OWNER 
      FROM ALL_DEPENDENCIES 
     WHERE  REFERENCED_NAME = P_NAME 
       AND TYPE IN ('PACKAGE', 'PACKAGE BODY', 'FUNCTION', 'PROCEDURE')--Specify your object type here 
     ORDER BY 3, 2, 1; 

    CURSOR CUR_SRC (
        P_NAME IN VARCHAR2, 
        P_TYPE IN VARCHAR2, 
        P_OWNER IN VARCHAR2 
       ) 
    IS 
     SELECT * 
      FROM ALL_SOURCE 
     WHERE NAME = P_NAME AND TYPE = P_TYPE AND OWNER = P_OWNER 
     ORDER BY LINE; 

    V_OLD_FUNCTION_NAME VARCHAR2 (256); 
    V_NEW_FUNCTION_NAME VARCHAR2 (256); 
    C_SOURCE    CLOB; 
    V_BUFFER    VARCHAR2 (4000); 
    V_MODIFIED_LINE  VARCHAR2 (4000); 
    V_COUNT    NUMBER; 
    V_GAP     VARCHAR2 (512) 
     := CHR (10) 
     || '---------------------' 
     || CHR (10) 
     || 'CREATE OR REPLACE '; -- You can add your own comment header here 
PROCEDURE APPEND_TEXT (
         V_CLOB  IN OUT NOCOPY CLOB, 
         V_BUFFER IN OUT NOCOPY VARCHAR2, 
         V_TEXT     VARCHAR2 
         ) 
--Can Append Text to CLOB in optimized way 
--Useful in adding a lot of records one by one to a clob 
--Notice: have to provide a big varchar2 buffer and clean it afterwards 
IS 
BEGIN 
    V_BUFFER := V_BUFFER || V_TEXT; 
EXCEPTION 
    WHEN VALUE_ERROR 
    THEN 
     IF V_CLOB IS NULL 
     THEN 
     V_CLOB := V_BUFFER; 
     ELSE 
     DBMS_LOB.APPEND (V_CLOB, V_BUFFER); 
     V_BUFFER := V_TEXT; 
     END IF; 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.PUT_LINE ('Exc: ' || SQLERRM); 
END; 
BEGIN 
    V_OLD_FUNCTION_NAME := P_OLD_NAME; 
    V_NEW_FUNCTION_NAME := P_NEW_NAME; 

    --If you wanna gather sources all in a single clob use these two lines and if you want them each one in a single clob comment them 
    DBMS_LOB.CREATETEMPORARY (C_SOURCE, FALSE, 1000); 
    V_BUFFER := NULL; 

    FOR OBJ IN CUR_OBJ (V_OLD_FUNCTION_NAME) 
    LOOP 
     --If you wanna gather sources all in a single clob comment these two lines and if you want them each one in a single clob uncomment them 
     --DBMS_LOB.CREATETEMPORARY (C_SOURCE, FALSE, 1000); 
     --V_BUFFER := NULL; 
     V_BUFFER := V_BUFFER || V_GAP; 

     FOR LINE IN CUR_SRC (OBJ.NAME, OBJ.TYPE, OBJ.OWNER) 
     LOOP 
     IF LINE.TEXT LIKE '%' || V_OLD_FUNCTION_NAME || '%' 
     THEN 
      SELECT REPLACE (
          LINE.TEXT, 
          V_OLD_FUNCTION_NAME, 
          V_NEW_FUNCTION_NAME 
          ) 
       INTO V_MODIFIED_LINE 
       FROM DUAL; 

      APPEND_TEXT (C_SOURCE, V_BUFFER, V_MODIFIED_LINE); 
     ELSE 
      APPEND_TEXT (C_SOURCE, V_BUFFER, LINE.TEXT); 
     END IF; 
     END LOOP; 

     --If you wanna gather sources all in a single clob comment these two lines and if you want them each one in a single clob uncomment them 
     --DBMS_LOB.APPEND (C_SOURCE, V_BUFFER); 
     -- INSERT INTO NEW_SOURCES VALUES (OBJ.OWNER||'.'||OBJ.NAME, OBJ.TYPE, C_SOURCE, SYSDATE); 

     V_COUNT := V_COUNT + 1; 
    END LOOP; 

    --If you wanna gather sources all in a single clob use these two lines and if you want them each one in a single clob comment them 
    DBMS_LOB.APPEND (C_SOURCE, V_BUFFER); 

    INSERT INTO NEW_SOURCES VALUES (V_OLD_FUNCTION_NAME, V_NEW_FUNCTION_NAME, C_SOURCE, SYSDATE); 

    RETURN V_COUNT; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.PUT_LINE ('Exc: ' || SQLERRM); 
     RETURN -1; 
END; 
/

Теперь фиксации и запросить таблицу NEW_SOURCES, ваши модифицированные источники есть, вы можете сохраните его в файле .sql и запустите его в разработчике pl/sql.

Возьмите резервную копию на первой

Имейте в виду, вы можете получить ошибки в управлении окончательный сценарий в случае «создать или заменить» пункта, если да, то комментировать его в v_gap объявлении переменной.

Удачи.

+0

Я постараюсь завтра, спасибо – mismanc

+0

Наш масштаб проблемы расширяется, поэтому мы решаем заменить строку по одному, спасибо – mismanc