transponer - ¿Cuándo debo usar un punto y coma en lugar de una barra en Oracle SQL?
pivot oracle ejemplos (6)
Casi todas las implementaciones de Oracle se realizan a través de SQL * Plus (esa extraña y pequeña herramienta de línea de comandos que usa su DBA). Y en SQL * Plus, una barra solitaria básicamente significa "volver a ejecutar el último comando SQL o PL / SQL que acabo de ejecutar".
Ver
La regla de oro sería usar barras con las cosas que BEGIN .. END
o donde puedes usar CREATE OR REPLACE
.
Para inserciones que deben ser de uso exclusivo
INSERT INTO my_table ()
SELECT <values to be inserted>
FROM dual
WHERE NOT EXISTS (SELECT
FROM my_table
WHERE <identify data that you are trying to insert>)
Hemos estado debatiendo esta semana en mi compañía sobre cómo debemos escribir nuestros scripts SQL.
Antecedentes: nuestra base de datos es Oracle 10g (actualizando a 11 pronto). Nuestro equipo de DBA usa SQLPlus para implementar nuestros scripts en la producción.
Ahora, tuvimos una implementación recientemente que falló porque había usado un punto y coma y una barra inclinada ( /
). El punto y coma se encontraba al final de cada instrucción y la barra inclinada se encontraba entre las declaraciones.
alter table foo.bar drop constraint bar1;
/
alter table foo.can drop constraint can1;
/
Hubo algunos activadores que se agregaron más adelante en el script, algunas vistas creadas y algunos procedimientos almacenados. Tener ambos ;
y /
causó que cada instrucción se ejecutara dos veces, lo que provocó errores (especialmente en las inserciones, que debían ser únicas).
En SQL Developer esto no ocurre, en TOAD esto no sucede. Si ejecuta ciertos comandos, no funcionarán sin /
en ellos.
En PL / SQL si tiene un subprograma (DECLARE, BEGIN, END), el punto y coma utilizado se considerará como 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? Como sabe que su base de datos es Oracle, ¿siempre debería usar el /
?
Desde mi punto de vista, toda la declaración SQL no necesita barra inclinada, ya que se ejecutará automáticamente al final de punto y coma, incluidas las sentencias DDL, DML, DCL y TCL.
Para otros bloques PL / SQL, incluidos Procedimientos, Funciones, Paquetes y Disparadores, debido a que son programas de múltiples líneas, Oracle necesita una forma de saber cuándo ejecutar el bloque, por lo que debemos escribir una barra inclinada al final de cada bloque para deja que Oracle lo ejecute.
Es una cuestión de preferencia, pero prefiero ver scripts que utilicen sistemáticamente la barra diagonal; de esta forma, todas las "unidades" de trabajo (creando un objeto PL / SQL, ejecutando un bloque anónimo PL / SQL y ejecutando una instrucción DML) pueden ser elegido más fácilmente a simple vista.
Además, si finalmente se mueve a algo como Ant para la implementación, simplificará la definición de objetivos para tener un delimitador de enunciado coherente.
Quería aclarar un poco más de uso entre los ;
y el /
En SQLPLUS:
-
;
significa "finalizar la declaración actual, ejecutarla y almacenarla en el búfer SQLPLUS" -
<newline>
después de una instrucción DML (SELECT, UPDATE, INSERT, ...) o algunos tipos de sentencias DDL (Creating Tables and Views) (que no contienen;
), es decir, almacena la declaración en el búfer pero no se ejecuta eso. -
/
después de ingresar una declaración en el buffer (con un<newline>
blanco) significa "ejecutar el DML o DDL o PL / SQL en el buffer". -
RUN
oR
es un comando sqlsplus para mostrar / dar salida al SQL en el búfer y ejecutarlo. No terminará una declaración SQL. -
/
durante la introducción de un DML o DDL o PL / SQL significa "finalizar la declaración actual, ejecutarla y almacenarla en el búfer SQLPLUS"
NOTA: Porque ;
se usan para PL / SQL para finalizar una declaración ;
no puede ser utilizado por SQLPLUS 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;
/
Sé que este es un hilo viejo, pero me topé con él y siento que esto no ha sido explicado por completo.
Hay una gran diferencia en SQL * Plus entre el significado de a /
y a ;
porque funcionan de manera diferente.
El ;
finaliza una instrucción SQL, mientras que /
ejecuta lo que está en el "buffer" actual. Entonces cuando usas a ;
y a /
la declaración se ejecuta en realidad dos veces.
Puedes ver fácilmente que al usar un /
después de ejecutar un enunciado:
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 realmente nota el error.
Pero suponiendo que hay 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
El /
se requiere principalmente para ejecutar sentencias que tienen incrustado ;
como una declaración CREATE PROCEDURE
.
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 el medio de un script, no uso una barra inclinada.