Vím, že toto je staré vlákno, ale právě jsem na něj narazil a mám pocit, že to nebylo úplně vysvětleno.
V SQL*Plus je obrovský rozdíl mezi významem /
a ;
protože fungují jinak.
;
ukončuje příkaz SQL, zatímco /
provede vše, co je v aktuálním "bufferu". Takže když použijete ;
a a /
příkaz se ve skutečnosti provede dvakrát.
Můžete to snadno vidět pomocí /
po spuštění příkazu:
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
V tomto případě si člověk skutečně všimne chyby.
Ale za předpokladu, že existuje skript SQL, jako je tento:
drop table foo;
/
A toto se spouští z SQL*Plus, pak to bude velmi matoucí:
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
/
je vyžadován hlavně pro spouštění příkazů, které mají vložený ;
jako CREATE PROCEDURE
,CREATE FUNCTION
,CREATE PACKAGE
příkazy a pro všechny BEGIN...END
bloky.