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

How to rename multiple stored procedures in Oracle

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

我有多个存储过程,例如:

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

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

在 Oracle 中,我无法使用 ALTER 语句重命名存储过程,例如 SQL。如何一键完成?

谢谢!

备份?那是相当糟糕选择的备份系统。

  • 如果数据库 由于磁盘故障而死亡 怎么办?你会失去一切(包括你的“备份”程序)
  • 您打算保留多少个“备份”?例如,我的一个模式包含 643 procedures/functions/packages。有了两个备份,我已经接近 2K 个对象了。如果您定期(例如每天)执行备份,在短短一个月内,我将接近 20K 个对象。我真的不想那样做

因此,您为什么不考虑其他事情呢?例如,

  • 版本控制系统(如Git)
  • 执行数据泵导出作为“逻辑”备份
    • 让 DBA 负责 RMAN 备份
  • 如果您想手动执行,一些 GUI 工具(例如 TOAD)可以让您 select allcreate 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;

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