P. 1
Introducción a PostgreSQL

Introducción a PostgreSQL

|Views: 15.418|Likes:
Publicado porBATIAR2D2
manejador de bases de datos
manejador de bases de datos

More info:

Published by: BATIAR2D2 on Mar 03, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

08/21/2013

pdf

text

original

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Introducción a PostgreSQL

¿Qué es PostgreSQL?

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

PostgreSQL es un sistema manejador de bases de datos relacionales basado en postgres 4.2, desarrollado en el departamento Berkeley de Ciencias de la computación en la universidad de California. Postgres es Open Source descendiente del código original “Berkeley”, soporta el estándar SQL y ofrece otros recursos tales como:
○ complex queries ○ foreign keys ○ Triggers ○ Views ○ transactional integrity ○ multiversion concurrency control ○ index methods ○ procedural languages

Postgres puede ser usado, modificado o distribuido para uso privado, comercial o Académico

Introducción a PostgreSQL

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Ahora probaremos un poco la terminal interactiva llamada psql: para probarla teclee las siguientes consultas:
 SELECT version();
 SELECT current_date;  SELECT 2 + 2;

Introducción a PostgreSQL
Ahora crearemos una tabla llamada climas, este ejemplo nos servirá para verificar su estructura: CREATE TABLE climas ( ciudad varchar(80), temp_baja int, -- baja temperatura temp_alta int, -- alta temperatura prcp real, -- precipitacion fecha date );

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Introducción a PostgreSQL Create.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Ahora crearemos otra tabla llamada ciudades, una de las cualidades de esta es que utilizara un tipo de dato especifico de postgres, el tipo POINT.
CREATE TABLE ciudades ( nombre varchar(80), localizacion point );

Nota: Si desea eliminar una tabla utilice el siguiente comando: DROP TABLE tablename;

Introducción a PostgreSQL Insert.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Ya creadas nuestras tablas ahora procederemos a utilizar INSERT el Statement (Sentencia) que nos servirá para insertar datos en nuestras tablas, su sintaxis puede ser alguna de las siguientes:
INSERT INTO climas ( ciudad, temp_baja , temp_alta, prcp, fecha) VALUES ('Mexico', 5, 30, 0.25, '2009-06-23'); INSERT INTO climas VALUES ('Atlautla', 5, 30, 0.25, '2009-06-23');

Introducción a PostgreSQL. Select.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Como se menciono anteriormente postgres soporta el estándar SQL así que para realizar una consulta, puede utilizar el SELECT con sus respectivas cláusulas FROM, WHERE y los operadores. Por ejemplo: --Esto nos Arrojara una tabla con todos los registros SELECT * FROM climas; --Esto nos una tabla con los campos especificados SELECT Ciudad, temp_baja,temp_alta FROM climas; --Esto nos mostrará solo la ciudad llamado Atlautla solo si su prcp(precipitación) es mayor a 20 SELECT * FROM climas WHERE Ciudad = 'Atlautla' AND prcp > 0.20;

Introducción a PostgreSQL Operadores.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

--Muestra todos los registros ordenados por el nombre de la ciudad SELECT * FROM climas ORDER BY ciudad;

--Elimina registros duplicados SELECT DISTINCT ciudad FROM climas;


  

AND Y lógica o Conjunción OR O lógica o Disyunción = Igual a >= Mayor o Igual <= Menor o Igual <> o != Diferente

Introducción a PostgreSQL Join.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Muchas veces necesitamos acceder a mas de una tabla al mismo tiempo, para ello utilizares los joins que nos permitirán acceder a múltiples registros de dos o mas tablas al mismo tiempo. Un JOIN es la unión de dos o mas tablas. Por ejemplo:
 SELECT * FROM climas, ciudades WHERE ciudad=

'Mexico';
 SELECT climas.ciudad, climas.temp_baja,

climas.temp_alta, climas.prcp, climas.fecha, ciudades.localizacion FROM climas, ciudades WHERE ciudades.nombre = climas.ciudad;

Introducción a PostgreSQL Funciones.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Las funciones de agregación realizan operaciones con un conjunto de valores. Por ejemplo:
Encontrar promedios o encontrar el máximo o mínimo valor.
 SELECT max(temp_baja) FROM climas;  SELECT ciudad FROM climas WHERE temp_baja

