Está en la página 1de 5

Introducción al lenguaje procedural PL/pgSQL

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 

Elaborado por: Ing. Mónica Tahan


Introducción al lenguaje procedural PL/pgSQL

 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)

Elaborado por: Ing. Mónica Tahan


Introducción al lenguaje procedural PL/pgSQL

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;

Elaborado por: Ing. Mónica Tahan


Introducción al lenguaje procedural PL/pgSQL

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; 

Elaborado por: Ing. Mónica Tahan


Introducción al lenguaje procedural PL/pgSQL

' LANGUAGE 'plpgsql';

­­ Creación del trigger para asociarlo a la tabla que me interesa

CREATE TRIGGER  sueldo  BEFORE INSERT OR UPDATE ON  tpersonal  FOR EACH ROW EXECUTE PROCEDURE 


sueldo();

Elaborado por: Ing. Mónica Tahan

También podría gustarte