Ocasionalmente, obtendré un script que funcionará bien en SQL Developer o Toad, pero requiere modificación para que se ejecute con éxito desde SQL * Plus. Aquí hay un ejemplo del peor de los casos que contiene varias declaraciones, cada una con líneas en blanco, punto y coma y barras diagonales:
INSERT INTO t1 VALUES ('a
;
/
');
INSERT INTO t1 VALUES ('b
;
/
');
DELETE FROM t1 WHERE c1 = 'c
;
/
';
Por varias razones, estas declaraciones deben ejecutarse desde SQL * Plus. Las líneas en blanco son fáciles de resolver con un simple ...
set sqlblanklines on
Soy consciente de que sqlterminator
se puede cambiar y / o desactivar, pero ambos requerirían modificaciones en el código, el primero mueve el problema sin resolverlo y tampoco resuelve el problema de la barra inclinada incrustada.
La mejor respuesta sería una manera de permitir que estas declaraciones se ejecuten sin modificación cambiando el entorno de alguna manera (como lo hace sqlblanklines). Si eso no es posible, entonces quizás haya una manera de modificar mediante programación los scripts. Estoy tratando de evitar cambios manuales.
fuente
Respuestas:
Puede hacer la mayor parte de esto utilizando un login.sql. login.sql se ejecuta durante un inicio de sesión sorprendente y se carga desde su SQLPATH o el directorio actual. Para los ejemplos que dio, realmente eligió el peor de los casos.
El problema es el sqlterminator. Independientemente de lo que ponga allí, la barra diagonal se mantiene como un sqlterminator gratuito. Además de eso, sqlplus primero escanea el sqlterminator y lo hace antes de escanear al terminador de cadena. Un error si me preguntas. La barra diagonal se puede usar en una cadena siempre que no esté sola en una línea separada. Tan pronto como sqlplus encuentre el carácter especificado como sqlterminator, ignora todo lo demás y deja de leer.
La barra diagonal se puede manejar, siempre que no esté sola en una línea.
login.sql contiene:
leigh.sql contiene:
ejecuta el script:
No es necesario jugar con los bloques de inicio / finalización. No se puede manejar el comando sqlterminator dentro del comando, sin importar dónde se encuentre, en una cadena o no, no se pueden manejar líneas con barra diagonal sola en una línea de una cadena.
fuente
Las instrucciones de inserción con líneas en blanco y punto y coma tendrán éxito si se colocan dentro de los bloques BEGIN ... END Este cambio podría hacerse usando un script, pero el script fallaría si contuviera sentencias DDL que no pueden ejecutarse dentro de un bloque sin ejecutarse de inmediato.
Esta solución tampoco resuelve el problema / incrustado.
fuente
Mi solución alternativa:
Parece que el terminador de comando se ignora dentro de la declaración del cuerpo.
fuente
fuente