No ha mostrado su código Java, pero desde el seguimiento de la pila parece que está llamando a executeSqlScript()
de ScriptUtil método
, que usaba el separador de declaraciones de punto y coma predeterminado.
No reconoce el bloque PL/SQL como una sola unidad y, en cambio, intenta ejecutar todo hasta el primer punto y coma como una instrucción SQL independiente, que no es válida y provoca el error que está viendo.
Puede usar el versión de executeSqlScript()
que le permite anular el valor predeterminado y usar /
en cambio:
lo que significaría que todas las declaraciones SQL en su secuencia de comandos tendrían que usar un /
separador en lugar de un punto y coma también:
BEGIN
EXECUTE IMMEDIATE 'DROP TABLE table_a';
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE != -942 THEN
RAISE;
END IF;
END;
/
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
)
/
...
Como se señaló en los comentarios, su bloque original no estaba del todo bien de todos modos; y el create
no necesita hacerse a través de PL/SQL, incluso si el drop
tiene que ser.
Pero ese método también tiene un ignoreFailedDrops
flag, que parece hacer exactamente lo que quieres (aunque no puedo probarlo para comprobarlo):
Si usa esa versión y pasa verdadero para esa bandera, no necesita el contenedor PL/SQL alrededor de la caída; puede mantener el separador de punto y coma y volver a:
DROP TABLE table_a;
CREATE TABLE table_a
(
id VARCHAR(5) PRIMARY KEY,
name VARCHAR(100)
);
...
Si su secuencia de comandos de esquema contiene cualquier otro PL/SQL (desencadenador, paquetes, etc.), aún deberá cambiar al uso del separador de barra (o cualquier otro separador de su elección; aunque una barra es tradicional) para todo.