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:
- Poner breakpoints — son lugares donde la ejecución del código se detiene para que puedas analizar su estado actual.
- Recorrer el código SQL paso a paso — literalmente ver qué sentencia se ejecuta en cada momento.
- Ver los valores de las variables en tiempo real — asegurarte de que los datos se pasan y procesan correctamente.
- 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?
- Abre pgAdmin y conéctate a tu base de datos.
- Busca tu función o procedimiento en el árbol de objetos: Functions → <tu esquema> → <tu función>.
- Haz clic derecho en la función y elige Debugging → Debug. Esto lanzará el debugger.
- 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:
- Ve a la pestaña Variables en la parte inferior de la ventana del debugger.
- 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:
- Step Over — ejecuta la sentencia actual y pasa a la siguiente.
- Step Into — te permite "entrar" en la función o procedimiento llamado.
- 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:
- En la línea
SELECT status INTO order_status. - En la línea
SELECT SUM(price * quantity) INTO total_amount.
Durante la depuración puedes:
- Asegurarte de que
order_statusrealmente tiene el valor'Pending'. - Comprobar si
total_amountse calcula correctamente.
Errores comunes y cómo solucionarlos
Durante la depuración con pgAdmin puedes encontrarte con estas situaciones:
- 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.
Los breakpoints no funcionan. Comprueba que la extensión
pldbgapiestá activada y que tienes los permisos necesarios.Error de conexión del debugger. Asegúrate de que el servidor PostgreSQL está configurado para depuración (el parámetro
shared_preload_librariesincluyepldbgapi).
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!
GO TO FULL VERSION