sql >> Base de Datos >  >> RDS >> Oracle

No se puede usar DROP TABLE IF EXISTS en schema.sql para una aplicación Spring Boot

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.