miércoles, 24 de mayo de 2017

Depurando Triggers

Objetivos:

 Describir los componentes de la Consola de Depuración (Debug Console).
 Utilizar el botón Run Form Debug.
 Depurar código PL/SQL.

NOTA: Usamos como ejemplo la Base de Datos: ORCL, la cual viene por defecto en cualquier versión de ORACLE.
______________________________________________________________________________________
El Proceso de Depuración.
A medida que empiece a definir Triggers y a agregar código al Form, encontrará que a veces obtiene resultados incorrectos o inesperados. En una aplicación grande, puede ser difícil determinar la fuente del problema.

Puede utilizar el depurador integrado de PL/SQL en Forms Builder para localizar y corregir errores de codificación. A continuación mostramos como.

Puede supervisar y depurar Triggers de varias maneras:
 Compilación: Los errores de sintaxis y de referencia de objetos (incluidas las referencias a objetos de base de datos) se informan al compilar un Trigger o generar el módulo Form. Esto le permite corregir estos problemas en el Editor PL/SQL antes de ejecutar la aplicación.

 Ejecutando el Form con el parámetro debug_messages = Yes: En el modo de depuración, puede solicitar que se muestren mensajes para indicar cuándo se disparan los Triggers. Esto le ayuda a ver si ciertos Triggers se están disparando, su origen y nivel, y el momento en que disparan. Si se produce un error, puede ver el último Trigger que disparó y así reducir el alcance del origen del error.

 Invocando del depurador de PL/SQL (PL/SQL Debugger): Puede invoca el depurador de Forms Builder haciendo clic en Run Form Debug en la barra de herramientas.

Con el depurador puede supervisar la ejecución del código dentro de un Trigger (y otras unidades de programa). Puede recorrer el código línea por línea, y puede supervisar subprogramas y variables invocadas a medida que lo hace. También puede modificar variables a medida que se ejecuta el Form, lo que le permite comprobar cómo varios cambios en los valores de los Items y los valores de las variables afectarán a su aplicación.
______________________________________________________________________________________
La Consola de Depuración.
La consola de depuración es un espacio de trabajo en Forms Builder que le permite ver varios aspectos del Form en ejecución y su entorno. Puede mostrar la consola de depuración seleccionando en el menú: Debug>Debug Console. Se muestra automáticamente cuando encuentra un punto de interrupción (Breakpoint )  en un Form el cual se ejecuta en modo de depuración.

Dentro de la consola, puede mostrar varios tipos de paneles: Pila (Stack), Variables, Vigilancia, Valores del Form, Breakpoints, Paquetes de PL/SQL, Variables globales y de sistema. Puede cambiar el tamaño de la consola de depuración y cualquiera de los paneles que se muestran en ella.
Puede elegir qué paneles mostrar o cerrar haciendo clic en los botones de la barra de herramientas de la Consola de depuración o seleccionando Debug>Debug Windows en el menú. Al mostrar y ocultar paneles dentro de la consola, los paneles se expanden y se contraen automáticamente para llenar la consola.

Puede desacoplar cualquiera de los paneles para mostrarlos fuera de la Consola de depuración haciendo clic en la flecha hacia arriba que se encuentra en la parte superior derecha del panel; Para re-acoplar el panel haga clic en la flecha hacia abajo.

Si hace clic con el botón derecho en el área situada junto a la flecha de acoplamiento/desacoplamiento, aparecerá un menú emergente que le permitirá ocultar, acoplar o desacoplar el panel.





La Consola de Depuración: Panel de Pila (Stack Panel).
La Pila de Llamadas (Stack Call) representa la cadena de subprogramas que comienza desde el punto de entrada inicial hasta el subprograma en ejecución. En la imagen anterior, el subprograma que se encuentra en ejecución es EMPLOYEES.SAL.CHECK_PCT, el cual fue llamado por EMPLOYEES.SAL.GET_SAL, el cual a su vez fue llamado desde un Trigger When-Button-Pressed (punto de entrada inicial de la pila de llamadas actual). Como puede ver, los marcos se enumeran en el orden inverso en el que se ejecutaron los subprogramas. El primer cuadro está en la parte inferior de la pila, mientras que el último cuadro está en la parte superior.

Un Marco de Pila o Stack Frame contiene información sobre el subprograma correspondiente, incluyendo el nombre del módulo, el nombre del paquete si existe, el nombre del subprograma y la siguiente instrucción que se va a ejecutar. Por ejemplo, EMPLOYEES.SAL.GET_SAL::19 indica que la línea 19 del subprograma GET_SAL del paquete SAL contenida en el módulo EMPLOYEES se ejecutará cuando la aplicación vuelva a ese subprograma. Cuando esto ocurra, el marco EMPLOYEES.SAL.CHECK_PCT se eliminará de la pila porque el subprograma EMPLOYEES.SAL.CHECK_PCT ha terminado de ejecutarse.

