sql >> Base de Datos >  >> RDS >> Oracle

¿Con barra o sin barra?

Esa es la pregunta.

Una publicación reciente en los foros de OTN preguntó sobre el uso de puntos y comas y barras como terminadores de declaraciones. Desempolvé un artículo que escribí para nuestro equipo de desarrollo hace más de 4 años sobre este tema. Este artículo recibió buenas críticas y está disponible en los foros de OTN si lo desea. Pensé que también lo publicaría en mi blog. Aquí está el artículo:

Con barra o sin barra

por Brian Peasland

En nuestra empresa, los scripts SQL que se implementan se ejecutan en la utilidad de línea de comandos SQL*Plus de Oracle, mientras que muchos desarrolladores usan una herramienta GUI como PL/SQL Developer o SQL Developer. La barra inclinada significa algo para SQL*Plus que no es necesario en PL/SQL Developer o SQL Developer. Como tal, puede ser confuso saber si necesita incluir una barra diagonal en sus scripts SQL o no. Con suerte, esta sección arrojará algo de luz sobre lo que hace la barra diagonal, cuándo usarla y cuándo no usarla. Terminador de punto y coma Para la mayoría de las sentencias SQL, el punto y coma es el terminador de sentencia. Por ejemplo, considere esta simple instrucción SQL ejecutada en SQL*Plus:

SQL> seleccione sysdate desde dual;

FECHA DEL SISTEMA

———

18-JUN-12

Cuando SQL*Plus ve el punto y coma, sabe que se ha llegado al final de la instrucción SQL y ahora puede ejecutar el comando.

Búfer SQL*Plus

Es posible que no sepa que SQL*Plus tiene un búfer para sus comandos. Si presiono la tecla 'l' para 'lista', entonces puedo ver el comando actualmente en el búfer de mi sesión.

SQL> l

1* seleccione sysdate de dual

No es sorprendente que esté el comando que acabo de ejecutar. Luego ejecuté otra instrucción SQL y así es como se ve ahora mi búfer:

SQL> l

1 seleccione sysdate,usuario

2* de doble

Como puede ver, ahora tengo dos líneas en el búfer SQL*Plus de mi sesión.

Barra =Ejecutar búfer

La primera regla que hay que entender sobre la barra inclinada es que para SQL*Plus, la barra inclinada significa ejecutar el contenido del búfer. Para ilustrar este concepto, ejecutaré una declaración SQL, esperaré unos segundos y luego ejecutaré la misma declaración SQL nuevamente, pero solo ejecutaré el búfer.

SQL> seleccione to_char(sysdate,’MM/DD/YYYY HH24:MI:SS’) de dual;

