我们有应用程序,其中数据库在触发器中包含大部分业务逻辑,随后更新在其他几个表上触发触发器。我想重构混乱,并希望从触发器中提取程序开始,但找不到任何可靠的工具来执行此操作。在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);
答案 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)。如果你对应该翻译的内容以及如何进行严格定义,那将很容易实现。