Ausführen eines SQL-Skripts nacheinander in oracle db

Nehmen wir an, ich habe ein SQL-Skript, das so aussieht:

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

Grundsätzlich kann das Skript DML-, DCL-, DDL- und anonyme Blöcke enthalten. Ich möchte jede Anweisung aufteilen und einzeln ausführen können, aber natürlich, damit sie erscheint.

Ich dachte daran, einen regulären Ausdruck zu verwenden, und ich glaube, die Logik müsste ungefähr so ​​lauten:

1) Wenn die Zeichenfolge mit create | alter | drop | declare beginnt, wird alles vom Anfang der Zeichenfolge bis zum Semikolon abgerufen, auf das eine neue Zeile und ein Schrägstrich folgen (der Schlüssel hier ist der in der Bei einem anonymen Block müssen wir DML ignorieren, bis wir das Ende erreicht haben.

2) Wenn die Zeichenfolge mit Einfügen | Löschen | Aktualisieren | Zusammenführen beginnt (erneut ignoriert, wenn wir uns bereits in einem Block befinden, der für Anforderung 1 gilt), wird vom Anfang der Zeichenfolge bis zum darauffolgenden Semikolon alles abgerufen eine neue Zeile ohne Schrägstrich.

Bisher habe ich mir das in Python ausgedacht:

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

Aber jedes Mal, wenn ich versuche, mit den anderen Anforderungen voranzukommen, funktioniert der reguläre Ausdruck nicht mehr (und tatsächlich ist die Ausgabe so irre wie sie ist) und wird so kompliziert, dass ich mich darin verliere.

Ich würde dies gerne in Python oder Java machen lassen (Java, nehme ich an, wäre eigentlich vorzuziehen, da dies eine Orakel-Datenbank ist.)

Dies muss kein regulärer Ausdruck sein, wenn Regex dieser Aufgabe nicht wirklich gewachsen ist. Mein oberstes Ziel ist es, jede Anweisung aufzuteilen und einzeln auszuführen, damit ich alle auftretenden Fehler abfangen und sie ordnungsgemäß verarbeiten kann.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage