2016-11-28 80 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