Documentos de Académico
Documentos de Profesional
Documentos de Cultura
INSTITUTO SINAPSIS
LENGUAJE PROCEDIMENTAL POSTGRESQL (PL/pgSQL)
Instructor: Ing. Mónica M. Tahan G.
monicatahan@gmail.com
INTRODUCCIÓN
El objetivo del presente taller es compartir experiencias y conocimientos adquiridos en el desarrollo de
procedimientos almacenados con PL/pgSQL para proporcionar una noción básica en cuanto a lo que es un lenguaje
procedural, su utilidad y forma como se implementa dentro de una base de datos, específicamente empleando el manejador de
PostgreSQL. Cualquier sugerencia o crítica constructiva se agradece comunicarla directamente al ponente.
CONTENIDO
1. ¿Qué es un Lenguaje Procedural?
2. Objetivos del lenguaje procedural PL/pgSQL
3. Estructura de PL/pgSQL
4. Declaraciones
5. Estructuras de Control
6. Triggers
7. Ejemplo de creación de un stored procedure (Procedimiento Almacenado)
8. Ejemplo de creación de un trigger
DESARROLLO
1. ¿Qué es un Lenguaje Procedimental?
Los procedimientos almacenados son grupos formados por instrucciones SQL y el lenguaje de control de flujo.
Cuando se ejecuta un procedimiento, se prepara un plan de ejecución para que la subsiguiente ejecución sea muy rápida. Los
procedimientos almacenados pueden:
Incluir parámetros
Llamar a otros procedimientos
Devolver un valor de estado a un procedimiento de llamada o lote para indicar el éxito o el fracaso del mismo y la
razón de dicho fallo
Devolver valores de parámetros a un procedimiento de llamada o lote
Ejecutarse en servidores remotos remotos
2. Objetivos de un Lenguaje Procedimental PL/pgSQL
Ser usado para crear funciones y triggers.
Añadir Estructuras de Control al Lenguaje SQL.
Realizar cálculos complejos.
Heredar todos los tipos definidos por el usuario, funciones y operadores.
3. Estructura de PL/pgSQL
PL/pgSQL es un lenguaje estructurado, el cual tiene el siguiente esquema:
[Etiqueta] ==> Indicar aquí el nombre de la función procedural y los parámetros de entrada y salida.
DECLARE
Colocar en este bloque las declaraciones de las variables de entrada y salida.
BEGIN
Colocar en este bloque las instrucciones del procedimiento almacenado a ejecutar.
END;
4. Declaraciones
Todas las variables, registros y filas usadas en una función procedimental deben ser previamente declaradas en la
sección DECLARE, estas pueden ser de cualquier tipo de datos SQL, como por ejemplo varchar, char, numeric, integer y otros
tipos especiales. Los tipos de declaraciones especiales son los siguientes:
a. Tipo Alias.
Cuando creamos una función en el lenguaje PL/pgSQL existen ciertos parámetros de entrada, los cuales han sido
declarados en el bloque etiqueta, por ejemplo:
CREATE OR REPLACE FUNCTION prueba(integer) RETURNS text AS '
Donde integer es el tipo de dato para el parámetro de entrada y text es el tipo de dato para el parámetro de salida.
Una vez que colocamos un parámetro de entrada, para poder utilizarlo dentro del bloque de instrucciones de la
función, es necesario capturarla, esto se logra a través de las variables tipo ALIAS, las cuales permiten capturar los
parámetros de entrada. Por ejemplo:
variable ALIAS FOR $1; Dónde $1 es el primer parámetro de entrada.
NOTA: Si no desea utilizar una variable tipo ALIAS puede referirse a los parámetros de entrada con $1,$2,........,$n
respectivamente, según se hayan declarado, pero esto no se aconceja porque se hace tedioso entender el código.
b. Tipo Fila (ROW)
es una variable de tipo compuesto que puede ser utilizada para guardar el registro completo de una fila. Por ejemplo:
variable nombretabla%ROWTYPE;
c. Tipo Record
Son variables tipo registro, similares a las tipo fila, pero sin una estructura predefinida. Por Ejemplo:
variable RECORD;
d. Tipo Columna
Se utiliza para guardar un campo de tabla. Por ejemplo:
variable nombretabla.columna%TYPE;
5. Estructuras de Control:
a. Retornar un valor desde una función
Para ello emplear RETURN seguido de la(s) variable(s) que se deseen retornar. Por ejemplo:
RETURN variable;
b. Condicionales:
IF ..... THEN ==> Ejemplo: IF variable like 'A%' THEN instrucciones;
IF ..... THEN .... ELSE ==> IF variable like 'A%' THEN instrucciones;
ELSE instrucciones;
c. Bucles
Para repetir una serie de comandos. Los tipos más usados son:
LOOP ==> LOOP instrucciones
condicional;
END LOOP;
WHILE ==> WHILE condicion LOOP
Instrucciones;
END LOOP;
FOR ==> FOR variable IN sentencia SQL LOOP
condiciones;
END LOOP;
6. Triggers
Es una función sin argumentos que se dispara en el momento que se ejecuta una transacción en una tabla. En
PL/pgSQL se crean variables especiales automáticamente, tales como:
NEW ==> es un tipo de datos RECORD, almacena la nueva fila de la Base de Datos para operaciones Insert/Update
OLD ==> es un tipo de datos RECORD, almacena la antigua fila de la Base de Datos para operaciones Update/Delete
7. Ejemplos de creación de un stored procedure (Procedimiento Almacenado)
Para crear un stored procedure seguir los pasos a continuación:
1. Una vez creada la base de datos es necesario crear el lenguaje dentro de la misma, para ello, de ser el
superusuario de la base de datos, es decir postgres, para ello escriba su – postgres desde la cónsola.
2. Luego, para crear el lenguaje, escriba desde la cónsola createlang plpgsql dbname, donde dbname es el
nombre de la base de datos a la cual se asociará el lenguaje procedural.
3. Una vez creado éste procedemos a escribir la función, para ello puede utilizar un editor de texto y guardar la función
en un archivo con extensión sql.
4. Para vaciar la función dentro de la base de datos, escriba desde la misma \i /ruta/archivo.sql.
Función para ejecutar un escalar.
CREATE FUNCTION montodecimal(numeric(14,2)) RETURNS numeric(14,2) AS '
DECLARE
mmonto ALIAS for $1; --Capturando el parámetro de entrada
BEGIN /*Bloque de instrucciones, Este es un comentario de múltiples líneas*/
RETURN mmonto * 0.01; Retornar el resultado
END;
' LANGUAGE 'plpgsql'; Indico el lenguaje a utilizar
8. Ejemplo de creación de un trigger
CREATE FUNCTION sueldo() RETURNS TRIGGER AS '
BEGIN
Comprueba que el salario sea mayor que cero
IF NEW.mmonto ISNULL THEN
RAISE EXCEPTION ''El Monto NO puede ser un valor NULO'';
END IF;
IF NEW.mmonto <= 0 THEN
RAISE EXCEPTION ''El Monto NO puede ser negativo o igual a cero'';
END IF;
RETURN NEW; Retorna el estatus del trigger
END;
' LANGUAGE 'plpgsql';
Creación del trigger para asociarlo a la tabla que me interesa