如何在Oracle中重命名多个存储过程



我正在使用Oracle 12C,现在我遇到了以下问题:

我有多个存储过程,如:

schema.TEST1, schema.TEST2, schema.TEST3....

现在,我想将它们全部重命名为schema.TEST01schema.TEST02schema.TEST03。。。或者我想要的任何以前格式化过的名称,这是为了备份。

在Oracle中,我不能像SQL那样使用ALTER语句重命名存储过程。如何一键完成此操作?

谢谢!

根据您的模式和命名约定进行更改。但这是无稽之谈,你不需要以这种方式备份。但我认为这是一个挑战,我想向你展示以下代码

如果源文本足够大,请使用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;

要备份吗?这是一个糟糕的备份系统。

  • 如果数据库因磁盘故障而死亡怎么办?你会失去一切(包括你的"备份"程序(
  • 多少";备份";你打算留下来吗?例如,我的一个模式包含643个过程/函数/包。有了两个备份,我已经接近2K对象了。如果您定期(例如每天(执行备份,在短短一个月内,我将接近2万个对象。我真的不想那样做

所以,你为什么不考虑其他事情呢?例如,

  • 版本控制系统(如Git(
  • 执行数据泵导出作为";逻辑";备份
    • 让DBA负责RMAN备份
  • 如果你想手动执行,一些GUI工具(如TOAD(可以让你选择所有创建脚本-该选项将源代码存储为硬盘驱动器上的文件,然后你可以将这些文件备份到其他地方(将它们刻录在DVD上,复制到USB记忆棒、另一个硬盘驱动器、网络中的某个地方…(

最后,回答您的问题:如何在一次点击中完成您要求的?据我所知,你不能。你首先必须写一个能完成这项工作的程序,但后来你又回到了我对你的方法的第二个反对意见。该过程将如何知道CCD_;"原始";,而proc01是备份版本?为什么没有人一开始就把他们的程序命名为proc05?这是一个有效的名字。

您还可以尝试使用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;

它对数据库故障要安全得多,而且不会不必要地用备份对象填充数据库模式。

最新更新