Das meiste können Sie mit login.sql erledigen. login.sql wird während der - überraschenden - Anmeldung ausgeführt und aus Ihrem SQLPATH oder dem aktuellen Verzeichnis geladen. Für die Beispiele, die Sie gegeben haben, haben Sie wirklich den schlechtesten Fall gewählt.
Problem ist der sqlterminator. Was auch immer Sie dort einfügen, der Schrägstrich wird als kostenloser SQL-Minimator beibehalten. Darüber hinaus sucht sqlplus zuerst nach dem sqlterminator und führt dies durch, bevor zum Zeichenfolgenabschluss gescannt wird. Ein Fehler, wenn Sie mich fragen. Der Schrägstrich kann in einer Zeichenfolge verwendet werden, solange er nicht in einer separaten Zeile steht. Sobald sqlplus das als sqlterminator angegebene Zeichen findet, ignoriert es alles andere und hört auf zu lesen.
Der Schrägstrich kann behandelt werden, solange er nicht alleine in einer Zeile steht.
login.sql enthält:
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 enthält:
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/
';
Führen Sie das Skript aus:
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.
Keine Notwendigkeit, mit Anfangs- / Endblöcken zu fummeln. Kann sqlterminator im Befehl nicht verarbeiten, egal wo es sich in einer Zeichenfolge befindet oder nicht, kann keine Zeilen mit Schrägstrich allein in einer Zeile in einer Zeichenfolge verarbeiten.