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

时间:2010-04-27 12:13:28

标签: oracle refactoring plsql

我们有应用程序,其中数据库在触发器中包含大部分业务逻辑,随后更新在其他几个表上触发触发器。我想重构混乱,并希望从触发器中提取程序开始,但找不到任何可靠的工具来执行此操作。在SQL Developer和Toad中使用“Extract procedure”无法正确处理:new和:old触发器变量。

如果你遇到类似触发器的问题,你有找到解决方法吗?

编辑:理想情况下,只有提取的代码引用的列才会作为输入/输出参数发送,例如:

从触发器中提取的原始代码示例:

  .....
  if :new.col1 = some_var then
    :new.col1 := :old.col1
  end if
  .....

会变成:

  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);

2 个答案:

答案 0 :(得分:1)

听起来你想在PL / SQL源上进行转换。为了可靠地执行此操作,您需要一个工具,可以将PL / SQL解析为某种编译器数据结构,对该结构进行模式匹配并进行定向更改,然后重新生成修改后的PL / SQL代码。

DMS Software Reengineering Toolkit就是这样一个工具。它由被翻译的编程语言参数化;它有许多语言的现成前端,包括C,C ++,C#,Java,COBOL和...... PL / SQL。

答案 1 :(得分:0)

这不是答案。显然,我没有足够的声誉来编辑原始问题。 问题在于它不像我们通常想到的那样是“重构”。即使你从触发器创建一堆程序,你也需要制作一个适当的框架来运行它们以实现原始功能。我怀疑这也是一个挑战。

作为解决方案提案,我将使用一个基于状态机的python脚本(例如,请参阅http://www.ibm.com/developerworks/library/l-python-state.html)。如果你对应该翻译的内容以及如何进行严格定义,那将很容易实现。