重构PL/SQL触发器 - 提取过程

3
我们有一个应用程序,其中数据库包含大量的业务逻辑触发器,在更新后会在多个其他表上触发触发器。我想重构这个混乱的代码,并希望从触发器中提取过程开始,但是找不到任何可靠的工具来实现这一点。在SQL Developer和Toad中使用“提取过程”未能正确处理:new和:old触发器变量。
如果您遇到了类似的触发器问题,您是否找到了解决方法?
编辑:理想情况下,只发送作为输入/输出参数引用的列,如:
要从触发器中提取的原始代码示例:
  .....
  if :new.col1 = some_var then
    :new.col1 := :old.col1
  end if
  .....

would become :

  procedure proc(in old_col1 varchar2, in out new_col1 varchar2, some_var varchar2) is
  begin
    if new_col1 = some_var then
      new_col1 := old_col1
    end if;
  end;
  ......
  proc(:old.col1,:new.col1, some_var);

1
理想情况下,您希望“提取过程”函数如何处理“:old”和“:new”变量? - Igby Largeman
已添加对原问题的答案。 - Juraj
2个回答

1

听起来你想对PL/SQL源代码进行转换。为了可靠地完成这个任务,你需要一个能够将PL/SQL解析成某种编译器数据结构、针对该结构进行模式匹配并进行有向更改,然后再生成修改后的PL/SQL代码的工具。

DMS软件重构工具包就是这样一款工具。它可以根据正在翻译的编程语言进行参数化;它有许多语言的现成前端,包括C、C++、C#、Java、COBOL和...PL/SQL。


0

这并不是完全正确的答案。显然,我没有足够的声望来编辑原始问题。

问题在于它不是我们通常所认为的“重构”。即使您从触发器创建了一堆过程,您仍需要制定适当的框架以按顺序运行它们以实现原始功能。我怀疑这也将是一个挑战。

作为解决方案提议,我会使用一个基于状态机的Python脚本(例如,请参见http://www.ibm.com/developerworks/library/l-python-state.html)。如果您对应该翻译的内容和方式有严格的定义,那么实现起来将很容易。


我不确定我理解你想说什么以及你想如何编辑这个问题。我知道提取过程并不是目的本身。但是,在触发器中拥有庞大、重复且难以维护的代码块与逻辑上将相同的代码拆分为过程之间存在很大差异(尽管它们仍将从同一触发器中调用)。至于Python脚本,我宁愿选择一些针对PL / SQL特别经过尝试和测试的东西。已经有这样的功能,但似乎没有考虑到:new和:old变量。 - Juraj
哦,而且我可以更容易地为过程编写单元测试。测试触发器是个麻烦事。 - Juraj
抱歉,我的意思是我不知道如何在回答问题之前添加评论。 并重新表达我的观点:
  1. 将触发器转换为过程并不完全是“重构”,除非您打算用以下内容替换触发器的主体: create or replace trigger "MY_TABLE_INS" before insert on my_table for each row begin my_ins_trigger_proc(:new.field,:old.field); end; 从原始答案中不清楚您将如何处理提取出来的过程。
  2. 您需要的功能只是文本转换,这是Python、Perl等领域的范畴。
- dbaranov
当然,你正在正确的轨道上摆脱触发器。这些是不好的。向asktom询问。(: - dbaranov
我必须确定是否将:new.colX变量(或提取块中使用的任何PL / SQL变量)转换为“in”,“in out”或“out”过程参数。这涉及解析,因此在我看来,这不仅仅是一些简单的文本转换。 我想将触发器拆分为多个逻辑上分离的代码块,并具有更清晰的接口。触发器中应仅保留过程调用。然后进行去重(非常需要)和编写单元测试。然后我可以继续摆脱触发器。这里有什么不清楚的吗? - Juraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接