= (SELECT max(temp_baja) FROM climas);
 SELECT ciudad, max(temp_baja) FROM

climas WHERE ciudad LIKE 'M%‘ GROUP BY ciudad HAVING max(temp_baja) < 40;

Introducción a PostgreSQL Update.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Esta sentencia se utiliza para actualizar algunos datos o cuando estos han cambiado o simplemente por algún error en la inserción Por ejemplo:
 SELECT * FROM climas;

 UPDATE climas SET temp_alta =

temp_alta - 2, temp_baja = temp_baja 5 WHERE fecha >= '2009-06-23';

Introducción a PostgreSQL Delete.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

La sentencia Delete se utiliza para eliminar registros de las tablas, Por ejemplo:
 DELETE FROM climas WHERE

ciudad='Mexico';

Su sintaxis es:
 DELETE FROM NombreTabla

(Condicion);

Introducción a PostgreSQL Herencia.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Este es un concepto básico de las base de datos orientados a objetos, por ejemplo considere dos tablas:

  


  

CREATE TABLE ciudad ( nombre text, poblacion real, altitud int -- (in ft) );
CREATE TABLE capital ( estado char(2) ) INHERITS (ciudad);

Introducción a PostgreSQL Llave Primaria (PK) y Foránea (FK)

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Una llave foránea es una referencia entre tablas (campo coincidente), si ahora agregamos llaves foráneas a nuestras tablas de ejemplo, su estructura quedaría de la siguiente manera: CREATE TABLE ciudades ( ciudad varchar(80) primary key, localizacion point );
CREATE TABLE climas ( ciudad varchar(80) references ciudades(ciudad), temp_baja int, temp_alta int, prcp real, fecha date);

Introducción a PostgreSQL Llave Primaria (PK) y Foránea (FK)

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Para crear las PK‟s y FK‟s a tablas ya existentes, usamos la siguiente sentencia:
CREATE TABLE ciudades ( ciudad varchar(80) primary key, localizacion point );

ALTER TABLE ciudades ADD CONSTRAINT PRIMARY KEY (ciudad);

ciudad_pk

Introducción a PostgreSQL Llave Primaria (PK) y Foránea (FK)
CREATE TABLE climas ( ciudad varchar(80) references ciudades(ciudad), temp_baja int, temp_alta int, prcp real, fecha date); ALTER TABLE climas ADD CONSTRAINT ciudad_fk FOREIGN KEY (ciudad) REFERENCES ciudades (ciudad) ON DELETE CASCADE;

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Introducción a PostgreSQL Llave Primaria (PK) y Foránea (FK)
Hay tres parámetros cuando definimos una clave foránea que son muy importantes y que definen como la base de datos se va a comportar para salvaguardar la integridad de nuestros datos. ALTER TABLE [ ONLY ] name [ * ] action [, ... ]

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Estos parámetros son:
  

MATCH tipo ON DELETE accion ON UPDATE accion En donde tipo puede tener estos valores:

 

FULL: No permite que una columna tenga el valor NULL en una clave foránea compuesta por varias columnas SIMPLE: Permite que una columna tenga el valor NULL en una clave foránea compuesta por varias columnas

Introducción a PostgreSQL Llave Primaria (PK) y Foránea (FK)
Y accion puede tener estos valores:

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

NO ACTION: Produce un error indicando que un DELETE ó UPDATE creará una violación de la clave foránea definida.

RESTRICT: Produce un error indicando que un DELETE ó UPDATE creará una violación de la clave foránea definida.
CASCADE: Borra ó actualiza automáticamente todas las referencias activas SET NULL: Define las referencias activas como NULL SET DEFAULT: Define las referencias activas como el valor por defecto (si está definido) de las mismas

 

