Hemos tenido un debate esta semana en mi compañía sobre cómo debemos escribir nuestros scripts SQL.
Antecedentes: nuestra base de datos es Oracle 10g (se actualizará a 11 pronto). Nuestro equipo de DBA utiliza SQLPlus para implementar nuestros scripts en producción.
Ahora, tuvimos un despliegue recientemente que falló porque había usado tanto un punto y coma como una barra diagonal ( /
). El punto y coma estaba al final de cada declaración y la barra inclinada estaba entre declaraciones.
alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/
Hubo algunos desencadenantes que se agregaron más adelante en el script, se crearon algunas vistas y algunos procedimientos almacenados. Tener tanto el ;
y el /
causó que cada instrucción se ejecute dos veces causando errores (especialmente en las inserciones, que debían ser únicas).
En SQL Developer esto no sucede, en TOAD esto no sucede. Si ejecuta ciertos comandos, no funcionarán sin /
ellos.
En PL / SQL si tiene un subprograma (DECLARE, BEGIN, END), el punto y coma utilizado se considerará parte del subprograma, por lo que debe usar la barra diagonal.
Entonces mi pregunta es esta: si su base de datos es Oracle, ¿cuál es la forma correcta de escribir su script SQL? Ya que sabe que su base de datos es Oracle, ¿debe usar siempre el /
?
sqlterminator
a!
si lo desea) y esta convención tiende a ser seguido por otras herramientas. Sin embargo, el lenguaje PL / SQL usa punto y coma como elemento de sintaxis obligatoria.Respuestas:
Es una cuestión de preferencia, pero prefiero ver secuencias de comandos que usen sistemáticamente la barra diagonal - 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 elegido más fácilmente a simple vista.
Además, si eventualmente se muda a algo como Ant para su implementación, simplificará la definición de objetivos para tener un delimitador de enunciado consistente.
fuente
/
ni;
ve la respuesta de @a_horse_with_no_name o @Mr_Moneybags para más contextoSé que este es un hilo viejo, pero me topé con él y siento que esto no se ha explicado por completo.
Hay una gran diferencia en SQL * Plus entre el significado de a
/
y a;
porque funcionan de manera diferente.Los
;
extremos de una sentencia SQL, mientras que las/
ejecuta lo que está en la corriente "buffer". Así que cuando se utiliza una;
y una/
la declaración es en realidad ejecuta dos veces.Puede verlo fácilmente usando un
/
después de ejecutar una declaración:En este caso, uno realmente nota el error.
Pero suponiendo que haya un script SQL como este:
Y esto se ejecuta desde SQL * Plus, entonces esto será muy confuso:
Se
/
requiere principalmente para ejecutar declaraciones que se han incrustado;
como unaCREATE PROCEDURE
declaración.fuente
;
), entonces debe encontrar una manera de especificar un delimitador alternativoQuería aclarar un poco más de uso entre el
;
y el/
En SQLPLUS:
;
significa "terminar la declaración actual, ejecutarla y almacenarla en el búfer SQLPLUS"<newline>
después de una instrucción DML (SELECCIONAR, ACTUALIZAR, INSERTAR ...) o algunos tipos de instrucciones DDL (Creación de tablas y vistas) (que no contienen;
), significa, almacenar la instrucción en el búfer pero no ejecutarla./
después de ingresar una declaración en el búfer (con un espacio en blanco<newline>
) significa "ejecutar el 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 declaració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: Debido a que
;
se usan para que PL / SQL termine una declaración,;
SQLPLUS no puede usar 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 buffer, luego ejecútelo. Los bloques PL / SQL deben terminar con:fuente
Casi todas las implementaciones de Oracle se realizan a través de SQL * Plus (esa pequeña y extraña herramienta de línea de comando que utiliza su DBA). Y en SQL * Plus, una barra inclinada básicamente significa "volver a ejecutar el último comando SQL o PL / SQL que acabo de ejecutar".
Ver
La regla general sería usar una barra diagonal con cosas que hacen
BEGIN .. END
o dónde puedes usarCREATE OR REPLACE
.Para insertos que necesitan ser de uso único
fuente
Según tengo entendido, todas las declaraciones SQL no necesitan barra diagonal, ya que se ejecutarán automáticamente al final de los puntos y comas, incluidas las declaraciones DDL, DML, DCL y TCL.
Para otros bloques PL / SQL, incluidos procedimientos, funciones, paquetes y disparadores, debido a que son programas de varias líneas, Oracle necesita una forma de saber cuándo ejecutar el bloque, por lo que debemos escribir una barra diagonal al final de cada bloque para deja que Oracle lo ejecute.
fuente
Solo uso la barra diagonal una vez al final de cada script, para decirle a sqlplus que no hay más líneas de código. En medio de un script, no uso una barra inclinada.
fuente