You are on page 1of 9

Fundamentos de Bases de

DATOS 
 

 
SEMANA 4 
 
 

 
 
 
 

 
 
 

 
 
 
 

 
 
 

 
 
 
 

 
 
 
   

[ FUNDAMENTOS DE BASES DE DATOS ]


 

CONTENIDO 
 
 
PRESENTACIÓN …………………………….………………………… 3 
 
1. DESARROLLO TEMÁTICO ……………………………………..…… 3 
Funciones ………………………………..…….…..…........… 4 
Cursores ……………………………………..………………. 5 
Procedimientos Almacenados ………………………….……5  
Disparadores ………………………………………………… 7 
 
CONCLUSIONES …….………………………………………………... 9 
1.1. BIBLIOGRAFÍA …..………………………………………………... 9 
 
 
 
 
 
 
 
 
 

 
2  [ POLITÉCNICO GRANCOLOMBIANO ]
 

SQL de PROCEDIMIENTOS 
JOHANY ARMANDO CARREÑO GAMBOA 
jcarreno@poli.edu.co  
 

PRESENTACIÓN 
Como podemos observar, el SQL no es un lenguaje de programación propiamente dicho, sino 
simplemente  un  lenguaje  de  acceso  a  bases  de  datos  puesto  que  no  incorpora 
construcciones de control que permitan representar el flujo de control y de la información a 
través de un procedimiento software. 
En  esta  lectura  realizaremos  una  breve  descripción  del  lenguaje  y  de  los  componentes  del 
mismo,  describiendo  la  estructura  clásica  de  los  programas  PL/pgsql.  Se  trata  de  unas 
nociones  básicas  que  permitirán  a  todos  los  participantes  comprender  los  ejemplos 
propuestos a los largo del curso e iniciarse en la programación de aplicaciones con PL/pgsql. 
 
1. DESARROLLO TEMÁTICO 
Los programas PL/pgsql se estructuran agrupando las declaraciones o cláusulas del lenguaje 
en distintos bloques o secciones encargadas de tareas específicas, como son: 
-Declaración  de  las  variables  de  la  interfaz  del  programa  y  de  las  variables  internas  de 
ejecución.  Se  pueden  utilizar  los  tipos  de  datos  definidos  por  el  SGBD  y  tipos  de  datos 
definidos por el usuario para definir las variables y asignar valores a las mismas. 
-Flujo de control y operación de las tareas para las cuales se construye el programa. Se hace 
uso de los verbos de control de flujo y de sentencias SQL. 
Cada una de estas secciones viene identificada por una cláusula de cabecera de forma que la 
estructura general de un procedimiento es la siguiente: 
 
DECLARE 
  Declaración de las variables utilizadas 
BEGIN 
  Cuerpo del procedimiento 
END; 
 
No se debe confundir el uso de las sentencias de agrupamiento BEGIN/END de PL/pgSQL con 
los  comandos  de  la  base  de  datos  que  sirven  para  el  control  de  las  transacciones.  Las 
funciones  y  procedimientos  disparadores  no  pueden  iniciar  o  realizar  transacciones  y 
Postgres no soporta transacciones anidadas. 

 
[ FUNDAMENTOS DE BASES DE DATOS ] 3
 

 
FUNCIONES 
Como  en  cualquier  lenguaje  de  programación,  PL/pgsql  permite  la  declaración  de 
subprogramas  (subrutinas)  denominados  funciones.  Las  funciones  pueden  ser  invocadas 
desde un programa PL/pgsql u otra función. 
Una  función  PL/pgsql  tiene  como  objetivo  realizar  un  proceso  y  devolver  un  valor  al 
programa  o  subprograma  que  la  invocó.  Las  funciones  permiten  la  declaración  de  una 
interfaz  mediante  la  cual  se  les  puede  transferir  una  lista  de  valores.  Un  ejemplo  de  la 
implementación de funciones es: 
-Función Factorial 
-El nombre de la función a crear. 
 
