Tôi biết đây là một chủ đề cũ, nhưng tôi chỉ tình cờ tìm thấy nó và tôi cảm thấy điều này chưa được giải thích hoàn toàn.
Có một sự khác biệt rất lớn trong SQL * Plus giữa ý nghĩa của /
và một ;
bởi vì chúng hoạt động khác nhau.
;
kết thúc một câu lệnh SQL, trong khi /
thực thi bất cứ điều gì có trong "bộ đệm" hiện tại. Vì vậy, khi bạn sử dụng ;
và một /
câu lệnh thực sự được thực thi hai lần.
Bạn có thể dễ dàng nhận thấy điều đó bằng cách sử dụng /
sau khi chạy một câu lệnh:
SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:37:20 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options
SQL> drop table foo;
Table dropped.
SQL> /
drop table foo
*
ERROR at line 1:
ORA-00942: table or view does not exist
Trong trường hợp này, người ta thực sự nhận thấy lỗi.
Nhưng giả sử có một tập lệnh SQL như thế này:
drop table foo;
/
Và điều này được chạy từ bên trong SQL * Plus nên điều này sẽ rất khó hiểu:
SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 18 12:38:05 2012
Copyright (c) 1982, 2010, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning and OLAP options
SQL> @drop
Table dropped.
drop table foo
*
ERROR at line 1:
ORA-00942: table or view does not exist
/
chủ yếu được yêu cầu để chạy các câu lệnh có nhúng ;
như CREATE PROCEDURE
, CREATE FUNCTION
, CREATE PACKAGE
và cho bất kỳ BEGIN...END
nào khối.