Solución:
Sé que este es un hilo antiguo, pero me encontré con él y siento que no se ha explicado completamente.
Existe una gran diferencia en SQL * Plus entre el significado de un /
y un ;
porque funcionan de manera diferente.
los ;
finaliza una sentencia SQL, mientras que el /
ejecuta lo que esté en el “búfer” actual. Entonces, cuando usas un ;
y a /
la declaración se ejecuta en realidad dos veces.
Puede ver fácilmente que usando un /
después de ejecutar una declaración:
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
En este caso, uno se da cuenta del error.
Pero suponiendo que haya un script SQL como este:
drop table foo;
/
Y esto se ejecuta desde SQL * Plus, entonces esto será muy 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
los /
se requiere principalmente para ejecutar sentencias que tienen incrustadas ;
como un CREATE PROCEDURE
declaración.
Quería aclarar un poco más el uso entre los ;
y el /
En SQLPLUS:
-
;
significa “terminar la declaración actual, ejecutarla y almacenarla en el búfer SQLPLUS” -
<newline>
después de una declaración DML (SELECT, UPDATE, INSERT, …) o algunos tipos de declaraciones DDL (Creación de tablas y vistas) (que no contienen;
), es decir, almacene la declaración en el búfer pero no la ejecute. -
/
después de ingresar una declaración en el búfer (con un espacio en blanco<newline>
) significa “ejecutar DML o DDL o PL / SQL en el búfer. -
RUN
oR
es un comando sqlsplus para mostrar / generar el SQL en el búfer y ejecutarlo. No terminará una instrucción SQL. -
/
durante la entrada de un DML o DDL o PL / SQL significa “terminar la declaración actual, ejecutarla y almacenarla en el búfer SQLPLUS”
NOTA: Porque ;
se utilizan para PL / SQL para finalizar una declaración ;
SQLPLUS no puede usarlo para significar “terminar la declaración actual, ejecutarla y almacenarla en el búfer SQLPLUS” porque queremos que todo el bloque PL / SQL esté completamente en el búfer y luego ejecutarlo. Los bloques PL / SQL deben terminar con:
END;
/
Es una cuestión de preferencia, pero prefiero ver scripts que usan constantemente la barra; de esta manera, todas las “unidades” de trabajo (crear un objeto PL / SQL, ejecutar un bloque anónimo PL / SQL y ejecutar una declaración DML) pueden ser detectado más fácilmente a simple vista.
Además, si finalmente se cambia a algo como Ant para la implementación, simplificará la definición de objetivos para tener un delimitador de declaración coherente.