CREATE FUNCTION fib(int4) 
/* El tipo de datos que será devuelto. El tipo de datos que será devuelto puede 
ser declarado como tipo básico, complejo, tipo setof  u opaque. Modificadores 
setof indican que la función devolverá un grupo de objetos, antes que un solo 
objeto. */ 
RETURNS int4 
/*  Una  cadena  de  letras  que  define  la  función  y  cuyo  sentido  depende  del 
lenguaje. Puede ser un nombre interno de función, el sendero a un fichero de 
objeto, una cuestión en SQL o texto en un lenguaje procedimental. */ 
AS $$ 
    DECLARE 
       a int4; 
       res int4:=0; 
  BEGIN 
       a := $1; 
       IF(a = 1 OR a = 2) THEN 
        res:= 1; 
        ELSE 
            res := fib(a‐2) + fib(a‐1); 
       END IF; 
     RETURN res; 
    END; 
    $$ 
 /* Puede ser 'C', 'sql', 'internal' o 'plname', donde 'plname' es el nombre de un 
lenguaje procedimental creado. */ 
Language 'plpgsql'; 

 
4  [ POLITÉCNICO GRANCOLOMBIANO ]
 

 
CURSORES 
Un cursor es un área de memoria de trabajo en la que se almacena la información de salida 
de  la  sentencia  SQL  y  que  es  necesario  declarar  para  posteriormente  poder  acceder  a  las 
tuplas que componen la salida de la sentencia. En lugar de ejecutar una consulta completa a 
la vez, es posible crear un cursor que encapsula la consulta y después lee el resultado de la 
consulta un par de filas a la vez. 
El siguiente ejemplo recorre la tabla PRODUCTO usando un CURSOR: 
‐ Crear y usar el cursor 
BEGIN WORK; 
  DECLARE micursor CURSOR 
   FOR SELECT * FROM producto; 
 
‐ FETCH selecciona filas usando un cursor 
‐ FORWARD selecciona la(s) siguiente(s) filas 
‐ Seleccionar las primeras 3 filas en el cursor micursor 
FETCH FORWARD 3 IN micursor; 
‐ BACKWARD selecciona la(s) fila(s) anteriores 
‐ Seleccionar la fila anterior 
FETCH BACKWARD 1 IN micursor; 
‐ Cerrar el cursor y commit WORK 
    CLOSE micursor; 
COMMIT WORK; 
Se  recomienda  usar  los  cursores  sólo  dentro  de  transacciones,  ya  que  los  datos  que 
almacenan abarcan múltiples consultas de usuario.1  
 
PROCEDIMIENTOS ALMACENADOS 
Un  procedimiento  almacenado  es  un  conjunto  nombrado  de  sentencias  SQL  y  de 
procedimientos. Este conjunto nombrado se guarda en la base de datos. Los procedimientos 
almacenados son invocados por nombre. 
Los  procedimientos  almacenados  se  invocan  como  una  unidad.  Por  consiguiente,  cuando 
desea  representarse  una  transacción  de  actualización  múltiple,  puede  crearse  un 
procedimiento que se guarda en la base de datos. El contenido completo del procedimiento 
almacenado se transmite y ejecuta, con lo que se evita la evita la transmisión y ejecución de 
sentencias  SQL  individuales  por  la  red.  Por  consiguiente,  el  uso  de  procedimientos 
almacenados  reduce  sustancialmente  el  tráfico  por  la  red,  con  lo  que  se  mejora  el 
rendimiento. 
Ejemplo: 

                                                        
1
 PostgreSQL.  [Recurso  en  Internet]  PostgreSQL  Documentation:  Consulta 
http://www.postgresql.org/docs/8.1/static/sql‐declare.html. Último acceso: 2 de Mayo de 2012. 16h30. 

 
[ FUNDAMENTOS DE BASES DE DATOS ] 5
 

Supongamos que tenemos una tabla ps_stock que almacena la información de los productos 
por comprar 
CREATE TABLE ps_stock ( 
ps_code int4 NOT NULL, 
    ps_descript varchar(35) NOT NULL 
); 
 
