Professional Documents
Culture Documents
SUCRE 2010
NDICE
SISTEMA DE GESTIN DE DATOS POSTGRESQL
Caractersticas Principales
INTRODUCCIN A POSTRGRESQL
GUA DE LABORATORIO
POSTGRESQL
Desarrollador PostgreSQL Global Development Group www.postgresql.org Informacin general ltima versin estable 9.0 (20 de septiembre de 2010) Gnero Sistema operativo Licencia En espaol RDBMS Multiplataforma BSD
PostgreSQL es un sistema de gestin de base de datos relacional orientada a objetos y libre, publicado bajo la licencia BSD. Como muchos otros proyectos de cdigo abierto, el desarrollo de PostgreSQL no es manejado por una sola empresa sino que es dirigido por una comunidad de desarrolladores y organizaciones comerciales las cuales trabajan en su desarrollo. Dicha comunidad es denominada el PGDG (PostgreSQL Global Development Group).
GUA DE LABORATORIO
CARACTERSTICAS
Algunas de sus principales caractersticas son, entre otras:
A LTA CONCURRENCIA
Mediante un sistema denominado MVCC (Acceso concurrente multiversin, por sus siglas en ingls) PostgreSQL permite que mientras un proceso escribe en una tabla, otros accedan a la misma tabla sin necesidad de bloqueos. Cada usuario obtiene una visin consistente de lo ltimo a lo que se le hizo commit. Esta estrategia es superior al uso de bloqueos por tabla o por filas comn en otras bases, eliminando la necesidad del uso de bloqueos explcitos.
Nmeros de precisin arbitraria. Texto de largo ilimitado. Figuras geomtricas (con una variedad de funciones asociadas) Direcciones IP (IPv4 e IPv6). Bloques de direcciones estilo CIDR. Direcciones MAC. Arrays.
Adicionalmente los usuarios pueden crear sus propios tipos de datos, los que pueden ser por completo indexables gracias a la infraestructura GiST de PostgreSQL. Algunos ejemplos son los tipos de datos GIS creados por el proyecto PostGIS.
O TRAS CARACTERSTICAS
Claves ajenas tambin denominadas Llaves ajenas o Claves Forneas (foreign keys). Disparadores (triggers): Un disparador o trigger se define en una accin especifica basada en algo ocurrente dentro de la base de datos. En PostgreSQL esto significa la ejecucin de un procedimiento almacenado basado en una determinada accin sobre una tabla especfica.
Entonces combinando estas seis caractersticas, PostgreSQL le permitir crear una amplia funcionalidad a travs de su sistema de activacin de disparadores (triggers).
GUA DE LABORATORIO
Soporte para transacciones distribuidas. Permite a PostgreSQL integrase en un sistema distribuido formado por varios recursos (p.ej, una base de datos PostgreSQL, otra Oracle, una cola de mensajes IBM MQ JMS y un ERP SAP) .
FUNCIONES
Bloques de cdigo que se ejecutan en el servidor. Pueden ser escritos en varios lenguajes, con la potencia que cada uno de ellos da, desde las operaciones bsicas de programacin, tales como bifurcaciones y bucles, hasta las complejidades de la programacin orientada a objetos o la programacin funcional. Los disparadores (triggers en ingls) son funciones enlazadas a operaciones sobre los datos. Algunos de los lenguajes que se pueden usar son los siguientes:
Un lenguaje propio llamado PL/PgSQL (similar al PL/SQL de oracle). C. C++. Java PL/Java web. PL/Perl. plPHP. PL/Python. PL/Ruby. PL/sh. PL/Tcl. PL/Scheme. Lenguaje para aplicaciones estadsticas R por medio de PL/R.
PostgreSQL soporta funciones que retornan "filas", donde la salida puede tratarse como un conjunto de valores que pueden ser tratados igual a una fila retornada por una consulta (query en ingls). Las funciones pueden ser definidas para ejecutarse con los derechos del usuario ejecutor o con los derechos de un usuario previamente definido. El concepto de funciones, en otros DBMS, son muchas veces referidas como "procedimientos almacenados" (stored procedures en ingls).1
http://es.wikipedia.org/wiki/PostgreSQL
GUA DE LABORATORIO
INTRODUCCIN A POSTGRESQL
INGRESANDO A POSTGRESQL, MANEJO DE BASE DE DATOS, ESQUEMAS, TABLAS, DDL, DML
GUA DE LABORATORIO
Una vez abierta la pantalla hacer doble click en PostgreSQL : Database Server etc.:
Pgina 6
GUA DE LABORATORIO
BARA DE HERRAMIENTAS
Visualizar la ayuda
Permite explorar las diferentes bases de datos, tablas, esquemas triggers y objetos que creemos dentro de postgres.
Permite explorar las propiedades del objeto seleccionado; como podemos ver en la pantalla tenemos seleccionada la base de datos test y podemos observar su nombre, propietario y codificado por ejemplo.
Pgina 7
GUA DE LABORATORIO
PANEL SQL
Permite observar el cdigo en SQL del objeto seleccionado, como en el caso anterior observamos la base de datos test, donde podemos observar los comandos de su creacin. Este cdigo lo genera automticamente postgres por lo que no es posible editarlo. Para eso debemos utilizar la consola de Consultas.
Pgina 8
GUA DE LABORATORIO
CONSOLA DE CONSULTAS
Se abre al hacer click en el botn de la barra de herramientas. NOTA: Este botn solo se habilitara si tenemos seleccionado un objeto por ejemplo una base de datos.
En esta seccin podemos escribir las consultas, en lenguaje SQL con algunas pequeas diferencias que iremos estudiando con el avance de los captulos
En esta seccin observamos los resultado de ejecutar las consultas, en el ejemplo en pantalla aadir una tabla a la base de datos Test
Pgina 9
GUA DE LABORATORIO
C REAR UNA BASE DE DATOS .- PostgreSQL permite la creacin de cualquier nmero de base
de datos en un servidor, siendo el usuario que la crea automticamente el administrador de la base de datos. NOTA.- El nombre de la BD debe comenzar siempre con una letra y estar limitada a 32 caracteres. Para crear la base de datos se utiliza la sentencia: CREATE DATABASE [nombre_de_la_bd]; Ejemplos: CREATE DATABASE Nueva; CREATE DATABASE Empresa1; CREATE DATABASE BANCO; Otros comandos para el manejo de las bases de datos: DROP DATABASE Nueva; NOTA: El comando CREATE DATABASE nos permite el uso de ms opciones de configuracin como ser: CREATE DATABASE name [ [ WITH ] [ OWNER [=] dbowner ] [ TEMPLATE [=] template ] [ ENCODING [=] encoding ] [ TABLESPACE [=] tablespace ] [ CONNECTION LIMIT [=] connlimit ] ]
Pgina 10
GUA DE LABORATORIO
3.- ESQUEMAS
Los esquemas contienen una coleccin de tablas, vistas, funciones y otros tipos de objetos, al interior de una base de datos. Nos permiten tener un mejor control al momento de establecer que contenidos son privados y cuales pblicos. Para crear un esquema se utiliza la sentencia: CREATE SCHEMA [nombre_del_esquema]; Ejemplos: CREATE SCHEMA Privado; CREATE SCHEMA Restringido; Tambin se pueden crear a travs de la interfaz grfica. Para adicionar una tabla a un esquema se utiliza: SET SEARCH_PATH TO [nombre_esquema], $usuario ; Ejemplo: SET SEARCH_PATH TO privado, $user ;
Podemos ver el esquema en el que estamos trabajando ejecutando el comando: SHOW SEARCH_PATH; NOTA: Por defecto el esquema en todas las bases de datos es public. Cuando trabajamos con muchos esquemas se puede acceder de forma rpida a ellos utilizando la notacin: nombre_esquema.nombre_tabla ej: SELECT * FROM privado.nueva;
Pgina 11
GUA DE LABORATORIO
4.- TABLAS
Para crear la tabla se utiliza la sentencia: CREATE TABLE [nombre_tabla] (atributo1 tipo, atributo2 tipo,, atributoN tipo); Ejemplos: CREATE TABLE cliente(id_cliente INT PRIMARY KEY, nombre CHAR(10), ap_pat CHAR(10), ap_mat CHAR(10)); CREATE TABLE cuenta (id_cuenta INT, PRIMARY KEY, id_cliente INT, saldo FLOAT, fecha DATE, FOREIGN KEY(id_cliente) REFERENCES cliente(id_cliente) ); Otros comandos: ALTER, DROP, TEMPORARY. Ejemplos: ALTER TABLE cliente ADD COLUMN direccion CHAR(20); DROP TABLE cuenta;
TABLA TEMPORAL
Permite crear una tabla temporal dentro la base de datos ej: CREATE TEMPORARY TABLE cli_temp AS SELECT nombre, ap_pat FROM cliente; NOTA: En la interfaz grfica podemos ver el contenido de una tabla con click derecho seleccionando la opcin Ver Todas las Filas como se muestra en la figura.
Pgina 12
GUA DE LABORATORIO
Boolean valor lgico o booleano (true/false) character(n) cadena de caracteres de tamao fijo Date fecha (sin hora) float(86#86) nmero de punto flotante con precisin 86#86 real, double precision nmero de punto flotante de doble precisin Smallint entero de dos bytes con signo int, integer entero de cuatro bytes con signo decimal(87#87) nmero exacto con 88#88 numeric(87#87) nmero exacto con 89#89 decimal(9,2) cantidad monetaria Time hora en horas, minutos, segundos y centsimas Interval intervalo de tiempo timestamp with time zone fecha y hora con zonificacin character varying(n) cadena de caracteres de tamao variable Fuente: Tipos de datos relevantes en PostgreSQL Tabla 4.2: Tipos de datos extendidos por PostgreSQL
El listado completo se encuentra en el Anexo Tipos de Datos en Postgres o en la direccin indicada abajo. http://www.ibiblio.org/pub/linux/docs/LuCaS/Tutoriales/NOTAS-CURSO-BBDD/notas-cursoBD/node134.htm
2
Pgina 13
GUA DE LABORATORIO
INSERT
La sentencia INSERT permite agregar datos a una tabla. La forma de INSERT es: INSERT INTO [nombre_tabla] VALUES (valor1, valor2,, valorN); Ejemplos: INSERT INTO cliente VALUES (0001,Juan, Perez, Pinto, Loa 100); INSERT INTO cuenta VALUES (0001,0010,4589.12); NOTA: Para ingresar valores reales se utiliza el punto ( . ) no as la coma ( , ).
SELECT
La sentencia SELECT permite obtener filas desde una tabla. La forma ms sencilla es: SELECT atributo1, atributo2,, atributoN FROM [nombre_tabla] WHERE atributo=valor; Ejemplos: SELECT nombre,ap_pat,ap_mat FROM cliente WHERE nombre=Juan; SELECT COUNT(*) FROM cliente;
UPDATE
UPDATE es la clusula que permite hacer modificaciones a registros ya existentes en la base de datos. Su forma ms sencilla es UPDATE [nombre_tabla] SET atributo1 = valor1, atributo2 = valor2,, atributoN = valorN WHERE atributo=valor; Ejemplo: UPDATE cliente SET ap_pat=Pinto, ap_mat=Perez WHERE id_cliente=0001; UPDATE cuenta SET saldo=0 WHERE id_cliente=0001;
Pgina 14
GUA DE LABORATORIO
DELETE
DELETE es la clusula que permite eliminar registros de una tabla. Su uso es muy sencillo: DELETE FROM [nombre_tabla] WHERE atributo=valor {CASCADE | RESTRICT}; Ejemplos: DELETE FROM cliente WHERE id_cliente=0001 CASCADE; DELETE FROM cuenta WHERE id_cuenta=0010; NOTA: CASCADE permite eliminar registros an cuando estos estn relacionados con otras tablas.
Pgina 15
GUA DE LABORATORIO
Pgina 16
PRACTICA I
GUA DE LABORATORIO
DEFAULT
DEFAULT Asigna un valor por defecto a un campo, por ejemplo: CREATE TABLE cliente (id_cliente INT, nit CHAR(11), nombre VARCHAR(40), telf INT DEFAULT 0 ); CREATE TABLE estudiante (id_estudiante INT, nombre CHAR(15), ap_pat CHAR(15), ap_mat CHAR(15), fecha_ins date DEFAULT CURRENT_DATE ); 3
CONSTRAINT
CONSTRAINT Es un tipo de restriccin que permite definir un conjunto de valores validos sobre una tabla, existen dos tipos: NOT NULL Obliga a que un campo contenga nicamente valores no nulos. Ejemplo: CREATE TABLE cliente ( id_cliente INT , nit INT, nombre VARCHAR(40) CONSTRAINT no_nulo NOT NULL, telf INT );
(1) 3 El manejo de los datos de tiempo esta incluido en el Anexo Manejo de Tiempo
Pgina 17
GUA DE LABORATORIO
CREATE TABLE cuenta ( id_cuenta INT, id_cliente INT, saldo FLOAT, fecha_apertura date CONSTRAINT no_vacio NOT NULL ); UNIQUE Obliga a un grupo de uno o ms campos de una tabla a contener valores nicos. Ejemplo:
CREATE TABLE cliente ( id_cliente INT, documento_identidad CHAR(11) CONSTRAINT unico UNIQUE, nombre VARCHAR(40), telf INT ); CREATE TABLE producto( id_producto INT, nombre CHAR(11) CONSTRAINT unico UNIQUE, descripcion VARCHAR(40), precio FLOAT ); NOTA: No es necesario declarar CONSTRAINT para utilizar NOT NULL y UNIQUE por ejemplo se podra declarar: CREATE TABLE product (id_producto INT, nombre CHAR(11) UNIQUE, descripcion VARCHAR(40), precio FLOAT); Y tendra el mismo efecto que el caso anterior.
Pgina 18
GUA DE LABORATORIO
CHECK
CHECK Es una restriccin sobre los valores permitidos en un campo: Ejemplo:
CREATE TABLE libros ( ISBN CHAR(11), titulo VARCHAR(40), autor VARCHAR(40), stock INT CHECK(stock>0) ); CREATE TABLE distribuidores ( did decimal(3), nonmbre vaCHAR(40) CONSTRAINT con1 CHECK (did > 100 AND nombre<> '') );
CREATE TABLE cliente ( id_cliente INT PRIMARY KEY, documento_identidad CHAR(11) , nombre VARCHAR(40), telf INT ); NOTA: PRIMARY KEY contiene las restricciones UNIQUE y NOT NULL por lo tanto no es necesario agregarlas a las llaves primarias. FOREIGN KEY Clave ajena que proviene de otra tabla. Ejemplo:
CREATE TABLE cuenta ( id_cuenta INT PRIMARY KEY, id_cliente INT REFERENCES cliente(id_cliente) , saldo VARCHAR(40), fecha_apertura DATE );
Pgina 19
GUA DE LABORATORIO
CREATE TABLE cuenta ( id_cuenta INT PRIMARY KEY, id_cliente INT , saldo VARCHAR(40), fecha_apertura DATE, FOREIGN KEY id_cliente REFERENCES cliente(id_cliente) );
Pgina 20
GUA DE LABORATORIO
8.- DOMINIOS
Un Dominio puede ser considerado como un tipo de dato y un Constraint, requiere de dos datos: el tipo base que utilizar el dominio, y la restriccin de limitacin para aceptar valores. Crear dominios Se utiliza el comando CREATE DOMAIN, y comprende tambin una serie de otras instrucciones como ser: CHECK, NOT NULL, DEFAULT, etc. CREATE DOMAIN [nombre] AS [tipo] (CONSTRAINT [nombre]) CHECK [condicion] Ejemplo: CREATE DOMAIN edad AS INT CONSTRAINT validar_edad CHECK((VALUE >0) AND (VALUE<99)); Eliminar un dominio Se utiliza la sentencia DROP DOMAIN. DROP DOMAIN edad CASCADE;
Pgina 21
GUA DE LABORATORIO
9.- SECUENCIAS
Es un objeto de base de datos creado con el propsito de asignar nmeros nicos de entrada a una tabla, generalmente utilizados para generar claves primarias. Crear una secuencia Ejemplo: CREATE SEQUENCE correlativo INCREMENT 1 START 1000; Funciones de secuencia Nextval [nombre_seq] Para obtener el siguiente valor de la secuencia. Currval [nombre_seq] Determina el ultimo valor devuelto por la secuencia. Setval [nombre_seq, nuevo_val] Cambia el valor actual de la secuencia indicada.
Alterar una secuencia Ejemplo: ALTER SEQUENCE correlativo SET START 2000; Eliminar una secuencia Ejemplo: DROP SEQUENCE correlativo; Ejemplo de uso de secuencia: CREATE SEQUENCE cod_cuenta INCREMENT 1 START 2000; CREATE TABLE cuenta ( id_cuenta INT PRIMARY KEY DEFAULT netval(cod_cuenta,), id_cliente INT REFERENCES cliente(id_cliente) , saldo VARCHAR(40), fecha_apertura DATE ); NOTA: Cada vez que se utiliza Nextval la secuencia sube el incremento incluso cuando se ejecuta SELECT nextval(correlativo) por lo tanto se debe reasignar el valor correcto con setval.
Pgina 22
GUA DE LABORATORIO
EJERCICIOS
1.- Crear el esquema privado donde debe estar incluida la tabla cliente y gerente 2.- Crear el dominio telefono que restrinja los datos entre 6400000 y 6499999 3.- Crear las siguientes tablas segn las especificaciones indicadas.
GERENTE
ATRIBUTO id_gerente nombre ap_pat ap_mat dir_gerente tel_gerente login pass TIPO int varchar(25) varchar(25) varchar(25) varchar(25) telefono * varchar(15) varchar(15) CONDICION PRIMARY KEY NOT NULL VALOR POR DEFECTO SECUENCIA(cod_ger) DESCRIPCION llave primaria datos personales datos personales datos personales datos personales datos personales nombre de usuario password
CLIENTE
ATRIBUTO id_cliente nombre ap_pat ap_mat dir_cliente tel_cliente CI NIT TIPO int varchar(25) varchar(25) varchar(25) varchar(25) telefono * int int CONDICION PRIMARY KEY NOT NULL VALOR POR DEFECTO SECUENCIA(cod_cli) DESCRIPCION llave primaria datos personales datos personales datos personales datos personales datos personales datos personales password
SUCURSAL
ATRIBUTO id_sucursal CONDICION int PRIMARY KEY ciudad_sucursal varchar(15) NOT NULL dir_sucursal varchar(25) NOT NULL tel_sucursal telefono* capital_disp float id_gerente int FOREIGN KEY TIPO VALOR POR DEFECTO SECUENCIA(cod_suc) DESCRIPCION llave primaria datos sucursal datos sucursal datos sucursal dinero disponible llave gerente
Pgina 23
GUA DE LABORATORIO
CUENTA
ATRIBUTO id_cuenta id_sucursal id_cliente saldo TIPO int int int float CONDICION PRIMARY KEY FOREIGN KEY FOREIGN KEY NO NEGATIVA MAYOR A 0,5 MENOR A 4 VALOR POR DEFECTO SECUENCIA(cod_cue) DESCRIPCION llave primaria llave sucursal llave cliente saldo de la cuenta
inters por la cuenta en porcentaje
CURRENT_TIME
PRESTAMO
ATRIBUTO id_prestamo id_sucursal id_cliente monto_pres interes fecha_pres periodo_int int int int float float datetime datetime TIPO CONDICION PRIMARY KEY FOREIGN KEY FOREIGN KEY NO NEGATIVA MAYOR A 0,5 MENOR A 4 VALOR POR DESCRIPCION DEFECTO SECUENCIA(cod_pre) llave primaria llave sucursal llave cliente monto prestado
inters por el prstamo en porcentaje
CURRENT_TIME
CLIENTE_CUENTA
ATRIBUTO id_cliente id_cuenta TIPO int int CONDICION PRIMARY KEY FOREIGN KEY PRIMARY KEY FOREIGN KEY VALOR POR DEFECTO DESCRIPCION
CLIENTE_PRESTAMO
ATRIBUTO id_cliente id_prestamo TIPO CONDICION int PRIMARY KEY FOREIGN KEY int PRIMARY KEY FOREIGN KEY VALOR POR DEFECTO DESCRIPCION
Pgina 24
GUA DE LABORATORIO
4.- Insertar 1 gerente, 6 sucursales, 25 clientes 15 cuentas y 10 prestamos 5.- Verificar el resultado de insertar una cuenta con saldo negativo, un inters de 5% 6.- Crear la tabla temporal cliente-cuenta y mostrar los datos personales del cliente y su saldo.
Pgina 25
GUA DE LABORATORIO
FUNCIONES Y CURSORES
Pgina 26
PRACTICA II
GUA DE LABORATORIO
A LIAS
Para una mejor legibilidad del cdigo, es posible denir un alias para un parmetro posicional de una funcin. Estos alias son necesarios cuando un tipo compuesto se pasa como argumento a una funcin. La notacin punto $1.salary como en funciones SQL no se permiten en PL/pgSQL. Ej.: nombre ALIAS FOR $n;
F UNCIONES
Una funcin devuelve un valor como resultado de su ejecucin: Para crear una funcin se tiene la siguiente sintaxis: CREATE OR REPLACE FUNCTION [nombre_funcion] (tipo1 nombre1,, tipoN nombreN) RETURNS tipo_resultado AS BEGIN sentencia; END; LANGUAGE plpgsql;
Pgina 27
GUA DE LABORATORIO
Para eliminar una funcin se utiliza el comando DROP FUNCTION. CREATE FUNCTION suma_uno (int4) RETURNS int4 AS BEGIN RETURN $1 + 1; END; LANGUAGE plpgsql; -- FUNCION PARA SUMAR 1 + 1
CREATE FUNCTION concat_texto (text, text) RETURNS text AS BEGIN RETURN $1 || $2; END; LANGUAGE plpgsql;
CREATE FUNCTION excedente_sueldo (EMP, int4) RETURNS bool AS --FUNCION QUE DECLARE -- COMPRUEBA SI emp_reg ALIAS FOR $1; -- EL SALARIO DE UN sal_lim ALIAS FOR $2; -- EMPLEADO ES BEGIN -- SUPERIOR A UN IF emp_reg.salary ISNULL THEN -- LIMITE RETURN f; END IF; RETURN emp_reg.salario > sal_lim; END; LANGUAGE plpgsql; NOTA: En la ltima funcin se enva un registro EMP que corresponde a la seleccin SELECT * FROM EMPLEADO WHERE id=id_buscado.
Pgina 28
GUA DE LABORATORIO
C URSORES
Son tablas temporales que permiten ejecutar grandes consultas. Son soportados dentro de las funciones, como un SQL embebido. Los cursores pueden o no hacer copias de sus resultados y sus resultados son de solo lectura. Utilizan los siguientes comandos: BEGIN.- Para indicar el comienzo de la operacin. DECLARE.- Define un cursor para acceso a una tabla. FETCH.- Permite devolver las filas usando un cursor. El numero de filas devueltas es especificado por un nmero (#), este puede ser reemplazado por ALL que har que se devuelvan todas las filas del cursor. Tambin se pueden utilizar los comandos BACKWARD y FORWARD para indicar la direccin. CLOSE.- Libera los recursos del cursor abierto. COMMIT.- Realiza la transaccin actual. END.- Es un sinnimo en PostgreSQL de COMMIT. Realiza la transaccin actual. ROLLBACK.- Deshace la transaccin actual y provoca que todas las modificaciones originadas por la misma sean descartadas. EJEMPLO: BEING WORK; DECLARE capital_1 CURSOR FOR SELECT * FROM sucursal WHERE capital<20000; -- CREA EL CURSOR FETCH FORWARD 2 IN capital_1; -- RECORRE ADELANTE DOS POSICIONES FETCH BACKWARD 1 IN capital_1; -- RECORRE ATRAS UNA POSICION CLOSE capital_1; -- CIERRA EL CURSOR COMMIT WORK; -- TERMINA LA TRANSACCION
Pgina 29
GUA DE LABORATORIO
EJERCICIOS
Utilizando la base de datos BANCO realizar los siguientes ejercicios: 1.- Crear una funcin que devuelva el inters ganado de una cuenta. (Saldo*interes_mesual) 2.- Crear una funcin que devuelva el mayor prstamo realizado a un cliente. 3.- Crear una funcin para devolver la cantidad total de prestamos de una sucursal 4.- Crear un cursor que contenga los prstamos realizados en el ltimo mes y mostrar los 2 ltimos. 5.- Crear un cursor con los clientes de Sucre y mostrar los 3 primeros.
Pgina 30
GUA DE LABORATORIO
PL/PGSQL (1 PARTE)
Pgina 31
PRACTICA III
GUA DE LABORATORIO
1. INTRODUCCIN
Es comn que los desarrolladores de aplicaciones subutilicen las prestaciones de las bases de datos relacionales modernas, en ocasiones implemente por desconocer las ventajas que le ofrecen o por desconocer su manejo. Dentro de PostgreSQL, la base de datos de cdigo abierto ms poderosa, se pueden desarrollar funciones en varios lenguajes. El lenguaje PL/pgSQL es uno de los ms utilizados dentro de PostgreSQL, debido a que guarda cierta similitud con PL/SQL de Oracle y a su facilidad de uso. En este tutorial se mostrar la sintaxis, el control de flujo y otras caractersticas del lenguaje, adems de presentarn algunos ejemplos reales.(3)
Programacin de funciones en PL/pgSQL para PostgreSQL Roberto Andrade Fonseca. ABL Consultores, S.A. de C.V.
4
Pgina 32
GUA DE LABORATORIO
2. ESTRUCTURA DE PL/PGSQL
Estructura de PL / PsSQL Es un lenguaje estructurado a base de bloques. La sintaxis de cada bloque esta definida de la siguiente manera: [ <<label>> ] [ DECLARE declaraciones ] BEGIN sentencias END; Pueden existir varios bloques o sub-bloques en la seccin de sentencias de un bloque. Los subbloques pueden ser usados para ocultar las variables a los bloques ms externos. Normalmente una de las sentencias es el valor de retorno, usando la palabra clave RETURN. Las variables declaradas en la seccin que antecede a un bloque se inicializan a su valor por omisin cada vez que se entra al bloque, no solamente al ser llamada la funcin. Por ejemplo: CREATE FUNCTION funcion() RETURNS INTEGER AS DECLARE cantidad INTEGER := 30; BEGIN RAISE NOTICE Cantidad contiene aqu %, cantidad; -- Cantidad contiene aqu 30 cantidad := 50; -- Creamos un sub-bloque DECLARE cantidad INTEGER := 80; Sub-bloque BEGIN RAISE NOTICE Cantidad contiene aqu %, cantidad; -- Cantidad contiene aqu 80 END; RAISE NOTICE Cantidad contiene aqu %, cantidad; -- Cantidad contiene aqu 50 RETURN cantidad; END; LANGUAGE plpgsql; VARIABLES Y ASIGNACIN DE VALORES
Bloque 1
Pgina 33
GUA DE LABORATORIO
2.1.1 C OMENTARIOS
Existen dos tipo de comentarios en PL/pgSQL. Un doble guin da inicio a un comentario, el cual se extiende hasta el final de la lnea. Un /* inicia un bloque que se extiende hasta la primera ocurrencia de */. ESTE ES UN COMENTARIO DE UNA LINEA /* ESTE ES UN COMENTARIO DE MAS DE UNA LINEA */
2.1.2 V ARIABLES Y
CONSTANTES
Todas las variables, filas y registros usados en un bloque o en sus sub-bloques deben declararse en la seccin de declaraciones del bloque. La excepcin es la variable de un ciclo FOR que itera sobre un rango de valores enteros. Las variables en PL/pgSQL pueden ser de cualquier tipo de datos de SQL, como INTEGER, VARCHAR y CHAR. El valor por omisin de todas las variables es el valor NULL de SQL. A continuacin se muestran algunos ejemplos de declaracin de variables: Id_usuario INTEGER; cantidad INTEGER; url VARCHAR;
Pgina 34
GUA DE LABORATORIO
2.2.2. B UCLES
Hay varios tipos de bucles. [<<etiqueta>>] LOOP sentencias END LOOP; Se trata de un bucle no condicional que ha de ser terminado de forma explicita, mediante una sentencia EXIT. La etiqueta opcional puede ser usada por las sentencias EXIT de otros bucles anidados, para especificar el nivel del bucle que ha de terminarse. [<<etiqueta>>] WHILE condicin LOOP sentencias END LOOP; Se trata de un lazo condicional que se ejecuta mientras la evaluacin de condicin sea cierta. [<<etiqueta>>] FOR nombre_variable IN [ REVERSE ] condicin LOOP sentencias END LOOP; Se trata de un bucle que se itera sobre un rango de valores enteros. La variable nombre_variable se crea automticamente con el tipo entero, y existe solo dentro del bucle. Las dos expresiones dan el lmite inferior y superior del rango y son evaluados slo cuando se entra en el bucle. El paso de la iteracin es siempre 1.
Pgina 35
BASE DE DATOS III [<<etiquetas>>] FOR registro | fila IN clausula_select LOOP sentencias END LOOP;
GUA DE LABORATORIO
El registro o fila se asigna a todas las filas resultantes de la clausula de seleccin, y la sentencia se ejecuta para cada una de ellas. Si el bucle se termina con una sentencia EXIT, la ltima fila asignada es an accesible despus del bucle. EXIT [ etiqueta ] [ WHEN condicin ]; Si no se incluye etiqueta, se termina el lazo ms interno, y se ejecuta la sentencia que sigue a END LOOP. Si se incluye etiqueta ha de ser la etiqueta del bucle actual u de otro de mayor nivel. EL bucle indicado se termina, y el control se pasa a la sentencia de despus del END del bucle o bloque correspondiente.
Pgina 36
GUA DE LABORATORIO
EJERCICIOS
Utilizando la base de datos BANCO realizar los siguientes ejercicios: 1.- Crear una funcin en PL/pgSQL que devuelva cuantos clientes tienen una cuenta superior a 5000 2.- Crear una funcin que en PL/pgSQL que devuelva cuantos clientes tienen una cuenta creada por lo menos hace un ao
Pgina 37
GUA DE LABORATORIO
PL/PGSQL (2 PARTE)
Pgina 38
PRACTICA IV
GUA DE LABORATORIO
S ENTENCIAS
Cualquier cosa no comprendida por el analizador PL/pgSQL tal como se especifica adelante ser enviada al gestor de la base de datos, para su ejecucin. La consulta resultante no devolver ningn dato.
A TRIBUTOS
Usando los atributos %TYPE y %ROWTYPE, es posible declarar variables con el mismo tipo de dato o estructura de otro item de la base de datos (por ejemplo, un campo de una tabla). %TYPE Proporciona el tipo de dato de una variable o una columna. Se puede utilizar para declarar variables que almacenen valores de bases de datos. Por ejemplo, supongamos que se tiene una columna llamada id_usuario en la tabla usuarios. Para declarar una variable con el mismo tipo de dato que el usado en nuestra tabla de usuarios, lo que se hara es: id_usuario usuarios.id_usuario\%TYPE;
Pgina 39
id_usuario usuarios.id_usuario\%TYPE
Al usar %TYPE no importan los cambios que se realicen en la definicin de los datos de una tabla siempre obtendremos el tipo del valor al que hacemos referencia. nombre T_tabla%ROWTYPE Declara una rengln con la estructura de la tabla especificada. T_tabla puede ser una tabla o una vista que exista en la base de datos. Los campos del rengln se accedan con la notacin punto. Los parmetros de una funcin pueden ser de tipo compuesto (renglones completos de una tabla). Es este caso, el identificador correspondiente $n ser del tipo rowtype, pero debe usarse un seudnimo o alias usando el comando ALIAS . Solamente los atributos del usuario de la tabla pueden ser accesibles en el rengln, ni los OID ni otros atributos del sistema (debido a que el rengln puede ser de una vista). Los campos de un rowtype heredan los tamaos de los campos o la precisin de los tipos de dato para char(), etc.
Pgina 40
GUA DE LABORATORIO
VISTAS Y REGLAS
Pgina 41
PRACTICA V
GUA DE LABORATORIO
Pgina 42
GUA DE LABORATORIO
ELIMINAR VISTAS.
Si en algn caso, se necesita modificar una vista, deber eliminarla primero y luego volverla a crear, de forma similar si tambin necesitas eliminar una vista de la base de datos, la sentencia es la siguiente: DROP VIEW <nombre_de_la_vista>
Pgina 43
GUA DE LABORATORIO
Su sintaxis es la siguiente: CREATE RULE nombre_regla AS ON event TO objeto [WHERE condicin] DO [INSTEAD] [accion | (acciones) | NOTHING]; Ejemplos: CREATE RULE suc_ins_protec AS ON INSERT TO vista_sucursal DO INSTEAD NOTHING; CREATE RULE suc_ins AS ON INSERT TO sucursal_vista DO INSTEAD INSERT INTO sucursal VALUES ( NEW.sucursal.nombre, NEW.sucursal. ciudad, NEW.sucursal.direccion, NEW.sucursal.telefono, NEW.sucursal.capital);
Pgina 44
GUA DE LABORATORIO
EJERCICIOS
1.- Crear una vista para los Clientes por ciudad 2.- Crear una vista con todos los datos de las sucursales 3.- Crear una vista con los clientes y sus cuentas 4.- Crear una vista con los clientes y sus prstamos 5.- Crear reglas para que no se puedan insertar datos en las vistas
Pgina 45
GUA DE LABORATORIO
Pgina 46
PRACTICA VI
GUA DE LABORATORIO
F UNCIONES TRIGGER
Tienen las siguientes caractersticas: No tienen argumentos. Tienen acceso a los constructores especiales NEW y OLD. El tipo de valor de retorno de una funcin trigger, debera ser de tipo trigger.
Ejemplo:
CREATE OR REPLACE FUNCTION actual() RETURNS trigger AS $$ BEGIN NEW.fecha_prestamo=now(); RETURN NEW; END; $$LANGUAGE plpgsql;
Pgina 47
GUA DE LABORATORIO
TRIGGERS
Un trigger define una accin basada en una ocurrencia especfica en una base de datos. En PostgreSQL , esto significa la ejecucin de un procedimiento almacenado, basado en acciones repetidas en una tabla especfica. Los triggers son definidos por seis caractersticas: El nombre del trigger. El Tiempo en el cual se debe inicializar el trigger. El evento en el cual se disparara el trigger. La tabla en la cual se disparar el trigger. La frecuencia de ejecucin. La funcin que debera ser llamada.
CREACIN DE TRIGGERS
CREATE TRIGGER, crea un nuevo disparador en la base de datos actual. Sintaxis: CREATE TRIGGER nombre_trigger {BEFORE|AFTER} {EVENT[OR]} ON table [FOR [EACH]{ROW|STATEMENT}] EXECUTE PROCEDURE nombre_funcin{argumentos} Donde: BEFORE El trigger se ejecuta antes de que la operacin sea realizada. AFTER El trigger se ejecuta despus de que la operacin haya sido realizada. EVENT Especifica el tipo de consulta que va a ejecutar el trigger, puede ser DELETE, INSERT o UPDATE. ON TABLE Indica la tabla donde se ejecutara el trigger. FOR EACH Define la frecuencia en con la cual es llamada la ejecucin de la funcin. EXECUTE PROCEDURE Define el procedimiento que va a ser ejecutado por el trigger.
Ejemplo: CREATE TRIGGER emp_sueldo BEFORE INSERT OR UPDATE ON empleado FOR EACH ROW EXECUTE PROCEDURE emp_sueldo(); NOTA: La funcin utilizada en el trigger deber ser declarada antes del Trigger, en el ejmplo la funcin emp_sueldo()
Pgina 48
GUA DE LABORATORIO
EJERCICIOS
Utilizando la base de datos BANCO realizar los siguientes ejercicios: 1.- Crear un trigger que controle que el capital no sea menor a 1000. 2.- Crear un trigger que controle que el saldo de un cliente sea menor a 100. 3.- Crear un trigger que controle que ningn cliente saque un prstamo mayor al capital de la sucursal. 4.- Crear un Trigger para calcular automticamente el inters de un prstamo al concluir el periodo de clculo de inters.
Pgina 49
GUA DE LABORATORIO
Pgina 50
BASE DE DATOS III Tipo SET abstime aclitem bool box bpchar bytea char cid cidr circle date datetime filename float4 float8 inet int2 int28 int4 int8 line lseg macaddr money name numeric oid oid8 path point polygon regproc reltime smgr text tid Descripcin
GUA DE LABORATORIO
conjunto de tuplas fecha y hora absoluta de rango limitado (Unix system time) lista de control de acceso booleano 'true'/'false' rectngulo geomtrico '(izquierda abajo, derecha arriba)' caracteres rellenos con espacios, longitud especificada al momento de creacin arreglo de bytes de longitud variable un slo carcter command identifier type, identificador de secuencia en transacciones direccin de red crculo geomtrico '(centro, radio)' fecha ANSI SQL 'aaaa-mm-dd' fecha y hora 'aaaa-mm-dd hh:mm:ss' nombre de archivo usado en tablas del sistema nmero real de precisin simple de 4 bytes nmero real de precisin doble de 8 bytes direccin de red nmero entero de dos bytes, de -32k a 32k 8 nmeros enteros de 2 bytes, usado internamente nmero entero de 4 bytes, -2B to 2B nmero entero de 8 bytes, 90#9018 dgitos lnea geomtrica '(pt1, pt2)' segmento de lnea geomtrica '(pt1, pt2)' direccin MAC unidad monetaria '$d,ddd.cc' tipo de 31 caracteres para guardar identificadores del sistema nmero de precisin mltiple tipo de identificacin de objetos arreglo de 8 oids, utilizado en tablas del sistema trayectoria geomtrica '(pt1, ...)' punto geomtrico '(x, y)' polgono geomtrico '(pt1, ...)' procedimiento registrado intervalo de tiempo de rango limitado y relativo (Unix delta time) manejador de almacenamiento (storage manager) cadena de caracteres nativa de longitud variable tipo de identificador de tupla, localizacin fsica de tupla
Pgina 51
BASE DE DATOS III Tipo time timespan timestamp tinterval unknown varchar Descripcin
GUA DE LABORATORIO
hora ANSI SQL 'hh:mm:ss' intervalo de tiempo '@ <number> <units>' fecha y hora en formato ISO de rango limitado intervalo de tiempo '(abstime, abstime)' tipo desconocido cadena de caracteres sin espacios al final, longitud especificada al momento de creacin
Pgina 52
GUA DE LABORATORIO
Pgina 53
GUA DE LABORATORIO
Fuente: http://www.postgresql.org/docs/7.3/static/functions-datetime.html
Pgina 54