Puoi fare la maggior parte di questo usando un login.sql. login.sql viene eseguito durante - sorprendente - login e viene caricato da SQLPATH o dalla directory corrente. Per gli esempi che hai dato, hai davvero scelto il caso peggiore.
Il problema è il sqlterminator. Qualunque cosa tu inserisca, la barra viene mantenuta come un sqlterminator gratuito. Accanto a ciò, sqlplus esegue innanzitutto la ricerca del sqlterminator e lo fa prima di eseguire la scansione sul terminatore di stringa. Un bug se me lo chiedi. La barra in avanti può essere utilizzata in una stringa purché non sia sola su una linea separata. Non appena sqlplus trova il carattere specificato come sqlterminator, ignora tutto il resto e interrompe la lettura.
La barra in avanti può essere gestita, purché non sia sola su una linea.
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/
';
eseguire lo 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.
Non è necessario giocherellare con i blocchi di inizio / fine. Impossibile gestire sqlterminator all'interno del comando, indipendentemente da dove si trovi, in una stringa o no, non è in grado di gestire le linee con barra in avanti da solo su una linea in una stringa.