如何重命名Oracle中的多个存储过程
How to rename multiple stored procedures in Oracle
我正在使用Oracle 12C,现在遇到以下问题:
我有多个存储过程,例如:
schema.TEST1, schema.TEST2, schema.TEST3....
现在,我想将它们全部重命名为schema.TEST01
、schema.TEST02
、schema.TEST03
...或任何我想要的名称,之前已格式化,这是为了备份。
在 Oracle 中,我无法使用 ALTER
语句重命名存储过程,例如 SQL。如何一键完成?
谢谢!
备份?那是相当糟糕选择的备份系统。
- 如果数据库 由于磁盘故障而死亡 怎么办?你会失去一切(包括你的“备份”程序)
- 您打算保留多少个“备份”?例如,我的一个模式包含 643 procedures/functions/packages。有了两个备份,我已经接近 2K 个对象了。如果您定期(例如每天)执行备份,在短短一个月内,我将接近 20K 个对象。我真的不想那样做
因此,您为什么不考虑其他事情呢?例如,
- 版本控制系统(如Git)
- 执行数据泵导出作为“逻辑”备份
- 让 DBA 负责 RMAN 备份
- 如果您想手动执行,一些 GUI 工具(例如 TOAD)可以让您 select all 和 create script - 该选项将源代码作为文件存储在硬盘驱动器上,然后您可以将这些文件备份到其他地方(将它们刻录到 DVD 上,复制到 USB 记忆棒,另一个硬盘驱动器,网络中的某个地方...... )
最后,回答您的问题:如何单击完成您的要求?据我所知,你不能。您首先必须编写一个可以完成这项工作的程序,但随后您又回到了我对您的方法的第二个反对意见。该程序如何知道 proc1
是“原始版本”,而 proc01
是备份版本?为什么有人最初不将他们的程序命名为 proc05
?这是一个有效的名称。
根据您的架构和命名约定进行更改。
但这是废话,你不需要那样备份。
但我把它当作一个挑战,并想向您展示下面的代码
如果源文本足够大,请使用 CLOB。
DECLARE
type names_table is table of VARCHAR2(50);
names names_table;
TYPE source_txt_table is TABLE OF VARCHAR2(32767);
source_txt source_txt_table;
header VARCHAR2(32767);
final_sourc_txt VARCHAR2(32767);
BEGIN
SELECT OBJECT_NAME bulk COLLECT into names from user_procedures WHERE object_type = 'PROCEDURE' AND OBJECT_NAME IN ('DO_SOMETHING_1','DO_SOMETHING_2');
FOR i in 1..names.LAST
LOOP
SELECT text bulk COLLECT into source_txt
FROM all_source
WHERE name = names(i)
ORDER BY line;
source_txt(1) := 'CREATE OR REPLACE '||source_txt(1);
header := REGEXP_REPLACE(upper(source_txt(1)), names(i), 'HR.'||names(i)||'_bck'); --make changes according to new naming convention
source_txt(1) := header;
FOR j in 1..source_txt.LAST
LOOP
final_sourc_txt := final_sourc_txt||source_txt(j);
END LOOP;
EXECUTE IMMEDIATE final_sourc_txt;
dbms_output.put_line('Success: '|| names(i));
final_sourc_txt := NULL;
header := NULL;
source_txt := NULL;
END LOOP;
END;
您也可以尝试使用 DBMS_METADATA PACKAGE 来导出架构对象的 DDL。
我写了一个例子,大家可以根据自己的需要修改后使用
CREATE DIRECTORY EXTERNAL AS '/external/';
DECLARE
h PLS_INTEGER;
th PLS_INTEGER;
fh utl_file.file_type;
ddls CLOB;
SYSD VARCHAR2(50);
BEGIN
h := dbms_metadata.open('PROCEDURE');
DBMS_METADATA.set_filter(h, 'SCHEMA','HR');
th := DBMS_METADATA.ADD_TRANSFORM (h, 'DDL');
DBMS_METADATA.SET_COUNT(h, 50);
ddls := dbms_metadata.fetch_clob(h);
SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHHMISS') INTO SYSD FROM dual;
fh := utl_file.fopen('EXTERNAL', 'SCHEMA_BCK_'||SYSD||'.bck', 'w');
utl_file.put(fh, ddls);
UTL_FILE.FCLOSE(fh);
DBMS_METADATA.CLOSE(h);
END;
防止数据库故障要安全得多,您不会不必要地用备份对象填充数据库模式。
我正在使用Oracle 12C,现在遇到以下问题:
我有多个存储过程,例如:
schema.TEST1, schema.TEST2, schema.TEST3....
现在,我想将它们全部重命名为schema.TEST01
、schema.TEST02
、schema.TEST03
...或任何我想要的名称,之前已格式化,这是为了备份。
在 Oracle 中,我无法使用 ALTER
语句重命名存储过程,例如 SQL。如何一键完成?
谢谢!
备份?那是相当糟糕选择的备份系统。
- 如果数据库 由于磁盘故障而死亡 怎么办?你会失去一切(包括你的“备份”程序)
- 您打算保留多少个“备份”?例如,我的一个模式包含 643 procedures/functions/packages。有了两个备份,我已经接近 2K 个对象了。如果您定期(例如每天)执行备份,在短短一个月内,我将接近 20K 个对象。我真的不想那样做
因此,您为什么不考虑其他事情呢?例如,
- 版本控制系统(如Git)
- 执行数据泵导出作为“逻辑”备份
- 让 DBA 负责 RMAN 备份
- 如果您想手动执行,一些 GUI 工具(例如 TOAD)可以让您 select all 和 create script - 该选项将源代码作为文件存储在硬盘驱动器上,然后您可以将这些文件备份到其他地方(将它们刻录到 DVD 上,复制到 USB 记忆棒,另一个硬盘驱动器,网络中的某个地方...... )
最后,回答您的问题:如何单击完成您的要求?据我所知,你不能。您首先必须编写一个可以完成这项工作的程序,但随后您又回到了我对您的方法的第二个反对意见。该程序如何知道 proc1
是“原始版本”,而 proc01
是备份版本?为什么有人最初不将他们的程序命名为 proc05
?这是一个有效的名称。
根据您的架构和命名约定进行更改。 但这是废话,你不需要那样备份。 但我把它当作一个挑战,并想向您展示下面的代码
如果源文本足够大,请使用 CLOB。
DECLARE
type names_table is table of VARCHAR2(50);
names names_table;
TYPE source_txt_table is TABLE OF VARCHAR2(32767);
source_txt source_txt_table;
header VARCHAR2(32767);
final_sourc_txt VARCHAR2(32767);
BEGIN
SELECT OBJECT_NAME bulk COLLECT into names from user_procedures WHERE object_type = 'PROCEDURE' AND OBJECT_NAME IN ('DO_SOMETHING_1','DO_SOMETHING_2');
FOR i in 1..names.LAST
LOOP
SELECT text bulk COLLECT into source_txt
FROM all_source
WHERE name = names(i)
ORDER BY line;
source_txt(1) := 'CREATE OR REPLACE '||source_txt(1);
header := REGEXP_REPLACE(upper(source_txt(1)), names(i), 'HR.'||names(i)||'_bck'); --make changes according to new naming convention
source_txt(1) := header;
FOR j in 1..source_txt.LAST
LOOP
final_sourc_txt := final_sourc_txt||source_txt(j);
END LOOP;
EXECUTE IMMEDIATE final_sourc_txt;
dbms_output.put_line('Success: '|| names(i));
final_sourc_txt := NULL;
header := NULL;
source_txt := NULL;
END LOOP;
END;
您也可以尝试使用 DBMS_METADATA PACKAGE 来导出架构对象的 DDL。 我写了一个例子,大家可以根据自己的需要修改后使用
CREATE DIRECTORY EXTERNAL AS '/external/';
DECLARE
h PLS_INTEGER;
th PLS_INTEGER;
fh utl_file.file_type;
ddls CLOB;
SYSD VARCHAR2(50);
BEGIN
h := dbms_metadata.open('PROCEDURE');
DBMS_METADATA.set_filter(h, 'SCHEMA','HR');
th := DBMS_METADATA.ADD_TRANSFORM (h, 'DDL');
DBMS_METADATA.SET_COUNT(h, 50);
ddls := dbms_metadata.fetch_clob(h);
SELECT TO_CHAR(SYSDATE, 'YYYYMMDDHHMISS') INTO SYSD FROM dual;
fh := utl_file.fopen('EXTERNAL', 'SCHEMA_BCK_'||SYSD||'.bck', 'w');
utl_file.put(fh, ddls);
UTL_FILE.FCLOSE(fh);
DBMS_METADATA.CLOSE(h);
END;
防止数据库故障要安全得多,您不会不必要地用备份对象填充数据库模式。