TO_CHAR(SYSDATE,'MM

——————-

18/06/2012 15:20:40

SQL> /
TO_CHAR(SYSDATE,’MM

——————-

18/06/2012 15:21:17

SQL>

TO_CHAR(SYSDATE,'MM

——————-

18/06/2012 15:21:50

Puede ver que todo lo que hice la segunda y tercera vez fue simplemente escribir '/' y presionar enter y SQL*Plus ejecutó el contenido de su búfer de comando cada vez.

Bloques PL/SQL

El terminador de declaración de punto y coma funcionó bien por sí solo hasta que Oracle introdujo PL/SQL en la versión 7 de Oracle. El problema es que los bloques PL/SQL pueden tener múltiples puntos y coma para terminar las declaraciones individuales que componen ese bloque. Considere este bloque PL/SQL muy simple que no hace nada:

SQL> comenzar

2 nulo;

3 nulo;

4 fin;

5

Las líneas 2 y 3 contienen declaraciones perfectamente válidas que terminan con punto y coma. Y en la línea 4, tenemos la palabra clave END que significa el final del bloque PL/SQL. Si no se nos permitieran los pares BEGIN/END anidados, cada vez que SQL*Plus vea “END”; sabría que se ha llegado al final del bloque PL/SQL, pero se nos permiten pares BEGIN/END anidados, por lo que lo siguiente es perfectamente legal y válido:

SQL> comenzar

2 comenzar

3 nulo;

4 fin;

5 nulo;

6 fin;

7

Puede ver por lo anterior que solo busca "FIN"; no es suficiente porque SQL*Plus habría intentado ejecutar el bloque después de la línea 4. Entonces, ¿cómo decidió Oracle indicar que el bloque PL/SQL estaba listo para ejecutarse? La respuesta es mediante el uso de la barra inclinada como ya sabrá. La segunda regla a entender es que todo lo que hace la barra inclinada cuando la usa para finalizar un bloque PL/SQL es decirle a SQL*Plus que ejecute lo que está en el búfer. Esto no ha cambiado desde antes de que se creara PL/SQL para Oracle 7. Considere el siguiente ejemplo:

SQL> comenzar

2 nulo;

3 fin;

4 // P>

Procedimiento PL/SQL completado con éxito.

SQL> l

1 comienzo
2 nulo;

3* fin;

En la línea 4, escribí la barra diagonal para ejecutar el bloque PL/SQL. Puedes ver que mi bloque se completó con éxito. Si retrocedemos y observamos el contenido de mi búfer de comandos, puede ver que contiene todo menos la barra inclinada. La barra diagonal no forma parte del búfer de comandos. Así que ahora ejecutaré un bloque PL/SQL diferente:

SQL> comenzar

2 dbms_output.put_line(‘Hoy es ‘||to_char(sysdate,’MM/DD/YYYY HH24:MI:SS’));

3 fin;

4 // P>

Hoy es 18/06/2012 15:39:32

Procedimiento PL/SQL completado con éxito.

La barra inclinada le dice a SQL*Plus que ejecute lo que está en su búfer, y se muestran los resultados. Ahora escribamos solo la barra inclinada nuevamente y deberíamos ver que nuestro bloque PL/SQL se ejecuta nuevamente.

SQL>

Hoy es 18/06/2012 15:40:42

Procedimiento PL/SQL completado con éxito.

No tuve que escribir mi bloque PL/SQL de nuevo, ya que actualmente se encuentra en el búfer de comandos.

PL/SQL y Desarrollador SQL y Bloques PL/SQL

El mayor problema para la mayoría de los desarrolladores es que PL/SQL Developer y SQL Developer no requieren que use la barra inclinada. ¿Por qué? Porque puede presionar Ejecutar (F8) o Ejecutar script (F5) para ejecutar su bloque PL/SQL. PL/SQL Developer sabe que en el momento en que presiona F8, tiene la intención de enviar el bloque PL/SQL para que se ejecute. En este caso, F8 en PL/SQL Developer está haciendo el mismo trabajo que la barra diagonal en SQL*Plus. Del mismo modo, para F5 en SQL Developer.

El problema en mi empresa es que nuestro equipo que implementa código en producción no implementa código con PL/SQL Developer o SQL Developer. Usan SQL*Plus porque crear secuencias de comandos para múltiples ejecuciones es más fácil con una herramienta de línea de comandos. Muchos desarrolladores cometen el error de no incluir la barra inclinada para los bloques PL/SQL en los scripts porque no la necesitan, pero si desea implementar esa sección de código en un script SQL, se requiere la barra inclinada al final de cada PL. /bloque SQL.

Cuándo no usar la barra inclinada

Así que hemos visto cuándo y por qué usamos la barra diagonal, pero ¿cuándo es malo usarla? La tercera regla que debe saber es que es malo usar la barra inclinada después de una sola instrucción SQL (no en un bloque PL/SQL), especialmente cuando esa barra inclinada sigue inmediatamente a una instrucción DML (INSERTAR, ACTUALIZAR o ELIMINAR). Si mi script contiene lo siguiente:

seleccione sysdate de dual;

//P>

Luego obtendré "doble salida", que no es lo que normalmente pretendo hacer en un script. Realmente solo quiero que se devuelva una línea, no dos como lo haría el script anterior:

SQL> seleccione sysdate desde dual;

FECHA DEL SISTEMA

———

18-JUN-12
SQL> //P>

FECHA DEL SISTEMA

———

18-JUN-12

Es aún peor cuando uso la barra diagonal después de una declaración DML porque esa declaración se ejecutará dos veces. Considere la siguiente secuencia de comandos:

insertar en los valores test_tab (10);

//P>

Ahora sabemos que cuando ejecuto las dos líneas anteriores en un script, SQL*Plus lo ejecutará una vez debido al terminador de declaración de punto y coma y luego lo ejecutará una segunda vez porque la barra inclinada le dice a SQL*Plus que ejecute lo que está en el búfer de comandos. Cuando ejecuto el script de dos líneas anterior, obtengo el siguiente resultado:

SQL> insertar en valores test_tab (10);

1 fila creada.

SQL>

//P>

insertar en test_tab valores (10) *

ERROR en la línea 1:ORA-00001:restricción única (PEASLAND.SYS_C00767176) violada

¡Ups! La primera inserción funcionó (se creó 1 fila), pero cuando se ingresó la barra diagonal, SQL*Plus intentó insertar los mismos datos y quedé atrapado en una infracción de restricción única.

Conclusión

Con suerte, esta página muestra por qué se necesita la barra diagonal, qué hace y cuándo no usarla. Para recapitular:

  • Incluya la barra inclinada al final de cada bloque PL/SQL
  • No incluya la barra inclinada después de cualquier instrucción SQL que no esté en un bloque PL/SQL.
  • La barra inclinada después de una sola instrucción SQL hará que el comando SQL se ejecute dos veces.