CodeGym /Cursos /SQL SELF /Depuración de PL/pgSQL con pgAdmin: breakpoints, visualiz...

Depuración de PL/pgSQL con pgAdmin: breakpoints, visualización de variables

SQL SELF
Nivel 56 , Lección 0
Disponible

Bueno, ya escribiste tu primer procedimiento o función, la ejecutaste, pero algo salió mal. Claro, puedes meter un montón de RAISE NOTICE para entender dónde exactamente "el barco encalló". ¡Pero! ¿Para qué sufrir si tenemos pgAdmin con su debugger integrado?

pgAdmin te permite ejecutar el código paso a paso, poner breakpoints, ver los valores de las variables y buscar las causas de los errores. Es literalmente tu "kit de detective" para investigar el misterio de: "¿Por qué mi consulta no funciona?".

¿Para qué sirve depurar con pgAdmin?

A veces los bugs internos de los procedimientos están tan escondidos que intentar entenderlos solo con logs o texto en la terminal es un suplicio. Justo aquí ayuda la depuración paso a paso, cuando ves todo lo que pasa en cada etapa de la función. Imagínate que es como montar un puzzle complicado, pero con pistas.

Con la depuración en pgAdmin puedes:

  1. Poner breakpoints — son lugares donde la ejecución del código se detiene para que puedas analizar su estado actual.
  2. Recorrer el código SQL paso a paso — literalmente ver qué sentencia se ejecuta en cada momento.
  3. Ver los valores de las variables en tiempo real — asegurarte de que los datos se pasan y procesan correctamente.
  4. Encontrar el lugar donde ocurrió el error y entender su causa.

¿Cómo empezar? Preparando la depuración en pgAdmin

Antes de lanzarte a depurar, vamos a asegurarnos de que todo está bien configurado.

Activar la extensión plpgsql

Asegúrate de que el lenguaje PL/pgSQL está activado en tu base de datos:

CREATE EXTENSION IF NOT EXISTS plpgsql;

Este lenguaje suele estar activado por defecto en PostgreSQL, pero mejor comprobarlo.

Asegúrate de tener pgAdmin versión 4 o superior (es la que soporta el debugger). Si aún no lo tienes, puedes descargar pgAdmin desde la web oficial.

Instalar la extensión pldbgapi

Para activar la depuración de PL/pgSQL en pgAdmin, tienes que activar la extensión pldbgapi:

CREATE EXTENSION IF NOT EXISTS pldbgapi;

Esta extensión está hecha especialmente para interactuar con el debugger.

¡Muy importante! Asegúrate de tener permisos de administrador en el servidor PostgreSQL para ejecutar esta consulta.

Bases de la depuración: poner breakpoints

Los breakpoints son lugares especiales en el código donde la ejecución del procedimiento o función se detiene para que puedas mirar dentro del proceso. Es como una parada corta en un viaje largo: te detienes, miras el mapa, revisas todo y luego sigues.

¿Cómo poner un breakpoint en pgAdmin?

  1. Abre pgAdmin y conéctate a tu base de datos.
  2. Busca tu función o procedimiento en el árbol de objetos: Functions<tu esquema><tu función>.
  3. Haz clic derecho en la función y elige Debugging → Debug. Esto lanzará el debugger.
  4. En la ventana que se abre con el código de la función, busca la línea donde quieres empezar a depurar y haz clic en el margen izquierdo de esa línea. Verás un círculo rojo — ese es el breakpoint.

Así se ve:

CREATE OR REPLACE FUNCTION example_function(id INTEGER)
RETURNS VOID AS $$
BEGIN
    RAISE NOTICE 'Has seleccionado id: %', id;
    -- Aquí puedes poner un breakpoint
    PERFORM some_operation(id);
END;
$$ LANGUAGE plpgsql;

Después de poner el breakpoint, puedes ejecutar tu función y la ejecución se detendrá justo ahí. Ahora puedes revisar los valores de las variables, los resultados de las sentencias anteriores y, por supuesto, seguir ejecutando el código.

