我们有一个Oracle数据库,我们正在使用PL/SQL Developer进行编辑。有一个旧的JavaScript函数已经在不同的程序中使用过数千次。我们需要替换该函数的名称。有没有办法在PL/SQL Developer 找到并替换这个词在所有程序中出现,并且像其他文本编辑器或IDE(Netbeans,Visual Studio,Eclipse,Android Studio)一样出现?在PL/SQL Developer中查找文本的出现并替换为新单词?
1
A
回答
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变量声明发表评论吧。
祝你好运。
相关问题
- 1. 查找并替换文本文件输出中的单词
- 2. 查找并替换文本文件目录中的单词
- 3. 查找单词并用文件中的单词替换
- 4. 查找并替换文本,单词翻译
- 5. Excel - 查找并替换多个单词
- 6. C#单词自动查找并替换长文本字段
- 7. 在Linux中查找并替换文本
- 8. 在excel中查找并替换文本
- 9. 在python中查找并替换文本
- 10. 查找多个文件中的下一个单词并替换
- 11. 使用Java查找并替换多个文本文件中的单词?
- 12. 如何从MySQL数据库中查找并替换文本中的单词?
- 13. 使用批处理脚本查找并替换文件中的多个单词
- 14. C#Word Interop - “查找并替换”查找单词但不替换它
- 15. 在Emacs中查找并替换整个单词(不是子串)
- 16. 如何在java中一次查找并替换一个单词?
- 17. jQuery:在textarea段落中查找单词并用单词替换它
- 18. 查找并替换文本等文字
- 19. 替换第n次出现的单词
- 20. JavaScript - 查找并替换数组中的单词
- 21. 使用Python查找并替换单词中的脚注
- 22. 查找并替换XML字符串中的单词
- 23. 查找并替换字符串中的单词
- 24. 我想查找并替换单词中的有序列表。到)
- 25. VBA Excel查找范围中的单词并替换
- 26. 替换文本中的单词
- 27. 在记事本中查找并替换为大文件++
- 28. 在记事本中查找并替换++
- 29. 无法在Python中使用字典查找和替换文本中的单词
- 30. 根据文本文件的名称查找并替换文本文件中的单词
你想在哪里取代它?在存储过程和包的PL/SQL源代码中? – Codo
是的,在存储过程和包的PL/SQL源代码中。 – mismanc
您可以像这样搜索所有匹配项:'SELECT * FROM ALL_SOURCE WHERE TEXT LIKE'%function_name%''。 – Codo