La Consola de Depuración: Panel de Variables (Variables Panel).
El Panel de Variables muestra las variables (y sus valores) del Stack Frame actual. Hay una lista emergente desde la que puede seleccionar el Stack Frame cuyas variables desea ver. También puede cambiar las variables mostradas en el Panel de Variables haciendo clic en un Stack Frame diferente del Stack Panel. Esto no cambia el orden de ejecución de las sentencias del programa, sólo cambia la información que se muestra en la consola de depuración.

Una característica del depurador es que cuando se suspende el Form, puede cambiar los valores de las variables haciendo clic en la columna de valores e ingresando un nuevo valor. Cuando el programa continúa, utilizará el nuevo valor que ha introducido, de modo que pueda probar el efecto de cambiar un valor en el resultado final.

Algunas variables, como parámetros, no pueden modificarse. Al hacer clic en una variable de sólo lectura, se resalta toda la celda. Al hacer clic en una variable modificable se resaltará sólo el valor, no toda la celda.

La Consola de Depuración: Panel de Vigilancia.
Una aplicación en ejecución puede tener decenas de variables que se pueden mostrar en varios paneles de la consola de depuración, pero puede haber muy pocas que necesita supervisar. El Panel de Vigilancia (Watch Panel) proporciona un lugar central donde puede realizar un seguimiento de las variables válidas que especifique. Solamente las variables que resuelven a un valor escalar son válidas. Las variables de un paquete almacenado no son válidas.

Una vez que se muestra una variable en la Lista de Vigilancia, cuando la ejecución se suspende en una ubicación diferente, los valores de la variable en la lista se actualizan según sea necesario si están disponibles en el contexto de ejecución actual. Si una variable no está definida en el subprograma en ejecución, #### aparece en la celda en lugar de un valor.

Para agregar una variable al Panel de Vigilancia, realice los pasos siguientes:
1. Abra la ventana donde se muestra la variable.
2. Seleccione la variable que desea agregar.
3. Haga clic con el botón derecho del ratón en la selección y seleccione Add to Watch.
Para eliminar un Item del Panel de Vigilancia:
 Selecciónelo en el Panel de Vigilancia, haga clic con el botón derecho del ratón y elija Remove.
 Para borrar todo, elija Remove all.

La Consola de Depuración: Panel de Valores del Form.
Puede utilizar el Panel de Valores del Form (Form Values Panel) para mostrar los valores de todos los Items y Parámetros en los módulos que se están ejecutando actualmente. Cambia entre una vista de Items y una vista de parámetros haciendo clic en las pestañas correspondientes del panel.

Puede cambiar los valores de los Items modificables para probar los efectos de dichos cambios. Si el valor es de sólo lectura, como es el caso de los Display Items, la celda completa se resalta cuando intenta editarlo. Si el valor es modificable, sólo se resalta el valor en la celda.

La Consola de Depuración: Panel de Paquetes PL/SQL.
Utilice el Panel Paquetes de PL/SQL para examinar los paquetes que han sido instanciados. Se enumeran tanto las variables globales del paquete como las definidas en la especificación del mismo. Sólo puede ver los paquetes mientras el proceso de ejecución está ejecutando PL/SQL. También puede seleccionar un botón de opción para determinar qué paquetes se muestran: Cliente, Servidor o Todos.

La Consola de Depuración: Panel de Variables Globales/Sistema.
Utilice el Panel de Variables Globales o de Sistema para mostrar los valores de las Variables del Sistema, Globales y de Línea de Comandos. Puede cambiar entre estos tipos de variables haciendo clic en las pestañas correspondientes del panel.

Las variables de Línea de Comandos y la mayoría de las variables del sistema son de sólo lectura. Las únicas variables de sistema modificables son DATE_THRESHOLD, EFFECTIVE_DATE, MESSAGE_LEVEL y SUPPRESS_WORKING. Puede modificar variables globales para que los nuevos valores serán utilizados posteriormente por la aplicación en ejecución.

La Consola de Depuración: Panel de Breakpoints.
El Breakpoints Panel consta de dos pestañas:
 La Pestaña de Breakpoints muestra los puntos establecidos en el código durante la sesión actual de Forms Builder, en orden de creación.
---Nombre del Trigger o Unidad de Programa.
---Número de línea donde se establece el punto.
---Una casilla de verificación para activar o desactivar temporalmente el punto.
 Habilita la navegación al código fuente donde está establecido el punto:
---Haciendo doble clic en el nombre del punto
---Resaltar (un solo clic), y luego Right-Clic para elegir View Source Code en el menú emergente. Desde este menú emergente, también puede eliminar el o los puntos.
 La Pestaña Break On Exceptions muestra una lista de las excepciones del sistema utilizadas con frecuencia que puede utilizar durante la depuración. La pantalla incluye:
