Bunun birçoğunu login.sql kullanarak yapabilirsiniz. login.sql - şaşırtıcı - oturum açma sırasında yürütülür ve SQLPATH veya geçerli dizinden yüklenir. Verdiğiniz örnekler için en kötü durumu gerçekten seçtiniz.
Sorun sqlterminator. Oraya ne koyarsanız koyun, eğik çizgi serbest bir sqlterminator olarak korunur. Bunun yanında, sqlplus ilk olarak sqlterminator'u tarar ve bunu dize sonlandırıcısına taramadan önce yapar. Bana sorarsan bir hata. Eğik çizgi, ayrı bir satırda yalnız olmadığı sürece bir dizede kullanılabilir. Sqlplus sqlterminator olarak belirtilen karakteri bulur bulmaz, diğer her şeyi yok sayar ve okumayı durdurur.
Eğik çizgi, bir hatta yalnız olmadığı sürece ele alınabilir.
login.sql içeriği:
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 içeriği:
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/
';
komut dosyasını çalıştırın:
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.
Başlangıç / bitiş blokları ile uğraşmanıza gerek yok. Bir dizedeki nerede olursa olsun, sqlterminator komut içinde işlenemiyor ya da olmasın, bir dizedeki bir satırda eğik çizgi bulunan satırları tek başına işleyemez.