Introducción a PostgreSQL Llave Primaria (PK) y Foránea (FK)
ALTER TABLE ALTER TABLE [ ONLY ] name [ * ] action [, ... ] ALTER TABLE [ ONLY ] name [ * ] RENAME [ COLUMN ] column TO new_column ALTER TABLE name RENAME TO new_name ALTER TABLE name SET SCHEMA new_schema Action : ADD [ COLUMN ] column type [ column_constraint [ ... ] ] DROP [ COLUMN ] column [ RESTRICT | CASCADE ] ALTER [ COLUMN ] column [ SET DATA ] TYPE type [ USING expression ] ALTER [ COLUMN ] column SET DEFAULT expression ALTER [ COLUMN ] column DROP DEFAULT ALTER [ COLUMN ] column { SET | DROP } NOT NULL ALTER [ COLUMN ] column SET STATISTICS integer ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ADD table_constraint DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ] DISABLE TRIGGER [ trigger_name | ALL | USER ] ENABLE TRIGGER [ trigger_name | ALL | USER ] ENABLE REPLICA TRIGGER trigger_name ENABLE ALWAYS TRIGGER trigger_name DISABLE RULE rewrite_rule_name ENABLE RULE rewrite_rule_name ENABLE REPLICA RULE rewrite_rule_name ENABLE ALWAYS RULE rewrite_rule_name CLUSTER ON index_name SET WITHOUT

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Introducción a PostgreSQL Llave Primaria (PK) y Foránea (FK)

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Ahora si tratáramos de hacer una inserción en la tabla climas postgres lanzará un error indicando que ese campo no existe en la tabla ciudades, por tanto nuestros datos quedaran íntegros y no abra información demás.
NOTA: Un campo para poder ser llave foránea deberá ser del mismo tipo de dato de la otra tabla.

Introducción a PostgreSQL Vistas.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Una vista es una tabla virtual que puede contener campos de una o varias tablas, y estas a su vez se manipulan como tablas, cualquier Statement SELECT puede ser una vista. Para crear una vista:
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ] AS query

CREATE VIEW MiVista AS SELECT temp_baja, temp_alta, prcp, fecha, localizacion FROM climas, ciudades WHERE ciudad = nombre;

Introducción a PostgreSQL. Transacciones.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Nos permiten ejecutar múltiples consultas y hacer que todas se ejecuten o que ninguna lo haga.
Iniciamos la transacción con el comando BEGIN, después ejecutamos alguna sentencia, y para terminar con la transacción usamos ROLLBACK. Por lo tanto, los datos quedaran intactos al hacer ROLLBACK, lo que deshace todas las operaciones que escribimos.

Pero si deseamos que los cambios sean permanentes utilizamos COMMIT.

Introducción a PostgreSQL. Funciones.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Se almacenan y ejecutan desde el proceso de
base de datos y no desde la aplicación del cliente. Comúnmente llamadas "PROCEDIMIENTOS ALMACENADOS" no solo en lenguaje SQL que es un lenguaje que carece de estructuras de control como IF, WHILE, FOR y otros, sino que permite definir un lenguaje propio y extenderlo a la base de datos, es así como están disponibles para Postgres los siguientes lenguajes : C, Perl, Phyton, PHP entre otros.

Introducción a PostgreSQL. Funciones.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Estos lenguajes deben ser instalados en la base de datos previamente antes de ser utilizados.
Sin embargo, también existe un lenguaje propio de PostgreSQL, denominado "PL/pgsql", que posee estructuras de control y permite aprovechar toda la potencia de SQL para crear nuestras propias funciones.

Introducción a PostgreSQL. Funciones.
VENTAJAS DEL USO DE FUNCIONES

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Se pueden crear funciones para ser ejecutadas en algún evento de la base de datos. Al borrar, modificar o insertar datos por ejemplo. Se pueden añadir estructuras de control al lenguaje SQL, podemos ahora definir ciclos de ejecución como FOR y WHILE que nos permitan recorrer variables de tipo array, tablas u otras estructuras. Las funciones nos permiten realizar cálculos complejos, así ampliamos las funciones pre-definidas por el motor de base de datos y construir funciones a medida de nuestras necesidades o las del cliente/empresa.

Introducción a PostgreSQL. Funciones.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

VENTAJAS DEL USO DE FUNCIONES

Nos aporta una ejecución fiable para el servidor, es decir, podemos estar seguros del conjunto de instrucciones de la función definida se ejecutará, sin importar si ocurren problemas en el cliente, en una conexión o enlace, una vez solicitada la función esta se ejecuta en modo seguro y protegido en el servidor.

Es un lenguaje fácil de usar, pues extiende de una manera simplista pero a la vez potente el lenguaje SQL.

Introducción a PostgreSQL. Funciones.
DESCRIPCION DEL LENGUAJE.
ESTRUCTURA DE PL/pgSQL

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

