Bạn có thể làm hầu hết điều này bằng cách sử dụng login.sql. login.sql được thực thi trong thời gian - đáng ngạc nhiên - đăng nhập và được tải từ SQLPATH hoặc thư mục hiện tại của bạn. Đối với các ví dụ bạn đã đưa ra, bạn thực sự đã chọn trường hợp xấu nhất.
Vấn đề là sqlterminator. Bất cứ điều gì bạn đặt vào đó, dấu gạch chéo về phía trước được duy trì như một sqlterminator miễn phí. Bên cạnh đó, sqlplus đầu tiên quét tìm sqlterminator và thực hiện điều này trước khi quét đến bộ kết thúc chuỗi. Một lỗi nếu bạn hỏi tôi. Dấu gạch chéo phía trước có thể được sử dụng trong một chuỗi miễn là nó không đơn độc trên một dòng riêng biệt. Ngay khi sqlplus tìm thấy ký tự được chỉ định là sqlterminator, nó sẽ bỏ qua mọi thứ khác và dừng đọc.
Dấu gạch chéo phía trước có thể được xử lý, miễn là nó không đơn độc trên một dòng.
login.sql chứa:
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 chứa:
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/
';
chạy tập lệnh:
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.
Không cần phải nghịch ngợm với khối bắt đầu / kết thúc. Không thể xử lý lệnh sqlterminator bên trong lệnh, bất kể nó ở đâu, trong chuỗi hay không, không thể xử lý các dòng với dấu gạch chéo một mình trên một dòng trong chuỗi.