如何从oracle数据库获取对象副本

如何从oracle数据库获取对象副本,oracle,oracle10g,oracle9i,release-management,oracleforms,Oracle,Oracle10g,Oracle9i,Release Management,Oracleforms,我计划发布我们的产品。我们正在使用Oracle表单开发我们的软件 所以我有两种类型的对象要释放 前端=>Oracle表单 后端=>Oracle数据库程序(过程、函数和包) 发布的一个重要部分是我们需要一个备份,这样如果发生任何事情,我们可以使用旧版本 顺便说一下,对于前端对象,我将使用一些批处理文件为我的前端对象创建备份,但是对于后端对象,我不知道如何自动获取函数、过程或包(规范和主体)的副本 你知道我怎么能自动完成吗?请告诉我。 我们正在使用oracle 10g&9i(对代码块表示歉意) 以下

我计划发布我们的产品。我们正在使用Oracle表单开发我们的软件

所以我有两种类型的对象要释放

  • 前端=>Oracle表单
  • 后端=>Oracle数据库程序(过程、函数和包)
  • 发布的一个重要部分是我们需要一个备份,这样如果发生任何事情,我们可以使用旧版本

    顺便说一下,对于前端对象,我将使用一些批处理文件为我的前端对象创建备份,但是对于后端对象,我不知道如何自动获取函数、过程或包(规范和主体)的副本

    你知道我怎么能自动完成吗?请告诉我。 我们正在使用oracle 10g&9i(对代码块表示歉意)

    以下是我用来处理类似问题的一些代码:

    PROCEDURE DUMP_CLOB(aCLOB        IN CLOB,
                        hOutput_file IN UTL_FILE.FILE_TYPE) IS
      nCLOB_length       NUMBER;
      nCLOB_offset       NUMBER := 1;
      nMax_chunk_size    NUMBER := 32767;
      strChunk           VARCHAR2(32767);
    BEGIN
      nCLOB_length := DBMS_LOB.GETLENGTH(aCLOB);
    
      WHILE nCLOB_offset <= nCLOB_length LOOP
        strChunk := DBMS_LOB.SUBSTR(aCLOB, nMax_chunk_size, nCLOB_offset);
    
        UTL_FILE.PUT(hOutput_file, strChunk);
    
        nCLOB_offset := nCLOB_offset + LENGTH(strChunk);
      END LOOP;
    
      UTL_FILE.PUT_LINE(hOutput_file, ';');
    END DUMP_CLOB;
    
    PROCEDURE DUMP_PRIVS(strOwner        IN  VARCHAR2,
                         strObject_name  IN  VARCHAR2,
                         hOutput_file    IN  UTL_FILE.FILE_TYPE) IS
    BEGIN
      FOR pRow IN (SELECT *
                     FROM DBA_TAB_PRIVS p
                     WHERE p.OWNER = strOwner AND
                           p.TABLE_NAME = strObject_name)
      LOOP
        UTL_FILE.PUT_LINE(hOutput_file, 'GRANT ' || pRow.PRIVILEGE || ' ON ' ||
                                        strOwner || '.' || strObject_name ||
                                        ' TO ' || pRow.GRANTEE || ';');
      END LOOP;
    END DUMP_PRIVS;
    
    PROCEDURE DUMP_OBJECT(strOwner        IN  VARCHAR2,
                          strObject_name  IN  VARCHAR2,
                          hOutput_file    IN  UTL_FILE.FILE_TYPE)
    IS
      clobDDL              CLOB;
      strCurr_object_name  VARCHAR2(100);
    BEGIN
      FOR rowObject IN (SELECT *
                          FROM SYS.DBA_OBJECTS o
                          WHERE o.OWNER = strOwner AND
                                o.OBJECT_NAME = strObject_name AND
                                o.OBJECT_TYPE <> 'TABLE PARTITION')
      LOOP
        strCurr_object_name := NVL(rowObject.SUBOBJECT_NAME, rowObject.OBJECT_NAME);
    
        UTL_FILE.PUT_LINE(hOutput_file, '-- DDL for ' || LOWER(rowObject.OBJECT_TYPE) || ' ' ||
                                        strOwner || '.' || strCurr_object_name);
    
        SELECT DBMS_METADATA.GET_DDL(rowObject.OBJECT_TYPE, strCurr_object_name, strOwner) AS DDL
          INTO clobDDL
          FROM DUAL;
    
        DUMP_CLOB(clobDDL, hOutput_file);
    
        DUMP_PRIVS(strOwner, strCurr_object_name, hOutput_file);
    
        IF rowObject.OBJECT_TYPE = 'TABLE' THEN
          -- Indexes
    
          FOR aRow IN (SELECT DBMS_METADATA.GET_DDL('INDEX', i.INDEX_NAME, i.OWNER) AS clobIndex
                         FROM DBA_INDEXES I
                         WHERE I.TABLE_OWNER = strOwner AND
                               I.TABLE_NAME = strCurr_object_name)
          LOOP
            DUMP_CLOB(aRow.clobIndex, hOutput_file);
          END LOOP;  -- Indexes
        END IF;
    
        IF rowObject.OBJECT_TYPE IN ('TABLE', 'VIEW') THEN
          -- Triggers
    
          FOR aRow IN (SELECT DBMS_METADATA.GET_DDL('TRIGGER', t.TRIGGER_NAME, t.OWNER) AS clobTrigger
                         FROM DBA_TRIGGERS t
                         WHERE TABLE_OWNER = strOwner AND
                         TABLE_NAME = strCurr_object_name)
          LOOP
            DUMP_CLOB(aRow.clobTrigger, hOutput_file);
          END LOOP;  -- Triggers
        END IF;
      END LOOP;
    END DUMP_OBJECT;
    
    
    PROCEDURE DUMP_OBJECT(strOwner           IN  VARCHAR2,
                          strObject_name     IN  VARCHAR2,
                          strDirectory_name  IN  VARCHAR2,
                          strFilename        IN  VARCHAR2,
                          strOpen_mode       IN  VARCHAR2 DEFAULT 'w')
    IS
      hOutput_file  UTL_FILE.FILE_TYPE;
    BEGIN
      hOutput_file := UTL_FILE.FOPEN(location  => strDirectory_name,
                                     filename  => strFilename,
                                     open_mode => strOpen_mode);
      DUMP_OBJECT(strOwner, strObject_name, hOutput_file);
      UTL_FILE.FCLOSE(hOutput_file);
    EXCEPTION
      WHEN OTHERS THEN
        UTL_FILE.FCLOSE(hOutput_file);
        RAISE;
    END DUMP_OBJECT;
    
    过程转储\u CLOB(CLOB中的aCLOB,
    UTL_文件中的hOutput_文件。文件类型)为
    nCLOB_长度数;
    nCLOB_偏移数:=1;
    nMax\u块大小编号:=32767;
    施图克·瓦尔查尔2(32767);
    开始
    nCLOB_length:=DBMS_LOB.GETLENGTH(aCLOB);
    nCLOB_offset strDirectory_name时,
    filename=>strFilename,
    打开_模式=>strOpen_模式);
    DUMP_对象(strOwner、strObject_名称、hOutput_文件);
    UTL_文件.FCLOSE(hOutput_文件);
    例外情况
    当其他人
    UTL_文件.FCLOSE(hOutput_文件);
    提高;
    结束转储对象;
    
    我建议将这些程序打包。调用DUMP_OBJECT以获取要转储的内容

    分享和享受

    “在我的公司,有时开发人员会应用一些软件包或功能 在webbex期间,因此有时客户生产与我们的不同 pvcs。”

    那么,在存储库中存储代码有什么意义呢?测试配置的意义是什么?发布管理的意义是什么

    如果这些混混在客户生产环境中的牛仔开发人员是您的员工,那么您需要约束他们。强制执行流程以确保仅部署经过认证的配置。如果需要紧急调整,则应将其改装到正式版本中


    如果这些开发人员真的为客户工作,那么我想你不能阻止他们。但你不必支持他们,也不必为他们的改变负责。(除非销售合同规定必须这样做,这不会让我感到惊讶。)

    从ALL_SOURCE中选择字段,其中Name=ObjectName将用于除触发器以外的任何操作。从所有触发器中选择字段将对触发器起作用。在您使用新对象和您的操作完成之前,请将这些值存储到“备份”表中。虽然我相信DBA有更好的方法。你不是在使用源代码管理工具来管理你的代码吗?@APC:我们使用PVCS来跟踪我们的版本,但我希望立即采取行动,以支持客户方面的一切。在我的公司,有时开发人员在webbex期间应用一些包或功能,因此有时客户生产与我们的PVC不同。(1或2种情况)。你有发行方面的经验吗?你能给我一些建议吗?请你的DBA团队导出模式,你会得到所有对象的副本,其中的数据我听说Oracle数据库可以在以后备份和恢复。我同意你的看法,但相信我,他们不知道配置管理在公司中的价值,这就是为什么有时候会发生这样的问题。顺便说一下,我们试图找出它们并阻止它们。。。我们的管理层不清楚如何惩罚他们。。。其他公司是如何惩罚这种开发者的?@rima-很抱歉,但就公司的纪律程序向您提供建议是远远偏离主题的。我的建议是:如果你的同事不了解正当程序的重要性,你的经理现在不知道如何正确执行政策,那么也许是时候找一个新雇主了?我想,但在马来西亚我真的找不到任何CM工作:(就在美国!目前在这里工作对我来说太有价值了:)如果你有任何朋友,请向我介绍:)你能告诉我str owner和directory_name的区别吗?object_name和filename的区别是什么?strOwner是你要转储的对象所在的模式。strDirectory_name是文件系统中的一个目录名,可通过要在其中创建文件的UTL_文件访问该目录。strFilename是要创建的文件的名称,DDL将写入该文件。