Queremos que haya una función comprar_producto() que haga lo siguiente: 
• Cree una tabla nueva llamada ps_stock que almacene los datos de los productos que 
tengan p_onhand = 0 o sea los productos que hay que renovar para luego poner a la 
venta. 
• Busque  en  la  tabla  producto  todos  los  productos  que  ya  no  estén  en  stock  y  los 
inserte en la tabla comprar_producto 
• Nos devuelva la cantidad de productos que ya no se encuentran en stock; 
 
CREATE OR REPLACE FUNCTION comprar_producto() 
    RETURNS int4 
    AS $$ 
    DECLARE 
       cont_pro int4; 
       fila_pro producto%ROWTYPE; 
    BEGIN 
SELECT COUNT(*) INTO cont_pro FROM producto WHERE p_onhand = 0; 
FOR fila_pro IN SELECT * FROM producto WHERE p_onhand=0 
           LOOP 
INSERT INTO ps_stock VALUES (fila_pro.p_code, fila_pro.p_descript); 
             END LOOP; 
       RETURN cont_pro; 
    END; 
      Language 'plpgsql'; 
 
Como ayuda para interpretar las líneas del procedimiento almacenado se observa que: 
-DECLARE  se  utiliza  para  especificar  las  variables  utilizadas  en  el  procedimiento.  Debe 
especificarse tanto el nombre de la variable como su tipo de datos. 
-IN / OUT indica si el parámetro es de entrada o de salida o de ambas. 
-Data  Type  es  uno  de  los  tipos  de  datos  SQL  de  procedimientos  utilizado  en  el  SGBD.  Los 
tipos de datos normalmente concuerdan con los tipos de datos utilizados en la sentencia de 
creación de tabla del SGBD. 

 
6  [ POLITÉCNICO GRANCOLOMBIANO ]
 

 
DISPARADORES 
Un disparador es un código SQl de procedimientos que automáticamente es invocado por el 
SGBD cuando ocurre un evento de manipulación de datos. Es útil recordar que: 
-Un  disparador  siempre  se  invoca  antes  o  después  de  que  una  fila  de  datos  se  selecciona, 
inserta o actualiza. 
-Un disparador siempre está asociado con una tabla de base de datos. 
-Cada base de datos puede o no tener uno o más disparadores. 
-Un disparador se ejecuta como parte de la transacción que lo activó. 
Los disparadores son fundamentales para la operación y manejo apropiados de una base de 
datos. Por ejemplo: 
-Pueden  utilizarse  disparadores  para  hacer  que  se  cumplan  restricciones  que  pueden  ser 
aplicadas a niveles de diseño y ejecución de SGBD. 
-Los  disparadores  agregan  funcionalidad  con  la  automatización  de  acciones  críticas  y  el 
suministro  de  advertencias  y  sugerencias  apropiadas  para  la  reutilización  de  acciones  de 
recuperación.  De  hecho,  uno  de  los  usos  más  comunes  de  los  disparadores  es  mejorar  la 
aplicación de la integridad referencial. 
-Pueden utilizarse disparadores para actualizar valores de tabla, insertar registros en la tabla 
e invocar otros procedimientos almacenados. 
Para ver cómo se crea y utiliza un disparador, se examinará el siguiente ejemplo: 
Nuestra  tabla  PRODUCTO  tiene  la  capacidad  de  almacenar  la  información  más  actual  e 
importante para nuestro sistema de control de compras, pero hay otro tipo de información  
que no es capaz de almacenar (por lo menos ahora), la información del cambio de datos. 
Nuestra  tabla  PRODUCTO  no  tiene  memoria  de  los  cambios  que  han  sufrido  sus  tuplas;  si 
alguien  viene  y  cambia  el  precio  de  venta  (producto.p_price),  no  hay  forma  de  obtener  el 
precio anterior. 
Si alguien borra un PRODUCTO, tampoco sabremos que artículo ha sido borrado ni por quién. 
Esto nos lleva a la primera gran área de utilización de los disparadores (triggers), la auditoria 
de tablas. 
Las acciones que debe realizar nuestro trigger son: 
1.  Necesitamos  llevar  un  registro  de  todos  los  cambios  relevantes  en  nuestra  tabla 
PRODUCTO, para empezar queremos tener un seguimiento de los cambios en los precios de 
los PRODUCTOS. 
2. También queremos almacenar en algún lugar todos aquellos PRODUCTOS que hayan sido 
eliminados, también queremos guardar sus respectivos historiales de cambios. 
Lo primero que vamos a hacer es crear una tabla que vaya a almacenar los cambios de precio 
de nuestra tabla PRODUCTO; la llamaremos producto_actualizado 
CREATE TABLE producto_actualizado 

  pa_code int4 NOT NULL, 
  pa_descript varchar(35) NOT NULL, 
  pa_lastprice numeric(9,2) NOT NULL, 

 
