Wykonywanie skryptu SQL do instrukcji oracle db jednocześnie

Powiedzmy, że mam skrypt sql, który wygląda tak:

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

Zasadniczo skrypt może mieć bloki DML, DCL, DDL i anonimowe. Chcę być w stanie podzielić każdą instrukcję i wykonać je indywidualnie, ale oczywiście, aby się pojawiły.

Myślałem o użyciu wyrażenia regularnego i uważam, że logika musiałaby wyglądać mniej więcej tak:

1) jeśli ciąg rozpoczyna się od deklaracji create | alter | drop |, weź wszystko od początku tego ciągu do średnika, po którym następuje nowy wiersz, po którym następuje ukośnik (kluczem jest tutaj zdarzenie anonimowego bloku, musimy zignorować DML, aż dojdziemy do końca).

2) jeśli ciąg zaczyna się od insert | delete | update | merge (ponownie, ignorowany, jeśli jesteśmy już w bloku, który odnosi się do wymagania 1), pobierz wszystko od początku tego łańcucha do średnika, po którym następuje nowa linia bez ukośnika.

Do tej pory wymyśliłem to w Pythonie:

sql_commands = re.split('(?i)(((create|alter|drop|merge)+)(?m);(\s*)\n(\s*))|(;(\s*)\n(\s*)/)',sql_script)  

ale za każdym razem, gdy staram się postępować dalej z innymi wymaganiami, wyrażenie regularne zaczyna nie działać (a właściwie wyjście jest w pewnym sensie funky) i staje się na tyle skomplikowane, że mogę się zagubić.

Chciałbym mieć to zrobione w Pythonie lub Javie (Java, jak sądzę, w rzeczywistości byłoby preferowane, ponieważ jest to db oracle)

To nie musi być wyrażenie regularne, jeśli regex nie jest w stanie sprostać temu zadaniu. Moim nadrzędnym celem jest rozdzielenie każdej instrukcji i uruchomienie jej osobno, aby móc wychwycić wszelkie błędy, które pojawią się i wdzięcznie je obsłużyć.

questionAnswers(2)

yourAnswerToTheQuestion