Visualización de variables en pgAdmin

Saber que tu código se ha parado está bien. Pero mucho mejor es entender qué datos hay en memoria en ese momento. Por ejemplo:

  • Qué valores tienen los parámetros de entrada.
  • Cómo han cambiado las variables después de ejecutar un bloque.
  • Qué devolvió la consulta a la base.

¿Cómo ver los valores de las variables?

Cuando la ejecución de la función se detiene en un breakpoint:

  1. Ve a la pestaña Variables en la parte inferior de la ventana del debugger.
  2. Ahí verás la lista de todas las variables y sus valores actuales.

Por ejemplo, tenemos la función:

CREATE OR REPLACE FUNCTION calculate_discount(price NUMERIC, discount NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
    discounted_price NUMERIC;
BEGIN
    discounted_price := price - (price * discount / 100);
    RETURN discounted_price;
END;
$$ LANGUAGE plpgsql;

Si pones un breakpoint en la línea con discounted_price, el debugger mostrará que las variables price y discount ya tienen valores, pero discounted_price aún está vacía.

Así se ve la lista de variables tras la parada:

Variable Valor
price 100.00
discount 15.00
discounted_price NULL

Después de ejecutar la línea actual, discounted_price cambiará a 85.00.

Ejecutar el código paso a paso

En la ventana del debugger puedes controlar la ejecución de tu función con estos botones:

  1. Step Over — ejecuta la sentencia actual y pasa a la siguiente.
  2. Step Into — te permite "entrar" en la función o procedimiento llamado.
  3. Continue — sigue ejecutando la función hasta el siguiente breakpoint o hasta terminar.

Aplicación práctica: depuración de funciones complejas

Vamos a escribir y depurar una función más compleja.

Ejemplo: procesamiento de pedidos

CREATE OR REPLACE FUNCTION process_order(order_id INTEGER)
RETURNS TEXT AS $$
DECLARE
    order_status TEXT;
    total_amount NUMERIC;
BEGIN
    -- Establecemos el estado del pedido
    SELECT status INTO order_status
    FROM orders
    WHERE id = order_id;

    IF order_status = 'Pending' THEN
        -- Calculamos el total del pedido
        SELECT SUM(price * quantity) INTO total_amount
        FROM order_items
        WHERE order_id = order_id;

        -- Actualizamos el estado del pedido
        UPDATE orders
        SET status = 'Processed', processed_date = NOW()
        WHERE id = order_id;

        RETURN 'Pedido procesado. Total: ' || total_amount;
    ELSE
        RETURN 'El pedido ya está procesado o no existe.';
    END IF;
END;
$$ LANGUAGE plpgsql;

Posibles breakpoints:

  1. En la línea SELECT status INTO order_status.
  2. En la línea SELECT SUM(price * quantity) INTO total_amount.

Durante la depuración puedes:

  • Asegurarte de que order_status realmente tiene el valor 'Pending'.
  • Comprobar si total_amount se calcula correctamente.

Errores comunes y cómo solucionarlos

Durante la depuración con pgAdmin puedes encontrarte con estas situaciones:

  1. No ves tu función en la lista. Asegúrate de que la función está creada en tu base de datos y que estás conectado a la base correcta.
  1. Los breakpoints no funcionan. Comprueba que la extensión pldbgapi está activada y que tienes los permisos necesarios.

  2. Error de conexión del debugger. Asegúrate de que el servidor PostgreSQL está configurado para depuración (el parámetro shared_preload_libraries incluye pldbgapi).

Usar pgAdmin para depurar PL/pgSQL hace que el proceso sea súper sencillo e intuitivo. Pon un breakpoint, mira cómo están tus variables y corrige los fallos — ¡eso ya es medio camino hacia tu app perfecta!

2
Tarea
SQL SELF, nivel 56, lección 0
Bloqueada
Depuración de una función con varias variables
Depuración de una función con varias variables
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION