代码之家  ›  专栏  ›  技术社区  ›  wadesworld

在不破坏代码的情况下管理Oracle软件包的策略

  •  5
  • wadesworld  · 技术社区  · 15 年前

    我很想知道人们如何在他们的应用程序中管理他们的包。

    例如,在我们的开发实例中,应用程序开发人员可能希望更改存储过程。但是,更改存储过程将破坏现有的Java代码,直到DAO层被更新以适应变化。

    我的典型实践是将新的过程实现放入“dev”包中。然后,开发人员可以更改对这个包的引用,进行他的测试,然后当我们准备就绪时,我们可以替换“生产”包中的过程,将其从开发人员中删除,开发人员将其引用更改回生产包。

    不过,我发现它并不像我想的那样游动。首先,如果有一堆依赖于DEV包的Java代码,那么我的情况与直接编辑生产包的情况相同——如果我破解了包,我将破解一堆代码。

    第二,人们会很忙,我们不会尽快把包装转移到生产中。然后,我们有两个版本的存储过程在周围浮动,很难记住哪些已转移到生产环境中,哪些尚未转移到生产环境中。

    目标是让开发人员继续工作。是的,它是一个开发服务器,但我们不想意外地破坏代码。

    有人能提出解决这个问题的有效方法吗?

    2 回复  |  直到 15 年前
        1
  •  3
  •   Justin Cave    15 年前

    如果每个开发人员在数据库中都有自己的模式,并且共享模式中的所有对象都有公共同义词,并且所有Java代码都使用非限定对象名称,那么特定开发人员模式中的包的本地副本将优先于共享版本。因此,开发者A可以使用包的当前版本,将其安装到他或她的本地模式中,对包进行任何更改,并在其自己的开发环境中进行任何Java更改都是必需的(我假设开发人员有自己的本地应用服务器)。当两组更改都足够稳定,可以在共享开发环境中进行检查时,PL/SQL包和Java更改都可以构建到共享开发环境(共享开发应用服务器和开发数据库中的真实模式)。然后,开发人员可以删除包的本地副本。

    只要开发人员将pl/sql从源代码控制中检查出来以开始他们的更改,而不是假设他们的模式中的本地副本是最新的——如果开发人员在他们的本地模式中保留旧的、本地版本的代码,那么他们可能最终会遇到难以调试的问题,其中IR PL/SQL和Java版本是不同步的。您可以通过自动化进程来解决这个问题,例如,如果在合理的时间内没有修改开发人员架构中的包,或者如果开发人员没有在源代码管理中签出这些包,或者通过生成脚本来让开发人员在构建P中自动刷新其架构。摇滚乐。

        2
  •  1
  •   Gary Myers    15 年前

    Java/DAO层只应在程序规范更改(参数的数目、名称等)时受到影响。缓解策略是

    1. 添加带有参数默认值的新参数,以便不需要传递这些参数。
    2. 如果参数按位置调用,则不要更改其顺序[例如pkg.proc_a(1,2,3)],如果按名称调用,则不要重命名参数[例如pkg.proc_b(p_1=>1,p_2=>2)]
    3. 为过程和函数使用包,这样您就可以重载它们。

      创建或替换pkg是 proc(varchar2中的p1); proc(p1在varchar2中,p2在number中); 结束;

    通过重载,您可以在一个包中有多个同名的过程,但参数的数字和/或数据类型不同。

    11GR2引入了编辑来解决这个问题。它允许包的多个版本和应用程序代码选择要查看的代码的“版本”(版本)-默认的“基本”版本或开发版本。

    不过,我怀疑升级数据库版本不是一个实用的解决方案。