[ FUNDAMENTOS DE BASES DE DATOS ] 7
 

  pa_newprice numeric(9,2) NOT NULL, 
  pa_user varchar(100) NOT NULL, 
  pa_date date NOT NULL, 
CONSTRAINT pa_producto_fk FOREIGN KEY (pa_code) REFERENCES  producto(p_code) 
); 
 
CREATE FUNCTION pa_producto_tri() 
RETURNS trigger 
AS $$ 
  BEGIN 
    IF(TG_OP = 'UPDATE') THEN 
      IF(OLD.p_price != NEW.p_price) THEN 
      INSERT INTO producto_actualizado VALUES (  
OLD.p_code, OLD.p_descript, OLD.p_price, NEW.p_price, current_user, current_date 
      ); 
      END IF; 
    END IF; 
    RETURN NULL; 
  END; 
$$ 
Language 'plpgsql'; 
 
CREATE TRIGGER actualizar_producto 
AFTER UPDATE ON producto 
FOR EACH ROW 
EXECUTE PROCEDURE pa_producto_tri(); 
 
Como ayuda para interpretar las líneas del anterior código se observa que: 
‐ Pueden existir varios bloques o sub‐bloques en la sección de sentencias de un bloque. Los 
sub‐bloques pueden ser usados para ocultar las variables a los bloques más externos. 
‐ TG_OP: variable de tipo string que indica que tipo de evento está ocurriendo. 
‐ current_user: es el nombre del usuario que está actualmente conectado a la base de datos y 
que ejecuta las sentencias. 
‐ current_date: es la fecha actual del servidor, no del cliente. 
‐  NEW:  variable  compuesta  que  almacena  los  nuevos  valores  de  la  tupla  que  se  está 
modificando. 
‐  OLD:  variante  compuesta  que  almacena  los  valores  antiguos  de  la  tupla  que  se  está 
modificando 
‐ Normalmente una de las sentencias es el valor del retorno, usando la palabra RETURN. 
‐ Un trigger se ejecuta: 
1. antes o después de una inserción (INSERT) 
2. antes o después de una actualización (UPDATE) 

 
8  [ POLITÉCNICO GRANCOLOMBIANO ]
 

3. antes o después de un borrado (DELETE) 
‐  Después  de  Actualizar  (UPDATE)  sobre  la  tabla  PRODUCTO,  para  cada  fila,  ejecutar  la 
función pa_producto_tri. 
 
CONCLUSIONES 
• El código de SQL de procedimientos es ejecutado por el SGBD cuando es invocado –
directa o indirectamente‐ por el usuario final. 
• Puede usarse el PL/pgsql de procedimientos para crear disparadores, procedimientos 
almacenados, cursores y funciones. 
 
BIBLIOGRAFÍA 
• DATE,  Christopher  J.  Introducción  a  los  Sistemas  de  Bases  de  Datos. 7ma  ed.  México: 
Pearson Publications Company, 2001. 
• ELMASRI, R. y NAVATHE, S.B. Fundamentals of Database Systems. 6ta ed. United States 
of America: Addison Wesley, 2010. 
• KORTH y SIULBERSCHATZ, A. Fundamentos de Bases de Datos. Cuarta edición. Madrid: 
McGraw‐Hill, 2002. 
• ROB, Peter y CORONEL, Carlos. Sistemas de Bases de Datos: diseño, implementación 
y administración. 5 ed. México: Thomson, 2003. 
 

 
[ FUNDAMENTOS DE BASES DE DATOS ] 9

You might also like