2016-11-28 10 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変数宣言でそれをコメントする場合は、「CREATE OR REPLACE」節の場合には、最終的なスクリプトを実行中にエラーが発生することに注意してくださいまず

でバックアップを取ります。

幸運。

+0

私は明日お試しになります。 – mismanc

+0

私たちの問題の範囲は広くなりました。 – mismanc

関連する問題