Eu sei que este é um tópico antigo, mas acabei de tropeçar nele e sinto que isso não foi explicado completamente.
Há uma grande diferença no SQL*Plus entre o significado de um
/
e um ;
porque funcionam de forma diferente. O
;
termina uma instrução SQL, enquanto o /
executa o que estiver no "buffer" atual. Então, quando você usa um ;
e um /
a instrução é realmente executada duas vezes. Você pode ver isso facilmente usando um
/
depois de executar uma instrução: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
Neste caso, percebe-se o erro.
Mas supondo que exista um script SQL como este:
drop table foo;
/
E isso é executado de dentro do SQL * Plus, isso será muito confuso:
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
O
/
é necessário principalmente para executar instruções que tenham incorporado ;
como CREATE PROCEDURE
,CREATE FUNCTION
,CREATE PACKAGE
instruções e para qualquer BEGIN...END
blocos.