2

当我遗漏了一行要更改的代码时,我有点试图维护在两个不同的 Oracle 11g2 系统上运行的代码包。我们在一个具有特定数据集的系统上进行开发,然后在另一个具有不同数据集的系统上进行测试。

差异不是很大,但包括需要在两个不同包中的两个不同查询中更改单个字段名称才能运行包。在一个系统上,我们使用一个字段,而在另一个系统上......另一个不同的字段。数据库具有相同的模式名称、对象名称和字段名称,但托管系统服务器名称不同。

更改实际上很简单

INSERT INTO PERSON_HISTORY 
  ( RECORD_NUMBER, 
    UNIQUE_ID, 
    SERVICE_INDEX, 
    [... 140 more fields... ] 
   ) 
 SELECT LOD.ID RECORD_NUMBER ,
      -- for Mgt System, use MD5 instead of FAKE_SSN
      -- Uncomment below, and comment out Dev system statement
      -- MD5 UNIQUE_ID ,
      -- for DEV system, use below
         '00000000000000000000' || LOD.FAKE_SSN  UNIQUE_ID , 
         null  SERVICE_INDEX ,
         [... 140 more fields... ] 
 FROM LEGACY_DATE LOD
 WHERE  (conditions follow)
 ;

我错过了其中一个查询中的字段名称更改之一,而我们的多天运行是废话。

出于愚蠢的原因,我不会深入讨论,我最终维护了所有代码,包括必须在版本之间手动翻译和重新处理开发人员的更改,然后在系统之间传输和更新所需的更改。

我试图减少我必须提供的重复输入以换出代码——我想自动化这一步,这样我就不会再忽略它了。

我想实现条件编译,从 Oracle 中提取数据库系统的名称并自动进行单行交换——但 Oracle 条件编译需要一个包静态常量(在这种情况下为布尔值)。我不能使用 sys_context 函数来填充值。或者,它似乎不允许我从 sys_context 中提取数据并有条件地评估它并将其分配给一个常数。甲骨文没有。DB_DOMAIN、DB_NAME 或 SERVER_HOST 可能有助于区分系统,但我找不到使用这些信息的方法。

一个选项是创建一个全局常量,当我将代码移动到另一个系统时手动设置它,但此时,我有很多步骤要进行传输,我担心我什至会搞砸. 我想让它独立于其他包或我自己的进程。

有没有好的方法来做到这一点?

-------- 编辑我将尝试该程序并尝试找出周末的视图。最终,该项目将移交给希望“只运行它”的客户,因此他们不会理解任何开关的含义,或者为什么我在包中有“特殊”代码。而且,他们不需要……我什至不知道他们是否会看评论。谢谢

4

1 回答 1

4

正如Mat 在此特定示例的评论中所说,您可以使用视图解决,但是对于更复杂的情况还有其他方法。

如果您从文件系统编译或使用任何自动系统,您可以创建一个单独的 PL/SQL 块/过程,在编译之前在同一个会话中执行。我会做这样的事情:

declare
   l_db varchar2(30) := sys_context('userenv','instance_name');
begin
   if l_db = 'MY_DB' then
      execute immediate 'alter session set plsql_ccflags = ''my_db:true''';
   end if;
end;
/

重要的一点;条件编译不涉及“包静态常量”,而是一个会话。因此,您需要确保您的编译标志在包/会话中是相同/唯一的。

于 2014-11-07T09:08:24.663 回答