Jag vet att detta är en gammal tråd, men jag snubblade över den och jag känner att detta inte har förklarats helt.
Det finns en enorm skillnad i SQL*Plus mellan betydelsen av en / och en
;
eftersom de fungerar annorlunda.
;
avslutar en SQL-sats, medan /
exekverar allt som finns i den aktuella "bufferten". Så när du använder en ;
och en /
uttalandet körs faktiskt två gånger.
Du kan enkelt se det med en /
efter att ha kört ett uttalande:
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
I det här fallet märker man faktiskt felet.
Men förutsatt att det finns ett SQL-skript så här:
drop table foo;
/
Och detta körs inifrån SQL*Plus, då blir det här väldigt förvirrande:
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
/
krävs huvudsakligen för att köra programsatser som har inbäddat ;
som SKAPA PROCEDUR
,SKAPA FUNKTION
,SKAPA PAKET
satser och för alla BEGIN...END
block.