假设我有一个sql脚本,如下所示:--split statement 1
ALTER TABLE abs
ADD (make VARCHAR2(2 byte),
model varCHAR2(12 BYTE),
built_on DATE,
serial varchar2(123 BYTE));
/
--split statement 2
declare
begin
null;
end;
/
--split statement 3
insert into test (v,a,c)
values ('1','jjoe;','232');
--split statement 4
create or replace function BLAH_BLAH(i_in varchar2)
as
l_one varchar2(12);
l_two varchar2(12);
l_three varchar2(12);
begin
l_one := 1;
l_two := 3;
insert into test (v,a,b)
values ('1','jjoee;','232');
exception when no_data_found then
l_three := 3;
end;
/
基本上,脚本可以有DML、DCL、DDL和匿名块。我希望能够拆分每个语句并单独执行它们,但当然是按照它们出现的顺序。在
我想使用正则表达式,我相信逻辑应该是这样的:
1)如果字符串以create | alter | drop | declare开头,那么从字符串的开始到分号,然后是一个新行,然后是一个正斜杠(这里的关键是,如果出现匿名块,我们必须忽略DML,直到到达末尾)。在
2)如果字符串以insert | delete | update | merge开头(同样,如果我们已经在一个适用于需求1的块中,则忽略此字符串),则从该字符串的开始到分号,然后是一个没有正斜杠的新行。在
到目前为止,我用Python编写了以下内容:
^{pr2}$
但是每次我试图处理其他需求时,正则表达式就开始不起作用了(实际上输出有点奇怪),并且变得复杂到让我不知所措。在
我希望用Python或Java来实现这一点(如果这是一个oracle数据库,我想实际上最好是Java)
如果regex不能胜任这项任务,则不必是正则表达式。我的最终目标是分离每个语句并单独运行它,这样我就可以捕捉到出现的任何错误并优雅地处理它们。在