El lenguaje PL/pgSQL no es sensible a las mayúsculas. Todas las palabras clave e identificadores pueden usarse en cualquier mezcla de mayúsculas y minúsculas, sin embargo, de preferencia, el nombre de tablas y de registros utilice según definió en la base de datos.

PL/pgSQL es un lenguaje orientado a bloques. la estructura básica del lenguaje se define de la siguiente manera :

Introducción a PostgreSQL. Funciones.
DESCRIPCION DEL LENGUAJE.
ESTRUCTURA DE PL/pgSQL

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

CREATE [OR REPLACE] FUNCTION <nombre_de_funcion> ([lista de parámetros]) RETURNS <tipo_de_retorno> AS ' DECLARE <declaración de variables locales de la función> BEGIN <sentencias propias de la función> END; ' LANGUAGE 'plpgsql'; NOTA: En algunos casos no se instala el lenguaje 'plpgsql„, para instalarlo, solo ejecutamos: CREATE LANGUAGE 'plpgsql';

Introducción a PostgreSQL. Funciones.
DEFINIENDO LOS PARAMETROS DE LAS FUNCIONES

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Una de las características de PL/pgSQL es que no es necesario definir los nombres de variables en la función, sólo es necesario definir si tipo, de esta manera tenemos que una función puede ser definida en términos de parámetros de entrada y salida de la siguiente forma :

FUNCTION suma ( real , real ) RETURNS real AS ' ...resto de la función... Cabe notar que podemos utilizar como parámetros todos los tipos usados por PostgreSQL, es decir : INTEGER, DATE, TIME, VARCHAR, CHAR, TIMESTAMP, REAL, TEXT y muchos otros, e inclusive tipos definidos por el usuario por medio de la instrucción CREATE TYPE.

Introducción a PostgreSQL. Funciones.
DEFINICION DE VARIABLES LOCALES O DE FUNCION

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Como explicamos anteriormente, las variables locales son definidas dentro de la sección DECLARE de la función, de forma muy similar a otros lenguajes podemos definir variables, por ejemplo :

DECLARE contador integer = 0; cadena varchar; hoy date; bandera bool; suma real;
FUNCTION suma ( real , real ) RETURNS real AS ' DECLARE numero_1 alias for $1; numero_2 alias for $2; valor_total real; ...resto de la funcion... Podemos no definir los alias y usar los parámetros directamente, por ejemplo : valor_total := $1 + $2;

Introducción a PostgreSQL. Funciones.
ASIGNACION DE LAS SENTENCIAS DE PL/pgSQL

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Una vez definidos los parámetros de entrada/salida, y también nuestras variables locales, podemos comenzar a trabajar en nuestra función en la sección BEGIN .... END; Las asignaciones de valores se realizan de la misma forma que en PASCAL, es decir, utilizando := como operador de asignación y punto y coma al final de la línea, ejemplo :

FUNCTION suma ( real , real ) RETURNS real AS ' DECLARE numero_1 alias for $1; numero_2 alias for $2; valor_total real; BEGIN valor_total := numero_1 + numero_2; numero_1 := numero_1 * numero_2; ...resto de la funcion...

Introducción a PostgreSQL. Funciones.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

RETORNANDO EL UN VALOR COMO FUNCION
Finalmente una vez procesados nuestros valores debemos retornar algún valor (pues ese es la esencia de la función), este retorno de valores también se realiza dentro de la sección BEGIN de la función, pero utilizando la siguiente forma básica : ...resto de la función... RETURN <variable>; ...resto de la función...

Introducción a PostgreSQL. Funciones.
Ejemplo completo de la función SUMA : FUNCTION suma ( real , real ) RETURNS real AS ' DECLARE numero_1 alias for $1; numero_2 alias for $2; valor_total real; BEGIN valor_total := numero_1 + numero_2; RETURN valor_total; END; ' LANGUAGE 'plpgsql';

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

RETORNANDO EL UN VALOR COMO FUNCION

Introducción a PostgreSQL. Funciones.
UTILIZANDO SENTENCIAS DE CONTROL

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Podemos utilizar sentencias de control para escribir nuestros programas y permitir que sigan un algoritmo no lineal, para ello, contamos básicamente con las siguientes estructuras : LOOP EXIT IF, ELSE FOR WHILE