---Nombre de la excepción.
---Número de error ORA asociado.
---Una casilla de verificación para activar o desactivar  el punto.
______________________________________________________________________________________
Establecimiento Breakpoints en el Código Cliente.
Se establecen Breakpoints en el código para que en Modo de Depuración Form detenga la ejecución cada vez que encuentre uno de estos puntos dando así el control al Depurador de Forms Builder, permitiendole supervisar o cambiar el entorno en ese punto. Cuando establece un punto, este permanece hasta que salga de la sesión Forms Builder. Puede habilitar y inhabilitar puntos de interrupción según sea necesario marcando o desmarcando la casilla de verificación en el Breakpoints Panel de la Consola de Depuración.

Sólo puede establecer puntos en líneas de código ejecutables, como asignaciones o llamadas de subprograma.
Maneras de establecer Breakpoints:
 Haciendo doble clic a la izquierda de una línea de código en el Editor PL/SQL.
 Haciendo clic con el botón secundario en una línea de código y seleccionando Insert/Remove Breakpoint.
 Seleccionando Debug>Insert/Remove Breakpoint desde el menú principal.
Realizar la misma acción nuevamente desactiva el Breakpoint. También puede eliminar uno o todos los puntos mediante el Breakpoints Panel.

Establecimiento Breakpoints en un Código Almacenado (Stored Code).
Si está conectado a la base de datos, puede establecer Breakpoints en paquetes, procedimientos y funciones, tal como lo hace en los subprogramas del lado del cliente.
Para hacerlo:
1. Expanda el nodo Database Objects.
2. Navegue hasta el subprograma almacenado.
3. Carguelo en el Editor de PL/SQL.

Nota: No puede establecer Breakpoints en Triggers de base de datos o librerías de PL/SQL almacenadas.

Si la Unidad de Programa no aparece en un Stack Frame o si no puede verlo mientras pasa a través de su código, es porque el mismo no se ha compilado con la información de depuración incluida. Existen tres métodos para compilar la unidad de programa almacenada con información de depuración:
 Cree el procedimiento almacenado en Forms Builder, de esta manera se crea con información de depuración.
 Utilice ALTER SESSION SET PLSQL_DEBUG = TRUE; antes de crear el procedimiento almacenado.
 Recompile manualmente la unidad de programa PL/SQL existente utilizando:
ALTER PROCEDURE <schema.procedure> COMPILE DEBUG;

Consejos Generales (Tips) para resolver Problemas con los Triggers.
Asegúrese de que está conectado a la base de datos (correcta) cuando compila Triggers que contienen SQL. Los mensajes de error pueden ser engañosos.

El Editor PL/SQL informa cual es la línea en se produce la falla, pero el error puede deberse a una dependencia de una línea de código anterior.

Los puntos y coma perdidos (;) y las comillas no coincidentes son una causa común de errores de compilación. Compruebe si un error de compilación no da una indicación obvia al problema.

Si un Trigger parece disparar con demasiada frecuencia, en un bloque o Item incorrecto del Form, debe verificar si dicho Trigger está definido en el nivel requerido. Por ejemplo, un Trigger When-Validate-Item a nivel de Form se activa para cada Item cambiado en el Form. Para comprobar esto, puede ejecutar el Form con los Mensajes de Depuración Activados (Debug Messages On).

Para los Triggers que rellenan otros Items, asegúrese de que pertenezcan al objeto en el que se producirá el evento de disparo, no en los Items que se van a rellenar.

Ejecución de un Form en Modo de Depuración.
En Forms Builder el botón Run Form Debug ejecuta la aplicación en modo de depuración. Cuando se encuentra un Breakpoint y el control pasa al depurador, puede utilizar ciertos comandos para reanudar la ejecución o recorrer el código de varias maneras y así ver cómo cada línea afecta a la aplicación y al entorno.

Al igual que cuando ejecuta un Form con el botón Run Form (), el botón Run Form Debug () ejecuta la aplicación en un entorno de tres niveles. Lo hace tomando su configuración de la ventana de Preferencias (Preferences) a la que accede seleccionando Edit>Preferences desde el menú principal y haciendo clic en la pestaña Runtime.
Introduzca la dirección URL del Servidor de Aplicaciones donde desea ejecutar el Form, la cual a su vez se ejecuta en el explorador predeterminado, a menos que especifique un navegador diferente en Ubicación del explorador Web. Si lo desea, puede usar una configuración especifica, con el parámetro config.

Ejemplo de un URL del Servidor de Aplicaciones:
Http://mymachine:8889/forms90/f90servlet?Config=test
Donde test es una sección en el archivo de configuración Forms Web (formsweb.cfg de forma predeterminada) que especifica la configuración a utilizar.

