Ejecutando script SQL en oracle db una declaración a la vez

Digamos que tengo un script sql que se parece a esto:

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

Básicamente, el script puede tener bloques DML, DCL, DDL y anónimos. Quiero poder dividir cada sentencia y ejecutarlas individualmente, pero por supuesto para que aparezcan.

Pensé en usar una expresión regular, y creo que la lógica tendría que ser algo como esto:

1) si la cadena comienza con create | alter | drop | declare, obtenga todo desde el inicio de esa cadena hasta el punto y coma seguido de una nueva línea, seguida de una barra diagonal (la clave aquí es que en la En caso de un bloqueo anónimo, tenemos que ignorar DML hasta que lleguemos al final).

2) si la cadena comienza con insert | delete | update | merge (nuevamente, se ignora si ya estamos en un bloque que se aplica al requisito 1), obtenga todo desde el inicio de esa cadena hasta el punto y coma que sigue Una nueva línea sin barra diagonal.

Hasta ahora he encontrado esto en Python:

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

pero cada vez que trato de seguir adelante con los otros requisitos, la expresión regular comienza a no funcionar (y en realidad la salida es un poco extraña) y se me complica lo suficiente como para que me pierda.

Me gustaría tener esto hecho en Python o Java (Java, supongo, en realidad sería preferible dado que esto es un db de Oracle)

Esto no tiene que ser una expresión regular si regex no está realmente a la altura de esta tarea. Mi objetivo final es dividir cada declaración y ejecutarla individualmente para poder detectar cualquier error que surja y manejarla con gracia.

Respuestas a la pregunta(2)

Su respuesta a la pregunta