Haciendo Debugger a una función plpgsql

En la entrada anterior les comenté como hacer “Profiler” a una función plpgsql, lo cual puede ser muy beneficioso para conocer picos de trabajo de cada línea de una función plpgsql. En esta les traigo como hacer “Debugger” a dichas funciones, todos seguro hayamos hecho esta actividad en algún lenguaje, y conocemos que no es más que recorrer el código y ver que caminos toma el mismo y que valores tomas las diferentes variables. El “debugger” combinado con el “Profiler” puede ser útil para poner a punto una función plpgsql.

PostgreSQL tiene la forma de hacer debuger también y utilizando una extensión llamada pldebugger y tiene una buena integración con el PgAdmin3, la misma hay que instalarla en el servidor PostgreSQL y reiniciarlo para que tome los cambios que necesitamos, luego en el PgAdmin3 podemos utilizarla. A continuación les muestro como se instala y se utiliza, tengo entendido que las instalaciones de EDB ya la tienen incluida y sea solo activarlas.  En mi caso es ubuntu 14.04 e instalado PostgreSQL desde el repositorio.

Descargando e instalando:

git clone git://git.postgresql.org/git/pldebugger.git
#instalar

cd pldebugger
make USE_PGXS=1
sudo make USE_PGXS=1 install

Una vez instalada la extensión debemos activarla e indicarle al servidor que la cargue cuando se inicie, en el archivo postgresql.conf a la variable shared_preload_libraries y reiniciar el mismo(esta funcionalidad solo puede  ser ejecutada por un superusuario de PostgreSQL).

shared_preload_libraries = 'plugin_debugger'
sudo /etc/init.d/postgresql restart 9.4

Luego dentro del PgAdmin3 debemos cargar la extensión:


create extension pldbgapi;

--Utilizando la misma función del post anterior,
-- Cambia el precio de un producto pasado por parámetro, duplicándolo el total de veces
-- pasado como segundo parámetro, retornar el precio final haciendo uso del WHILE

CREATE FUNCTION cambiar_precio(id integer, cant integer) RETURNS numeric AS
$$
DECLARE
contador integer := 0;
precio numeric;
BEGIN
WHILE contador < cant LOOP
UPDATE products SET price = price * 2 WHERE prod_id = id RETURNING price INTO precio;
contador := contador + 1;
END LOOP;
RETURN precio;
END;
$$ LANGUAGE plpgsql;

Hacemos click derecho en la función  y debe aparecer la Opcion “Debugging” y seleccionamos “Debug”, aparecerá una ventana como la siguiente para colocar los valores de los parámetros de entrada de la función:

debug1

Luego damos en Debug y aparece otra  ventanta (siguiente) donde podemos hacer recorrido por el código con Ctrl+F11,Ctrl+F10,  Ctrl+F5, etc. , o también lo podemos hacer dando click en los iconos de la barra superior que son muy comunes para los debugger , y así podemos ir observando el camino que toma el código, así como el valor de las variables locales de la función  en la parte inferior de la ventana.

debug2

También podemos hacer debugger cuando desde otra sesión se está ejecutando dicha función, esto puede ser muy útil para ver que que está pasando en la función cuando es llamada de una aplicación,  o por otro usuario que no seamos nosotros mismos, esta opción se puede obtener en “Debugging” y seleccionamos “Set Breakpoint” y entonces se quedará esperando a que desde otra sesión se ejecute la función y se puede hacer lo mismo que en el modo “Debug”.

Como ven no es tan complejo y puede ser muy útil para cuando estamos desarrollando las funciones poder ver el camino que le vamos dando a la misma, como con cualquier “Debugger”, claro no es recomendable tener esto en un servidor de producción sino en uno de desarrollo. Y si le juntamos  el “Profiler”, pueden ser ambas buenas opciones para que todo salga bien en nuestro desarrollo.

Así que ver como nos va con ellas 😀

Nos vemos en otra

 

 

 

 

 

 

6 comentarios en “Haciendo Debugger a una función plpgsql

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s