sábado, 13 de julio de 2024

Ejecutar y depurar un paquete de Oracle con PL/SQL Developer

Vamos a aprender a ejecutar paquetes de Oracle desde PL/SQL Developer, si aun así no nos sirve y queremos ver lo que hace por dentro, podemos depurarlo.

Ejecutar

Para ejecutar un paquete hay que compilarlo antes en el PL/SQL para que coja la información de compilación.  Desde la pestaña de la izquierda de objetos

Ejecutar y depurar un paquete de Oracle con PL/SQL Developer


Nos colocamos sobre  el objeto a depurar y con el botón derecho del ratón pulsamos Edit Spec & body

 

PL/SQL Developer Edit Spec & body

Esto nos abre una pantalla con el paquete de Oracle, es necesario compilarla ejecutando el triángulo verde para que pueda reconocerla luego el depurador.

 

ejecutar PL/SQL Developer


Hecho esto abrimos una ventana de test

ventana test PL/SQL Developer

Y le ponemos la llamada al paquete

BEGIN

    PAQUETE.FUNCION

END

Si es una función hay que declarar una variable que tome lo que devuelve

declare

  resultado varchar2(20);

begin

resultado:= rd_funciones_clientes.F_DAME_FILTRO_FECHAS_OTIF('6-6-2023','9-6-2023','BRR',1);

end;

Es importante que elijamos Package bodies (si cogemos Package) solo muestra las definiciones y no entra en el código.   Ejecutamos pulsando el botón verde triangular

 

package bodies

Para poner los puntos de ruptura hay que posicionarse en los números de línea y pulsar el botón derecho del ratón.

puntos de ruptura PL/SQL Developer


Para depurar paso a paso

Cerramos la test window que abrimos en el paso anterior y nos colocamos sobre la función del paquete a depurar que se abrió al pulsar sobre Edit Spec & body.

Con el botón derecho del ratón sobre los números de la izquierda

podemos colocar puntos de ruptura para que se pare la ejecución en esos puntos.

punto de ruptura PL/SQL Developer

Comenzamos la ejecución pulsando sobre el triángulo verde. La línea actual se muestra en azul.

 

ejecutar PL/SQL Developer

Vamos paso a paso pulsando sobre las flechas de la toolbar 

 

barra de depuración PL/SQL Developer

Si no pasa por la función definida posiblemente se nos ha olvidado compilarla (ver más arriba)

Podemos ver el valor que van tomando las variables escribiendo su nombre en la ventana inferior

 

barra de depuración PL/SQL Developer

Para acceder a ella ejecutando paso a paso desde la carga del interfaz podemos poner un punto de ruptura en la función a depurar.  

Ojo, si no para es porque no entra en la función y hay que revisar la condiciones de llamada a la función

Si no cumple estas condiciones, nunca llama a la función definida y no podremos depurarla.


sábado, 6 de julio de 2024

Clausula UNION en SQL

Esta clausula sirve para combinar los resultados de dos o más consultas.

SELECT * FROM jefe WHERE departamento = 'Ventas'  UNION SELECT * FROM empleado WHERE departamento = 'Ventas';

Como se puede ver, primero seleccionamos todos los jefes del departamento de ventas y luego, utilizamos la palabra clave UNION para añadir todos los empleados del departamento de ventas.

Clausula UNION en SQL

¿Podríamos dividir esta instrucción en dos consultas distintas? Sí. Pero, utilizando una UNION, obtenemos, juntos, todos los resultados de la primera tabla más todos los resultados de la segunda tabla.

Requisitos para usar UNION. Para que los resultados puedan combinarse en una sola tabla, las dos tablas deben tener el mismo número de columnas. También debemos recordar que sus columnas respectivas deben tener almacenado el mismo tipo de dato (número o texto).

Si, por ejemplo, en la columna lugar, una de tus tablas tiene almacenados números (1, 2, 3) y, la otra, tiene textos ("primero", "segundo", "tercero"), no funcionará.

Clausula UNION ALL

De forma predeterminada, UNION elimina las filas duplicadas. Por suerte, esto se puede cambiar. Solo hay que escribir UNION ALL en lugar de UNION en la consulta

SELECT * FROM jefe WHERE departamento = 'Ventas'  UNION ALL SELECT * FROM empleado WHERE departamento = 'Ventas';

... para obtener todas las filas, aunque sean iguales. Es decir haya empleados que aparezcan como jefe y como empleado.

Clausula INTERSECT

SELECT * FROM jefe WHERE departamento = 'Ventas'  INTERSECT SELECT * FROM empleado WHERE departamento = 'Ventas';

En lugar de UNION (o UNION ALL), escribimos INTERSECT. ¿Cuál es la diferencia?

UNION devuelve todos los resultados de la primera consulta más los resultados de la segunda. INTERSECT, en cambio, solo muestra las filas que están en AMBAS tablas.

En este caso, obtendríamos los empleados que a su vez son jefes del departamento de Ventas.

Los requisitos aquí siguen siendo los mismos: el número de columnas de ambas tablas debe ser el mismo y los tipos de valores (número o texto) deben coincidir.

Clausula EXCEPT

SELECT * FROM jefe WHERE departamento = 'Ventas'  EXCEPT SELECT * FROM empleado WHERE departamento = 'Ventas';

Muestra todos los resultados de la primera tabla (la anterior a EXCEPT), excepto los resultados que también aparecen en la segunda tabla (la posterior a EXCEPT).

En nuestro ejemplo, veremos todas los empleados, MENOS los jefes  aparezcan también en la tabla de empleados.