Pasando a Través del Código.
Una vez que el programa encuentra un Breakpoint, el Depurador PL/SQL le permite recorrer las unidades de programa de varias maneras para examinar el entorno a medida que avanza el programa, esto se logra utilizando los siguientes botones:
 Step Into: Ejecuta la siguiente instrucción.
 Step Over: Ejecuta la siguiente instrucción sin entrar en un subprograma anidado.
 Step Out: Completa el subprograma anidado y pasa a la siguiente sentencia ejecutable en el programa del que fue llamado.
 Go: Reanuda la ejecución hasta que el programa termina de manera normal o hasta que sea interrumpido por el siguiente Breakpoint.
 Pause: Hace una pausa en la ejecución del código PL/SQL en ejecución para permitirle examinar el entorno. Por ejemplo, puede comprobar los valores de las variables.
 Stop: Finaliza la depuración y la ejecución del programa por completo; La consola de depuración y todos los paneles de depuración abiertos se cierran y la ejecución de la aplicación finaliza.
Otro comando, disponible en el menú de depuración, es Run to Cursor. Cuando inserta el cursor del ratón en una línea de código en el Editor PL/SQL (haciendo clic en él), el comando Run to Cursor ejecuta todo el código hasta esa línea, luego se detiene y marca esa línea como la siguiente línea ejecutable de código.
______________________________________________________________________________________
Ejemplo de Depuración.
Este ejemplo simple demuestra algunas de las características básicas disponibles en el depurador. El Form de ejemplo consta de dos Text Items, un Display Item y un botón con un Trigger When-Button-Pressed. El código funciona de la siguiente manera:
1. El usuario debe introducir valores numéricos en los Text Items: InferiorSuperior y luego presionar el Botón Generar.
2. El Trigger (del Botón Generar) valida que ambos campos contengan valores, para luego llamar al procedimiento proc_generate.
3. El procedimiento proc_generate se encarga de llamar a la función func_between pasándole los valores contenidos en los Text Items antes mencionados a los parámetros p_up y p_down.
4. La función func_between invoca a su vez a la función VALUE del paquete DBMS_RANDOM (de Base de Datos), para luego retornar el valor obtenido truncado (sin decimales).
5. Al finalizar el proceso de la función func_between, el Control retorna al procedimiento proc_generate donde se procede a limpiar los valores introducidos por el usuario y luego asignar al Display Item el valor obtenido.

Ejemplo:
Trigger When-Button-Pressed:
BEGIN
IF :BLCK_CONTROL.LOWER_BOUND IS NULL OR :BLCK_CONTROL.UPPER_BOUND IS NULL THEN
MESSAGE('Debe especificar tanto el valor inferior como el superior.');
MESSAGE('Debe especificar tanto el valor inferior como el superior.');
ELSE
proc_generate;
END IF;
END;
---
Procedimiento proc_generate:
PROCEDURE proc_generate IS
v_result NUMBER;
v_up NUMBER;
v_down NUMBER;
BEGIN
  v_up := :BLCK_CONTROL.UPPER_BOUND;
  v_down := :BLCK_CONTROL.LOWER_BOUND;
  v_result := func_between(v_up, v_down);

  :BLCK_CONTROL.UPPER_BOUND := NULL;
  :BLCK_CONTROL.LOWER_BOUND := NULL;

:BLCK_CONTROL.RESULT := v_result;
END;
---
Función func_between:
FUNCTION func_between(
p_up IN NUMBER,
p_down IN NUMBER
    ) RETURN NUMBER IS
v_total NUMBER := 0;
BEGIN
v_total := DBMS_RANDOM.VALUE(p_down,p_up);
RETURN TRUNC(v_total);
END func_between;
---
Proceso de Depuración:
1. Establezco mi Breakpoint y ejecuto y Form con el Botón: Run Form Debug.
2. Una vez ejecutada la aplicación introduzco los valores 15 y 39 para los Límites Inferior y Superior respectivamente, luego presiono el Botón Generar:
3. Form Builder ejecuta el código contenido en el Trigger y detiene el proceso una vez encuentra el Breakpoint antes establecido:
Notar como en el Panel Form Values es posible visualizar los valores introducidos por el usuario.
4. Luego con el ayuda del botón Step Into:(Ubicado en la barra de Herramientas de Form en modo de depuración) es posible avanzar (Flecha Amarilla:) a través del código a medida que avanza la ejecución:
Notar como cambia la vista del código al hacer clic en los Stack Frames.
5. Para continuar solo tenemos que seguir recorriendo el código con los botones disponibles en la barra de herramientas de form en modo de depuración:
La anterior imagen muestra el Panel de la variables del bloque que esta siendo recorrido.
Resultado:
______________________________________________________________________________________
Ajunto el Módulo Form creado para esta práctica: Link.
______________________________________________________________________________________
Fuente: Oracle Forms Developer 10g: Build Internet Applications.