2016-11-28 2 views
1

Wir haben eine Oracle-Datenbank und wir verwenden PL/SQL Developer für den Editor. Es gibt eine alte JavaScript-Funktion, die tausende Male in verschiedenen Prozeduren verwendet wurde. Wir müssen den Namen dieser Funktion ersetzen. Gibt es einen Weg in PL/SQL Developer zu finden und zu ersetzen das Wort in allen Prozeduren und alle Vorkommen wie andere Texteditoren oder IDEs (Netbeans, Visual Studio, Eclipse, Android Studio) tun?Finden Sie Vorkommen eines Textes und ersetzen Sie sie durch ein neues Wort in PL/SQL Developer?

+0

Wo möchten Sie es ersetzen? Im PL/SQL-Quelltext gespeicherter Prozeduren und Pakete? – Codo

+0

Ja, im PL/SQL-Quellcode von gespeicherten Prozeduren und Paketen. – mismanc

+0

Sie können nach allen Vorkommen wie diesem suchen: 'SELECT * FROM ALL_SOURCE WHERE TEXT LIKE '% Funktionsname%''. – Codo

Antwort

1

Ich habe versucht, einen Code für Ihren Zweck zu schreiben, hoffe, es hilft !!

Zuerst müssen Sie eine Tabelle, die Ergebnisse speichern:

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

nun die Funktion, dies zu tun:

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; 
/

Jetzt begehen und abfragen, um die NEW_SOURCES Tabelle, die geänderte Quellen gibt, können Sie Speichern Sie es in einer .SQL-Datei und führen Sie es in pl/SQL-Entwickler.

Sie eine Sicherung auf dem ersten

Denken Sie daran, Sie Fehler in laufenden endgültige Skript bei ‚erstellen oder ersetzen‘ -Klausel, wenn ja, dann es in v_gap Variablendeklaration Kommentar bekommen können.

Viel Glück.

+0

Ich werde versuchen, morgen, danke – mismanc

+0

Unser Problem Umfang wird breiter, so dass wir beschließen, String eins nach dem anderen Dank zu ersetzen – mismanc

Verwandte Themen