我继承了一个数据库,其中包含几个 1000-1500 行长的过程,复杂的嵌套子选择在某些地方深入到 7 或 8 层。为了我自己的理智,我迫切需要重构它们,但我如何才能开始这样做,并确信它们仍然可以正常工作?
如果这是 .Net,我会编写单元测试 - 您是否推荐类似的方法?
我继承了一个数据库,其中包含几个 1000-1500 行长的过程,复杂的嵌套子选择在某些地方深入到 7 或 8 层。为了我自己的理智,我迫切需要重构它们,但我如何才能开始这样做,并确信它们仍然可以正常工作?
如果这是 .Net,我会编写单元测试 - 您是否推荐类似的方法?
是的,创建单元测试。 这确实是确保修改后的版本满足与原始版本相同的要求的唯一方法。
要重构过程,请查找任何可以提取到单独过程或嵌套过程中的重复代码模式。如果程序仍然太长,则将其部分分解为单独的程序,每个程序完成一项任务。当您中断新程序时,您应该为它添加单元测试。
七八级子选择听起来确实过多,但您可能会发现其中一些甚至大部分是生成所需数据所必需的。我最初会专注于过程,然后处理 SQL。
要在 Oracle 中进行单元测试,最重要的测试商业产品是Quest 的 Code Tester。Oracle 在其免费的SQL Developer产品中内置了单元测试。StackOverflow 上的 PL/SQL 单元测试问题有一些其他选项,或者您可以编写自己的测试。
也许你可以在这里找到好的建议:
同时,尝试识别看起来令人讨厌的查询,例如使用
where
而不是joins
.至于我在这里的两分钱,如果可以的话,我通常会通过重新格式化程序来运行它,以使事情达到可追踪的水平,因为除非已经重新格式化,否则任何 1500 行的内容都将有点粗糙,难以手工追踪。
然后我尝试将深度嵌套的选择放入临时表中以减少嵌套。
然后我尝试弄清楚是否可以将它拆分成连续的代码块,这些代码块可以被提取出来自行运行(想想用 C# 的单个长方法制作更小的函数)并封装以防止在其中显示太多信息一段很长的时间。
这些是我在离题太远之前解决问题的基础知识