Introducción a PostgreSQL. Funciones.
UTILIZANDO SENTENCIAS DE CONTROL SENTENCIA DE CICLO LOOP :

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Esta sentencia nos permite efectuar un ciclo, su estructura básica es : ...resto de la función... LOOP ...sentencias a ejecutar en el ciclo... END LOOP ...resto de la función...

Introducción a PostgreSQL. Funciones.
SENTENCIA DE SALIDA EXIT :

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Cuando usamos un ciclo LOOP, es necesario darle una salida para que este mismo termine, la sentencia EXIT nos permite finalizar el LOOP y continuar en la sentencia siguiente a la salida de éste, generalmente, EXIT está acompañado con la sentencia IF, por ejemplo

LOOP ...resto de la función... contador := contador + 1; IF contador >= 10 THEN EXIT; -- salida del loop cuando sea mayor o igual que 10 END IF; END LOOP ...resto de la función...

Introducción a PostgreSQL. Funciones.
SENTENCIAS IF, ELSE :

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Podemos efectuar operaciones de comparación con las sentencias IF, ELSE, los operadores de comparación son los siguientes : < menor que ... > mayor que ... <> distinto a ... <= menor o igual que ... >= mayor o igual que ... = igual que ... OR o ... AND y ...

Introducción a PostgreSQL. Funciones.
SENTENCIAS IF, ELSE : Ejemplo : ...resto de la función... IF >= 10 or THEN RETURN true;

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

ELSE RETURN false; END IF; ...resto de la función...

Introducción a PostgreSQL. Funciones.
SENTENCIA DE CICLO FOR :

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Existen dos tipos de ciclos FOR, el primero tiene que ver claramente con los ciclos numéricos comunes, es decir, lo que comúnmente se usa para efectuar repeticiones, y por otra parte, tenemos un ciclo FOR que nos permite recorrer tablas y procesar sus datos, esta segunda está ligada a sentencias SQL, veamos entonces como se utiliza la sentencia FOR CASO 1 : SENTENCIA FOR DE PROCESO CICLICO NUMERICO FOR <variable> IN <inicio>..<fin> LOOP ... SENTENCIAS A EJECUTAR DENTRO DEL CICLO FOR ... END LOOP; o bien puede usar el FOR de forma inversa FOR <variable> REVERSE <fin>..<inicio> LOOP ... SENTENCIAS A EJECUTAR DENTRO DEL CICLO FOR ...

Introducción a PostgreSQL. Funciones.
SENTENCIA DE CICLO FOR :

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

CASO 1 : SENTENCIA FOR DE PROCESO CICLICO NUMERICO Ejemplo : ...resto de la función... FOR inc IN 1..10 LOOP factorial := factorial * inc; END LOOP; RETURN factorial; ...resto de la función…

Introducción a PostgreSQL. Funciones.
SENTENCIA DE CICLO FOR :

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

CASO 2: SENTENCIA FOR APLICADA A PROCESOS DE REGISTROS SQL FOR <registro o fila> IN <sentencia SELECT SQL> LOOP ... SENTENCIAS A EJECUTAR DENTRO DEL CICLO FOR ... END LOOP;

Introducción a PostgreSQL. Funciones.
SENTENCIA DE CICLO FOR : Ejemplo : ...resto de la función... DECLARE registro RECORD; BEGIN FOR registro IN SELECT * FROM productos LOOP stock := registro.sock_actual + 100; ... otras sentencias ... END LOOP; ...resto de la función...

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Note que para utilizar esta sentencia FOR debemos declarar una variable de tipo RECORD o registro. RECORD es una palabra reservada para estos casos, y no posee una estructura definida pues no ha sido asignada a ninguna tabla, este tipo de dato nos permite recorrer la tabla de productos y obtener sus valores por medio de esta variable.

Introducción a PostgreSQL. Funciones.
SENTENCIA DE CICLO CONDICIONAL WHILE

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

La sentencia WHILE se ejecuta de forma muy similar a otros lenguajes de programación, su estructura es la siguiente : WHILE <condición> LOOP ... SENTENCIAS A EJECUTAR DENTRO DEL CICLO WHILE ... END LOOP;

Introducción a PostgreSQL. Funciones.
SENTENCIA DE CICLO CONDICIONAL WHILE Ejemplo : ...resto de la función... WHILE inc <= 10 LOOP factorial := factorial * inc; END LOOP; RETURN factorial; ...resto de la función...

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Este código funciona igual al descrito en el ejemplo del ciclo FOR.

