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:
prompt run login.sql
show sqlterminator
show sqlblanklines
set sqlblanklines on
set sqlterminator ';'
show sqlterminator
show sqlblanklines
prompt ready login.sql
set echo on
leigh.sql contiene:
INSERT INTO t1 VALUES ('fail bc semicolon
a;a
/
');
INSERT INTO t1 VALUES ('fail bc solo /
aa
/
');
INSERT INTO t1 VALUES ('ok / not solo
aa
/a
');
DELETE FROM t1 WHERE a = 'c
a/
';
ejecuta el script:
sqlplus leigh/leigh@orcl @leigh
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Aug 9 22:36:20 2012
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Data Mining and Real Application Testing options
run login.sql
sqlterminator ";" (hex 3b)
sqlblanklines OFF
sqlterminator ";" (hex 3b)
sqlblanklines ON
ready login.sql
SQL> INSERT INTO t1 VALUES ('fail bc semicolon
2 a;a
3 /
ERROR:
ORA-01756: quoted string not properly terminated
SQL> ');
SP2-0042: unknown command "')" - rest of line ignored.
SQL>
SQL> INSERT INTO t1 VALUES ('fail bc solo /
2
3
4 aa
5 /
ERROR:
ORA-01756: quoted string not properly terminated
SQL> ');
SP2-0042: unknown command "')" - rest of line ignored.
SQL>
SQL> INSERT INTO t1 VALUES ('ok / not solo
2
3
4 aa
5 /a
6 ');
1 row created.
SQL>
SQL> DELETE FROM t1 WHERE a = 'c
2
3
4 a/
5 ';
0 rows deleted.
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.