TBD Practica 28 Wq4
TBD Practica 28 Wq4
TBD Practica 28 Wq4
Funciones
Objetivo
En esta prctica se analizan los diferentes tipos de funciones que se pueden programar en PostgreSQL, as como la
forma de crear un sistema de reglas.
Introduccin
El SMBD Postgres SQL proporciona tres tipos de funciones:
Funciones de lenguaje de consultas (funciones escritas en SQL)
Funciones de lenguaje procedural (funciones escritas en lenguaje PLSQL)
Funciones de lenguaje de programacin (funciones escritas en un lenguaje de programacin
compilado como C)
Una forma sencilla de proteger la informacin contenida en una tabla, ante la posibilidad de que alguien
pueda insertar, actualizar o eliminar datos de manera indebida es mediante la definicin de reglas.
El sistema de reglas se sita entre el traductor de la consulta y el optimizador. Toma la salida del
traductor, un rbol de la consulta, y las reglas de reescritura contenidas en el catlogo pg_rewrite, y crea
cero o muchos rboles de consulta como resultado.
Un rbol de consulta es una representacin interna de una instruccin SQL donde se almacenan por
separado las partes menores que la componen. Estos rboles son visibles cuando arrancamos el motor
de Postgres con nivel de debug 4 y tecleamos consultas en la interface interactiva, pero leer un rbol de
consultas requiere experiencia y es bastante difcil al principio.
Equipo necesario
Una computadora con sistema operativo Windows 7 o superior que cuente con el Shell de PostgreSQL
conocido como psql.
Metodologa
1. Oprima el botn de Inicio de Windows y localice PostgreSQL 9.6 en la lista de todos los programas
y ah encontrar el acceso directo para ejecutar la herramienta SQL Shell (psql).
1. Se abre la ventana del shell de PostgreSQL, primero le solicita indicar el servidor, oprima enter.
2. Ahora le solicita indicar la base de datos, ah va a escribir la base de datos banco y oprima enter.
Taller de Bases de Datos Prctica 28
11. En este otro ejemplo se toma un argumento sencillo de tipo texto que corresponde al nombre del
editorial y devuelve un resultado de un tipo direc que fue definido por el usuario:
Biblioteca=# CREATE FUNCTION dir(text)
Biblioteca-# RETURNS direc
Biblioteca-# AS 'SELECT "Direccion" FROM "Editoriales" WHERE "Nombre"=$1'
Biblioteca-# language 'sql';
18. Tambin puede calcular la edad que tena Pel al ganar Brasil su tercer campeonato mundial de
Futbol, si sabemos que naci el 23/oct/1940 y el tercer campeonato de Brasil fue en el Mundial de
Mxico y se obtuvo el 21/jun/1970 en el estadio Azteca venciendo a Italia por 4 1.
Biblioteca=# SELECT edad('23-10-1940', '1970/06/21') as "Edad de Pel";
19. Otro ejercicio sencillo consiste en crear una funcin para convertir una fecha a texto (el prefijo FM
elimina espacios en blanco innecesarios en los nombres del da y del mes):
Biblioteca=# CREATE FUNCTION fecha(f DATE) RETURNS text
Biblioteca-# AS 'SELECT TO_CHAR(f, ''FMDay DD" de "FMMonth" de "YYYY'')'
Biblioteca-# language 'sql';
24. Sin embargo, aunque el valor de esta variable corresponda a Mxico, Spanish_Mexico.1252, sigue
mostrando los nombres de los meses y los das en ingls.
25. Un sencillo ejemplo de funcin en lenguaje procedural consiste en implementar la funcin factorial,
como se indica a continuacin:
Biblioteca=# CREATE OR REPLACE FUNCTION Factorial(N NUMERIC)
Biblioteca-# RETURNS NUMERIC
Biblioteca-# AS $$
Biblioteca$# DECLARE
Biblioteca$# FACT NUMERIC;
Biblioteca$# I NUMERIC;
Biblioteca$# BEGIN
Biblioteca$# FACT:=1;
Biblioteca$# FOR I IN 1 .. N LOOP
Biblioteca$# FACT:=FACT*I;
Biblioteca$# END LOOP;
Biblioteca$# RETURN FACT;
Biblioteca$# END; $$
Biblioteca-# LANGUAGE plpgsql;
31. Para probar las reglas, intente cada una de las siguientes operaciones:
Biblioteca=# SELECT * FROM "Libros";
Biblioteca=# INSERT INTO "Libros" VALUES ('Uno','Dos','Tres','Alfaguara'
,1,2,'Espanol');
Biblioteca=# UPDATE "Libros" SET "Precio"=100 WHERE "Precio"='$1.00';
Biblioteca=# DELETE FROM "Libros" WHERE "ISBN" LIKE '9%';
32. Podr constatar que aparentemente se ejecutaron las sentencias, ya que no ocurre ningn error,
pero tampoco se realiza ningn cambio en la tabla Libros:
Biblioteca=# SELECT * FROM "Libros";
33. Una forma ms sofisticada de utilizar el sistema de reglas consiste en crear una regla que registre
los datos de la persona y el momento en que se hizo un cambio de precio a un libro.
Biblioteca=# CREATE TABLE log (isbn CHAR(17), precio text, usuario text,
momento timestamp);
Biblioteca=# CREATE RULE cambio AS ON UPDATE TO "Libros" WHERE
NEW."Precio"!= OLD."Precio" DO INSERT INTO log VALUES (NEW."ISBN",
NEW."Precio",getpgusername(),current_timestamp);
34. Para probar esta regla primero deber eliminar una de las reglas previas, para que proceda la
actualizacin;
Biblioteca=# DROP RULE prot2 on "Libros";
Evidencias
El alumno deber enviar al instructor las evidencias requeridas durante la realizacin de la prctica.
Sugerencias didcticas
El instructor deber atender a los alumnos que tengan dificultades en la interpretacin y la realizacin de
las instrucciones de la prctica.
Taller de Bases de Datos Prctica 28
Resultados
Se aprendi a crear funciones y definir reglas utilizando la herramienta PostgreSQL.
Bibliografa
http://es.tldp.org/Postgresql-es/web/navegable/user/sql-createfunction.html
http://es.tldp.org/Postgresql-es/web/navegable/user/sql-createrule.html