Introducción a PostgreSQL. Funciones.
Ejemplo 1 : Buscar una Ciudad y retornar si existe o no

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

CREATE OR REPLACE FUNCTION buscar_ciudad (varchar) RETURNS bool AS ' DECLARE rut_buscar alias for $1; registro ciudades%ROWTYPE; /* Nótese que aquí definimos la variable registro del tipo FILA de ciudades indicando la tabla, el símbolo % y luego la palabra reservada ROWTYPE */ BEGIN SELECT INTO registro * FROM ciudades WHERE ciudad = rut_buscar; IF FOUND THEN RETURN true; END IF; RETURN false; END; ' LANGUAGE 'plpgsql'; Como podemos apreciar, este código busca un cliente en la tabla de clientes, si existe o se encuentra el cliente, la función devolverá un valor verdadero (true), de lo contrario, ésta devolverá falso (false)

Introducción a PostgreSQL. Funciones.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Ejemplo 2 : Buscar un producto y actualiza su precio según porcentaje CREATE OR REPLACE FUNCTION actualizar_producto (varchar, real) RETURNS bool AS ' DECLARE producto ALIAS FOR $1; porcentaje ALIAS FOR $2; registro productos%ROWTYPE; BEGIN SELECT INTO registro * FROM productos WHERE id_producto = producto; IF FOUND THEN UPDATE productos SET precio_venta = precio_venta + (precio_venta * porcentaje) WHERE id_categoria = categoria; RETURN true; END IF; RETURN false; END; ' LANGUAGE 'plpgsql„; Este código busca el producto, obtiene los datos necesarios y actualiza el registro.

Introducción a PostgreSQL. Funciones.
Ejemplo 3 : Incrementar valores según el porcentaje de IVA CREATE OR REPLACE FUNCTION inc_iva (integer, real) RETURNS integer AS ' DECLARE valor ALIAS FOR $1; iva ALIAS FOR $2; total real; BEGIN total := valor + (valor * iva); RETURN total; RETURN; END; ' LANGUAGE 'plpgsql';

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Esta función no actualiza realmente los datos de la tabla, solamente procesa los parámetros, de tal manera que si los datos ingresados fueran los de una tabla devolvería el valor mas IVA.

Introducción a PostgreSQL. Funciones.
LLAMANDO A LAS FUNCIONES

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Hasta ahora hemos descrito a grandes rasgos como construir fácilmente funciones de usuario o procedimientos almacenados, pero todavía no los hemos invocado, a continuación ejemplos de llamadas a los procedimientos almacenados o funciones en PL/pgSQL : Este ejemplo retornará true si la ciudad existe o false si no se encuentra en la tabla de clientes (nota, no hay que indicar en que tabla pues eso esta descrito en la función). SELECT buscar_ciudad('Mexico');

Para ejecutar la función de SUMA:
SELECT SUMA(4,5);

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Es una acción definida en una tabla de nuestra base de datos y ejecutada automáticamente por una función programada por nosotros. Esta acción se activará, según la definamos, cuando realicemos un INSERT, un UPDATE ó un DELETE en la susodicha tabla.

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Un disparador se puede definir de las siguientes maneras:
Para que ocurra ANTES de cualquier INSERT, UPDATE ó DELETE Para que ocurra DESPUES de cualquier INSERT, UPDATE ó DELETE Para que se ejecute una sola vez por comando SQL (statement-level trigger) Para que se ejecute por cada línea afectada por un comando SQL (row-level trigger)

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Esta es la definición del comando SQL que se puede utilizar para definir un disparador en una tabla. CREATE TRIGGER nombre { BEFORE | AFTER } { INSERT | UPDATE | DELETE [ OR ... ] } ON tabla [ FOR [ EACH ] { ROW | STATEMENT }] EXECUTE PROCEDURE nombre de función ( argumentos )

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

NOTA: Antes de definir el disparador tendremos que
definir el procedimiento almacenado que se ejecutará cuando nuestro disparador se active. El procedimiento almacenado usado por nuestro disparador se puede programar en cualquiera de los lenguajes de procedimientos disponibles, entre ellos, el proporcionado por defecto cuando se instala PostgreSQL, PL/pgSQL. Este lenguaje es el que utilizaremos.

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Creamos una base de datos para utilizarla con nuestros ejemplos. CREATE TABLE numeros( numero bigint NOT NULL, cuadrado bigint, cubo bigint, raiz2 real, raiz3 real, PRIMARY KEY (numero) );

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Después tenemos que crear una función en PL/pgSQL para ser usada por nuestro disparador. Nuestra primera función es la más simple que se puede definir y lo único que hará será devolver el valor NULL: CREATE OR REPLACE FUNCTION proteger_datos() RETURNS TRIGGER AS $proteger_datos$ DECLARE BEGIN -- Esta función es usada para proteger datos en una tabla -- No se permitirá el borrado de filas si la usamos -- en un disparador de tipo BEFORE / row-level RETURN NULL; END; $proteger_datos$ LANGUAGE plpgsql;

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

A continuación definimos en la tabla numeros un disparador del tipo BEFORE / row-level para la operación DELETE.

CREATE TRIGGER proteger_datos BEFORE DELETE ON numeros FOR EACH ROW EXECUTE PROCEDURE proteger_datos();

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Ahora vamos a definir una nueva función un poco más complicada y un nuevo disparador en nuestra tabla numeros: CREATE OR REPLACE FUNCTION rellenar_datos() RETURNS TRIGGER AS $rellenar_datos$ DECLARE BEGIN NEW.cuadrado := power(NEW.numero,2); NEW.cubo := power(NEW.numero,3); NEW.raiz2 := sqrt(NEW.numero); NEW.raiz3 := cbrt(NEW.numero); RETURN NEW; END; $rellenar_datos$ LANGUAGE plpgsql; CREATE TRIGGER rellenar_datos BEFORE INSERT OR UPDATE ON numeros FOR EACH ROW EXECUTE PROCEDURE rellenar_datos();

Introducción a PostgreSQL. Disparadores (triggers).
SELECT * from numeros; numero | cuadrado | cubo | raiz2 | raiz3 -----------+-------------+-------+-------+------INSERT INTO numeros (numero) VALUES (2); SELECT * from numeros; numero | cuadrado | cubo | raiz2 | raiz3 ------------+-------------+-------+-------------+--------2| 4| 8 | 1.41421 | 1.25992 Cuando ejecutamos el INSERT (numero = 2), el disparador rellenar_datos llama a la función rellenar_datos() una vez.

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Ahora vamos a ver como los disparadores que hemos definido en la tabla numeros funcionan:

Introducción a PostgreSQL. Disparadores (triggers).
  

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

El valor de la variable NEW al empezar a ejecutarse rellenar_datos() es numero=2, cuadrado=NULL, cubo=NULL, raiz2=NULL, raiz3=NULL. Nuestra tabla todavía no contiene ninguna fila. A continuación calculamos el cuadrado, el cubo, la raíz cuadrada y la raíz cúbica de 2 y asignamos estos valores a NEW.cuadrado, NEW.cubo, NEW.raiz2 y NEW.raiz3.

El valor de la variable NEW antes de la sentencia RETURN NEW es ahora numero=2, cuadrado=4, cubo=8, raiz2=1.41421, raiz3=1.25992.
Con la sentencia RETURN NEW, retornamos la fila (RECORD) almacenada en la variable NEW, y salimos de la función rellenar_datos(). El sistema almacena entonces el RECORD contenido en NEW en la tabla numeros

Introducción a PostgreSQL. Disparadores (triggers).
INSERT INTO numeros (numero) VALUES (3); SELECT * from numeros; numero | cuadrado | cubo | raiz2 | raiz3 -----------+-------------+-------+-------------+--------2| 4| 8 | 1.41421 | 1.25992 3| 9 | 27 | 1.73205 | 1.44225

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

De la misma manera funciona el disparador proteger_datos cuando ejecutamos una sentencia DELETE. Antes de borrar nada ejecutará la función proteger_datos(). Esta función retorna el valor NULL y esto significa, según la regla que hemos definido, que para la fila afectada no se ejecutará el comando DELETE. Por eso y mientras este disparador este instalado será imposible de borrar nada de la tabla numeros.

Introducción a PostgreSQL. Disparadores (triggers).
UPDATE numeros SET numero = 4 WHERE numero = 3; SELECT * from numeros; numero | cuadrado | cubo | raiz2 | raiz3 -----------+-------------+-------+-------------+--------2| 4| 8 | 1.41421 | 1.25992 4| 16 | 64 | 2 | 1.5874

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Ahora vamos a ver como los disparadores que hemos definido en la tabla numeros funcionan:

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Hemos realizado 2 INSERT y 1 UPDATE. Esto significa que por cada uno de estos comandos el sistema ha ejecutado la función rellenar_datos(), una vez por cada fila afectada y antes de actualizar la tabla numeros.
Como podemos comprobar, nosotros solamente hemos actualizado la columna numero, pero al listar el contenido de nuestra tabla vemos como el resto de columnas (cuadrado, cubo, raiz2 y raiz3) también contienen valores. De esta actualización se ha encargado rellenar_datos() llamada por nuestro disparador. la función

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Para eliminar/borrar un trigger, tenemos la siguiente sentencia:
DROP TRIGGER nombre ON tabla [ CASCADE | RESTRICT ]

CASCADE
Elimina automáticamente el borrado de objetos que dependen del trigger. RESTRICT Se niegan a eliminar el trigger si los objetos dependen de él. Este es el predeterminado. DROP TRIGGER proteger_datos ON numeros; DROP TRIGGER rellenar_datos ON numeros;

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

A continuación crearemos un disparador único para las sentencias INSERT, UPDATE y DELETE. Para ello utilizaremos la variable TG_OP. CREATE OR REPLACE FUNCTION proteger_y_rellenar_datos() RETURNS TRIGGER AS $proteger_y_rellenar_datos$ DECLARE BEGIN IF (TG_OP = 'INSERT' OR TG_OP = 'UPDATE' ) THEN NEW.cuadrado := power(NEW.numero,2); NEW.cubo := power(NEW.numero,3); NEW.raiz2 := sqrt(NEW.numero); NEW.raiz3 := cbrt(NEW.numero); RETURN NEW; ELSEIF (TG_OP = 'DELETE') THEN RETURN NULL; END IF; END; $proteger_y_rellenar_datos$ LANGUAGE plpgsql;

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

CREATE TRIGGER proteger_y_rellenar_datos BEFORE INSERT OR UPDATE OR DELETE ON numeros FOR EACH ROW EXECUTE PROCEDURE proteger_y_rellenar_datos();

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Ahora, todo seguirá funcionando de la misma manera que con los dos disparadores del comienzo: INSERT INTO numeros (numero) VALUES (5); INSERT INTO numeros (numero) VALUES (6);

Introducción a PostgreSQL. Disparadores (triggers).

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

Ahora vamos a definir un disparador del tipo statement-level que se ejecute después de nuestras sentencias INSERT, UPDATE y DELETE. La función ejecutada por este disparador grabará datos de la ejecución en la tabla cambios. Para demostrar cómo podemos utilizar esto vamos a definir una nueva tabla: CREATE TABLE cambios( timestamp_ TIMESTAMP WITH TIME ZONE default NOW(), nombre_disparador text, tipo_disparador text, nivel_disparador text, comando text );

Introducción a PostgreSQL. Disparadores (triggers).
La función la podemos definir así:

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

CREATE OR REPLACE FUNCTION grabar_operaciones() RETURNS TRIGGER AS $grabar_operaciones$ DECLARE BEGIN INSERT INTO cambios ( nombre_disparador, tipo_disparador, nivel_disparador, comando) VALUES ( TG_NAME, TG_WHEN, TG_LEVEL, TG_OP ); RETURN NULL; END; $grabar_operaciones$ LANGUAGE plpgsql;

Introducción a PostgreSQL. Disparadores (triggers).
Y el disparador lo crearíamos de la siguiente forma:

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

CREATE TRIGGER grabar_operaciones AFTER INSERT OR UPDATE OR DELETE ON numeros FOR EACH STATEMENT EXECUTE PROCEDURE grabar_operaciones();

Introducción a PostgreSQL. Disparadores (triggers).
A continuación podemos ver como funcionaría:
Revisamos que la tabla este vacía: SELECT * from cambios ; Ingresamos un valor: INSERT INTO numeros (numero) VALUES (100); Verificamos que se haya insertado en la Bitácora: SELECT * from numeros;

Facultad de Ingeniería Enrique Felipe Anastacio Base de Datos

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->