You are on page 1of 51

CREACIN DE UNA BASE DE DATOS

CREACION DE UNA BASE DE DATOS Prcticamente, la creacin de la base de datos consiste en la creacin de las tablas que la componen. As que para la creacin de una nueva base de datos se debe dar clic en una de las bases de datos que estn creadas y abrir un nuevo texto de consultas. GRAFICO La sintaxis empleada por PostgreSQL, pero tambin por las DBMS ms difundidas, es la siguiente: CREATE DATABASE nombre_base_de_datos Ejemplo: CREATE DATABASE PEDIDOS Creacin de Tablas Las tablas forman parte de una base de datos, como se dijo anteriormente entonces para crear una tabla debemos resolver qu campos (columnas) tendr y qu tipo de datos almacenarn cada uno de ellos, es decir, su estructura.
Sintaxis: create table NOMBRETABLA( NOMBRECAMPO1 TIPODEDATO, ... NOMBRECAMPON TIPODEDATO );

Ejemplo CREATE TABLE EMPLEADOS( EMPLEADOID int NOT NULL, NOMBRE char(30) NULL, APELLIDO char(30) NULL, FECHA_NAC date NULL, REPORTA_A int NULL, EXTENSION int NULL, CONSTRAINT PK_EMPLEADOS PRIMARY KEY (EMPLEADOID));

DROP TABLE El comando DROP TABLE permite eliminar una tabla, incluyendo todas las tuplas almacenadas en ella: Ejemplo:
Sintaxis: DROP TABLE table_name;

DROP TABLE CATEGORIAS; INSERT INTO Para llenar una tabla previamente creada se hace el uso del comando INSERT INTO, que permite llenar todos los campos que la tabla tiene.
Sintaxis: INSERT INTO table_name (name_of_attr_1 [, name_of_attr_2 [,...]]) VALUES (val_attr_1 [, val_attr_2 [ ...]]);

Ejemplo: insert into categorias (categoriaid, nombrecat) values (100, CARNICOS); insert into categorias (categoriaid, nombrecat) values (200, LACTEOS); insert into categorias (categoriaid, nombrecat) values (300, LIMPIEZA); FUNCION UPDATE Cambia los valores de columnas especificadas en todas las flas que satisfagan cierta condicin. En la clausula SET se deben mencionar solamente las columnas a ser modificadas; el resto de columnas no mencionadas retendrn sus valores anteriores. Por defecto, UPDATE puede actualizar una tabla especfica y todas sus subtablas. Si se desea actualizar nicamente cierta tabla, se debe utilizar la clausula ONLY. Existen dos maneras de modificar una tabla utilizando la informacin contenida en otras tablas en la base de datos: utilizando subconsultas o especificando las tablas adicionales en la clausula FROM. La tcnica ms apropiada depende de las circunstancias especficas.

Sintaxis: UPDATE [ ONLY ] table SET column = { expression | DEFAULT } [, ...] [ FROM fromlist ]

Donde: table: Nombre de la tabla a actualizar. column: Nombre de la columna de la tabla. El nombre de la columna puede calificarse como nombre de un subcampo o subndice del arreglo, si es necesario. expression: Expresin para asignar a la columna. La expresin podra utilizar los antiguos valores de esa y otras columnas en la tabla. DEFAULT: Asigna el valor predefinido a la columna (qu ser NULL si ninguna expresin predefinida especfica se ha asignado a l). fromlist: Una lista de expresiones de la tabla, permitiendo la aparicin de columnas de otras tablas en la condicin WHERE y las expresiones de actualizacin. Esto es similar a la lista de tablas en que pueden especificarse en la funcin FROM de una sentencia SELECT. La tabla designada no debe aparecer en el fromlist, a menos que se inserte un self-join (en tal caso debe aparecer con un alias). condition: Una expresin que devuelve un valor del tipo booleano. Solamente pueden actualizadas las flas para las cuales devuelve el valor true. UPDATE count: count es el nmero de flas actualizadas. Si el valor de count es igual a cero, ninguna fila cumple con la condicin (no quiere decir que ha ocurrido un error). Nota: Cuando una clausula FROM est presente, lo que ocurre esencialmente es que la tabla designada se une a las tablas mencionadas en el fromlist, y cada fila resultante en la unin representa una operacin de actualizacin para las tablas designadas. Cuando se utiliza FROM se debe asegurar que la unin produce a lo mucho una fila resultante para cada fila a ser modificada. En otras palabras, una fila designada no debe unir a ms de una fila en la otra tabla(s). Si lo hace, entonces solamente se utilizar una fila para actualizarla cuya seleccin es aleatoria. Debido a esta indeterminacin, es ms seguro hacer referencia a otras tablas dentro de subconsultas de SELECT, aunque a menudo es ms difcil leer y ms retardado que utilizando una unin.

Ejemplo: Actualizar el nombre de la categora HIGINE PERSONAL a HIGIENE PERSONAL, en la columna nombrecat: UPDATE CATEGORIAS SET nombrecat = HIGIENE PERSONAL WHERE nombrecat = HIGINE PERSONAL; ALTER TABLE: Cambia la definicin de una tabla existente. Existen varias de sus formas:

ADD COLUMN: Aade una nueva columna a la tabla utilizando la misma sintaxis que CREATE TABLE. DROP COLUMN: Elimina una columna de la tabla. Los ndices y constraints que involucra la column debern ser automticamente borrados tambin. Si algn elemento externo depende de la columna, ser necesario utilizar la clausula CASCADE, por ejemplo, referencias a clave forneas o vistas. SET/DROP DEFAULT: Coloca o remueve el valor predefinido de una columna. El valor predefinido slo se aplica las rdenes INSERT subsecuentes. Tambin pueden crearse valores predeterminados para vistas, en el caso en que son insertadas en las declaraciones INSERT antes de que la regla de la vista ON INSERT sea aplicada. SET/DROP NOT NULL: Cambian si una columna es marcada para permitir valores o rechazar los valores nulos. SET STATISTICS: Coloca un valor de estadsticas recogidas por columna para una operacin ANALIZE subsecuente. El valor puede estar en el rango de 0 a 1000; alternativamente, se usa -1 para revertir el uso del sistema de valores de estadsticas predeterminado. SET STORAGE: Define el modo de almacenamiento de una columna. Este controla si dicha columna depende de otra tabla suplementaria, y si los datos deben comprimirse o no. PLAIN debe utilizarse para valores de longitud fija como el entero interno no comprimible. MAIN es para datos ligados comprimibles. EXTERNAL es para datos externos no comprimibles, y EXTENDED es para datos externos comprimibles. EXTENDED es el valor predeterminado para todo tipo de datos que lo soportan.

SET WITHOUT OIDS: Quita el identificador de columna de la tabla. La remocin de OIDs de una tabla no ocurre inmediatamente. El espacio que ocupa el OID se guardar cuando la fila sea actualizada. Si no se actualiza la fila, el espacio y el valor del OID son guardados indefinidamente. Esta semntica es similar a la del proceso DROP COLUMN. RENAME: Cambia el nombre de una tabla (o un ndice, secuencia, o vista) o el nombre de una columna individual en la tabla. No hay efecto en el almacenamiento de datos. ADD table_constraint: Aade un nuevo constraint a la tabla usando la misma sintaxis que CREATE TABLE. DROP CONSTRAINT: Elimina los constraints de una tabla. Actualmente, los constraints de las tablas no requieren tener nombres nicos, entonces puede haber ms de un constraint identificados los cuales sern eliminados. OWNER: Cambia el propietario de una tabla, ndice, secuencia, o vista de un usuario especificado. CLUSTER: Marca una tabla para futuras operaciones CLUSTER. La clausula ALTER TABLE solo puede ser ejecutada por el propietario de la tabla, mientras la clausula ALTER TABLE OWNER, slo puede ser ejecutada por un superusuario.

Sintaxis: ALTER TABLE [ ONLY ] name [ * ] ADD [ COLUMN ] column type [ column_constraint [ ... ] ] ALTER TABLE [ ONLY ] name [ * ] DROP [ COLUMN ] column [ RESTRICT | CASCADE ] ALTER TABLE [ ONLY ] name [ * ] ALTER [ COLUMN ] column { SET DEFAULT expression | DROP DEFAULT } ALTER TABLE [ ONLY ] name [ * ] ALTER [ COLUMN ] column { SET | DROP } NOT NULL ALTER TABLE [ ONLY ] name [ * ] ALTER [ COLUMN ] column SET STATISTICS integer ALTER TABLE [ ONLY ] name [ * ] ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } ALTER TABLE [ ONLY ] name [ * ] SET WITHOUT OIDS ALTER TABLE [ ONLY ] name [ * ] RENAME [ COLUMN ] column TO new_column ALTER TABLE name RENAME TO new_name ALTER TABLE [ ONLY ] name [ * ] ADD table_constraint ALTER TABLE [ ONLY ] name [ * ] DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ] ALTER TABLE name OWNER TO new_owner ALTER TABLE name CLUSTER ON index_name

Donde: name: Nombre de una tabla existente para alterarla. Si se desea alterar una sola tabla, se debe utilizar la clausula ONLY. Caso contrario, se alterarn la tabla y todas las tablas que desciendan de sta. column: Nombre de una columna ya existente o nueva. type: Tipo de dato para la nueva columna. new_column: Nombre nuevo para una columna existente. new_name: Nombre nuevo para la tabla. table_constraint: Nuevo constraint para la tabla. constraint_name: Nombre de un constraint existente para eliminarlo. new_owner: Nombre del usuario o del nuevo propietario de la tabla. index_name: Nombre del ndice que indica la tabla marcada para CLUSTER. CASCADE: Elimina automticamente objetos que dependen de una columna o constraint eliminado. RESTRICT: Negacin a eliminar la columna o constraint si hay objetos dependientes. Esta es una conducta predeterminada. Notas: La palabra clave columna puede ser omitida. En la implementacin actual de las clausulas ADD COLUMN, default y NOT NULL para la nueva columna no son soportadas. La nueva columna siempre entra teniendo todos los valores nulos. Se puede utilizar la forma SET DEFAULT de ALTER TABLE para poner el valor predeterminado despus. Para marcar la columna como no nula, se utiliza la forma SET NOT NULL, despus de haber ingresado los valores no nulos el las flas de la columna. La forma DROP COLUMN no elimina la columna fsicamente, simplemente la hace invisible para las operaciones de SQL. Subsecuentemente las operaciones INSERT y UPDATE podran almacenar valores nulos en esta columna. As, eliminar una columna es fcil pero no reduce inmediatamente el tamao en disco de la tabla, ya que el espacio ocupado por la tabla eliminada no puede reutilizarse a menos que se realice una operacin UPDATE sobre las flas. Si una tabla tiene tablas descendientes, no es permitido aadir o renombrar una columna en la tabla padre sin hacer lo mismo en las descendientes. Es decir, ALTER TABLE ONLY ser rechazado. Esto asegura que las tablas descendientes siempre estn emparejadas a la tabla padre.

Una operacin recursiva DROP COLUMN slo quitar la columna de una tabla descendiente, si sta no hereda esa columna de cualquier padre. Una operacin no recursiva DROP COLUMN (ALTER TABLE ONLY DROP COLUMN) nunca remueve columnas descendientes, en cambio las marca como herencia.

Ejemplos: Aadir una nueva columna del tipo varchar a la tabla EMPLEADOS: ALTER TABLE EMPLEADOS ADD COLUMN Direccion varchar(30); Eliminar una columna de una tabla: ALTER TABLE EMPLEADOS DROP COLUMN Direccion RESTRICT; Renombrar una columna existente de la tabla DETALLE_ORDENES ALTER TABLE DETALLE_ORDENES RENAME COLUMN CANTIDAD TO QUANTITY;

CONSULTAS SQL

CONSULTAS SQL WHERE: En este ejemplo slo se devuelven las flas de la tabla Productos que suministra el proveedor de cdigo 10 y el producto que entrega es SALCHICHAS SELECT descripcion, preciounit AS Precio unitario FROM productos WHERE proveedorid = 10 AND descripcion LIKE SALCHICHAS % Operadores de comparacin (como =, < >, < y >). -- Muestre los productos que tengan un precio mayor a 2.60 SELECT descripcion, preciounit AS Precio unitario FROM productos WHERE preciounit >2.60 Intervalos (BETWEEN y NOT BETWEEN). -- Muestre los productos con precios entre 9 y 15 SELECT descripcion, preciounit AS Precio unitario FROM productos WHERE preciounit BETWEEN 9 AND 15 ORDER BY preciounit -- Muestre los productos con precios fuera de 9 y 15 SELECT descripcion, preciounit AS Precio unitario FROM productos WHERE preciounit NOT BETWEEN 9 AND 15 ORDER BY preciounit Listas (IN, NOT IN). -- Muestre las categoras que sean CARNICOS, LACTEOS o MEDICINAS SELECT * FROM categorias WHERE nombrecat IN (CARNICOS,LACTEOS,MEDICINAS)

Coincidencia de modelos (LIKE y NOT LIKE). -- Muestre los empleados cuyo nombre empiece con J SELECT * FROM empleados WHERE nombre LIKE J% -- Muestre los empleados cuyo nombre no empiece con J SELECT * FROM empleados WHERE nombre NOT LIKE J% Valores NULL (ISNULL y NOTNULL). --Muestra las rdenes donde no existe descuento SELECT * FROM ordenes WHERE descuento ISNULL --Muestra las rdenes donde existe descuento SELECT * FROM ordenes WHERE descuento NOTNULL

FUNCIONES

FUNCIONES EL LENGUAJE DE FUNCIONES PL/pgSQL Una de las caractersticas de PostgreSQL es que permite al usuario o administrador de la base de datos escribir sus propias funciones dentro de la base de datos, estas funciones se almacenan y ejecutan desde el proceso de base de datos y no desde la aplicacin del cliente. PostgreSQL permite en este sentido crear sus funciones de usuario o comnmente 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 estn disponibles para Postgre los siguientes lenguajes: C, Perl, Phyton, PHP entre otros. Estos lenguajes deben ser instalados en la base de datos previamente antes de ser utilizados. Sin embargo, tambin 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, es este lenguaje de funciones en el que concentraremos este manual. VENTAJAS DEL USO DE FUNCIONES Desde el momento en que podemos crear nuestras propias funciones en la base de datos, obtenemos una serie de ventajas en nuestras aplicaciones, es as como podemos mencionar las siguientes ventajas del uso de funciones definidas por el usuario. Se pueden crear funciones para ser ejecutadas en algn evento de la base de datos. Al borrar, modificar o insertar datos por ejemplo. Se pueden aadir estructuras de control al lenguaje SQL, podemos ahora definir ciclos de ejecucin como FOR y WHILE que nos permitan recorrer variables de tipo array, tablas u otras estructuras. Las funciones nos permiten realizar clculos complejos, as ampliamos las funciones predefinidas por el motor de base de datos y construir funciones a medida de nuestras necesidades o las del cliente/empresa. Se pueden heredar todos los tipos definidos por el usuario, las funciones y los operadores, esta caracterstica nos permite tomar variables de tipo registro o fila (RECORD o ROW) y permitirnos procesar sus datos.

Nos aporta una ejecucin fable para el servidor, es decir, podemos estar seguros de de el conjunto de instrucciones de la funcin definida se ejecutar, sin importar si ocurren problemas en el cliente, en una conexin o enlace, una vez solicitada la funcin esta se ejecuta en modo seguro y protegido en el servidor. NOTA: Es un lenguaje fcil de usar, pues extiende de una manera simplista pero a la vez potente el lenguaje SQL. DESCRIPCION DEL LENGUAJE ESTRUCTURA DE PL/pgSQL El lenguaje PL/pgSQL no es sensible al reconocimiento de maysculas. Todas las palabras clave e identificadores pueden usarse en cualquier mescla de maysculas y minsculas, sin embargo, de preferencia, el nombre de tablas y de registros utilice segn defini en la base de datos. PL/pgSQL es un lenguaje orientado a bloques. la estructura bsica del lenguaje se define de la siguiente manera : CREATE [OR REPLACE] FUNCTION <nombre_de_funcion> ([lista de parmetros]) RETURNS <tipo_de_retorno> AS $$ DECLARE <declaracin de variables locales de la funcin> BEGIN <sentencias propias de la funcin> END; $$LANGUAGE plpgsql; DEFINIENDO LOS PARAMETROS DE LAS FUNCIONES Una de las caractersticas de PL/pgSQL es que no es necesario definir los nombres de variables en la funcin, slo es necesario definir si tipo, de de esta manera tenemos que una funcin puede ser definida en trminos de parmetros de entrada y salida de la siguiente forma : FUNCTION suma ( real , real ) RETURNS real AS /*...resto de la funcion... */ En este ejemplo definimos la funcin suma con dos parmetros de entrada de tipo real y tambin la salida o RETURNS de tipo real. Cabe notar que podemos utilizar como parmetros 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 instruccin CREATE TYPE. DEFINICION DE VARIABLES LOCALES O DE FUNCION Como explicamos anteriormente, las variables locales son definidas dentro de la seccin DECLARE de la funcin, de forma muy similar a otros lenguajes podemos definir variables, por ejemplo: DECLARE contador integer = 0; cadena varchar; fecha date; continuar bool; suma real; En este caso definimos una serie de variables con su tipo de dato, tambin, podemos definir una variable y asignarle un valor en la misma lnea de cdigo de la definicin de la variable (note la variable contador inicializada en cero). 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... */ Continuando nuestra funcin suma, podemos apreciar que en la definicin de variables usamos una nomenclatura especial para asignar nombres de variable a los parmetros de entrada, de hecho, si no hace esta redefinicin, puede los parmetros asignando $ y el nmero indicador en la lista de parmetros a cada variable de parmetro, por ejemplo: valor_total = $1 + $2; ASIGNACION DE LAS SENTENCIAS DE PL/pgSQL Una vez definidos los parmetros de entrada/salida, y tambin nuestras variables locales, podemos comenzar a trabajar en nuestra funcin en la seccin BEGIN .... END; Las asignaciones de valores se realizan de la misma forma que en PASCAL, es decir, utilizando = como operador de asignacin y punto y coma al final de la lnea, 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... */ Como vemos en este ejemplo la asignacin de valores es prcticamente igual a PASCAL.

RETORNANDO EL UN VALOR COMO FUNCION Finalmente una vez procesados nuestros valores debemos retornar algn valor (pues ese es la esencia de la funcin), este retorno de valores tambin se realiza dentro de la seccin BEGIN de la funcin, pero utilizando la siguiente forma bsica : /*...resto de la funcion... */ RETURN <variable>; /*...resto de la funcion... */ Ejemplo completo de la funcin 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; Poco a poco hemos ido creando esta funcin, ahora est terminada y lista para ser utilizada.

ASIGNANDO COMENTARIOS Si as lo necesitas, puedes documentar tus funciones usando los operadores /* ... */ para crear un comentario de bloque multilinea o bien -- para un comentario de lnea sencilla, Ejemplo : /*...resto de la funcin... */ /* Este es un comentario que utiliza multiples lneas de comentario */ -- Este es un comentario en una sola lnea /*...resto de la funcin... */ UTILIZANDO SENTENCIAS DE CONTROL Podemos utilizar sentencias de control para escribir nuestros programas y permitir que sigan un algoritmo no lineal, para ello, contamos bsicamente con las siguientes estructuras: LOOP EXIT IF, ELSE FOR WHILE

SENTENCIA DE CICLO LOOP Esta sentencia nos permite efectuar un ciclo, su estructura bsica es: /*...resto de la funcion... */ LOOP ...sentencias a ejecutar en el ciclo... END LOOP /*...resto de la funcion... */

SENTENCIA DE SALIDA EXIT: 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 acompaado con la sentencia IF, por ejemplo

LOOP /*...resto de la funcion... */ 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 funcion... */

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

Ejemplo: /*...resto de la funcion... */ IF >= 10 or THEN RETURN true; ELSE RETURN false; END IF; /*...resto de la funcion... */ SENTENCIA DE CICLO FOR Existen dos tipos de ciclos FOR, el primero tiene que ver claramente con los ciclos numricos comunes, es decir, lo que comnmente 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... END LOOP; Ejemplo: /*...resto de la funcion... */ FOR inc IN 1..10 LOOP factorial = factorial * inc; END LOOP; RETURN factorial; /*...resto de la funcion... */ 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; Ejemplo: /*...resto de la funcion... */ DECLARE registro RECORD; BEGIN FOR registro IN SELECT * FROM productos LOOP stock = registro.sock_actual + 100; /*... otras sentencias... */ END LOOP; /*...resto de la funcion... */

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.

SENTENCIA DE CICLO CONDICIONAL WHILE La sentencia WHILE se ejecuta de forma muy similar a otros lenguajes de programacin, su estructura es la siguiente: WHILE <condicion> LOOP ... SENTENCIAS A EJECUTAR DENTRO DEL CICLO WHILE... END LOOP; Ejemplo: /*...resto de la funcion... */ WHILE inc <= 10 LOOP factorial = factorial * inc; END LOOP; RETURN factorial; /*...resto de la funcion...*/ Este cdigo funciona igual al descrito en el ejemplo del ciclo FOR. EJEMPLOS COMBINANDO PL/pgSQL con SQL Una de las caractersticas que hacen de este lenguaje una herramienta poderosa, es la capacidad de interactuar con SQL, obtener datos y procesarlos, la forma de utilizar SQL es tan familiar que solo basta realizar los comandos SQL para ejecutar o procesar los datos necesarios. Ejemplo 1: Buscar un cliente y retornar si existe o no CREATE OR REPLACE FUNCTION buscar_cliente (varchar) RETURNS bool AS DECLARE ruc_buscar alias for $1; registro clientes%ROWTYPE; /* Aqui se defne la variable registro del tipo FILA de clientes indicando la tabla, el simbolo % y luego la palabra reservada ROWTYPE */

BEGIN SELECT INTO registro * FROM clientes WHERE ruc_cliente = ruc_buscar; IF FOUND THEN RETURN true; END IF; RETURN false; END; $$LANGUAGE plpgsql; Como podemos apreciar, este cdigo busca un cliente en la tabla de clientes, si existe o se encuentra el cliente, la funcin devolver un valor verdadero (true), de lo contrario, sta devolver falso (false). Ejemplo 2: Buscar un producto y actualiza su precio segn porcentaje CREATE OR REPLACE FUNCTION actualizar_producto (varchar, varchar, real) RETURNS bool AS DECLARE producto ALIAS FOR $1; porcentaje ALIAS FOR $2; categoria ALIAS FOR $3; registro productos%ROWTYPE; BEGIN SELECT INTO registro * FROM productos WHERE productoid = producto; IF FOUND THEN UPDATE productos SET PRECIOUNIT = PRECIOUNIT + (PRECIOUNIT * porcentaje) WHERE categoriaid = categoria; RETURN true; END IF; RETURN false; END; $$LANGUAGE plpgsql; Este cdigo busca el producto, obtiene los datos necesarios y actualiza el registro. Ejemplo 3: Incrementar valores segn 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; Esta funcin no actualiza realmente los datos de la tabla, solamente los procesa parmetros, de tal manera que si los datos ingresados fueran los de una tabla devolvera el valor mas IVA.

LLAMANDO A LAS FUNCIONES Hasta ahora hemos descrito a grandes rasgos como construir fcilmente funciones de usuario o procedimientos almacenados, pero todava no los hemos invocado, a continuacin ejemplos de llamadas a los procedimientos almacenados o funciones en PL/pgSQL: Este ejemplo retornar true si el cliente SELECT buscar_ existe o fase si no se encuentra en la tabla cliente(1710185883); de clientes. El producto PRO-0540 actualizar su SELECT actualizar_producto(PROprecio en un 3% ms. 0540,0.03) Sumar 2 nmeros y retornara su valor SELECT suma(5.45, 10.452) Retornar si el RUT est validado o no pero SELECT valida_ruc (ruc_cliente), analizar todos los registros de la tabla. nombres, apellidos FROM clientes Esta sentencia utiliza la funcion que SELECT incrementa los precios con IVA y renombra codigo,nombre, descripcion, la salida de la funcion inc_iva a precio_ inc_iva(precio_venta,0.18) AS precio_ iva. iva FROM productos

Funciones SQL Funciones SQL son construcciones definidas por el estndar SQL92, que tiene sintaxis igual que funciones pero que no pueden ser implementadas como simples funciones.

Funciones COALESCE(list)

Retorna no-NULO

NU-LLIF(input,value) CASE WHEN expr THEN expr [...] ELSE expr END

input or NULO expr

Descripcin retorna el primer valor no-NULO en la lista retorna NULO si input = value retorna la expresin para la primera clasula verdadera

Ejemplo COALESCE(rle>, c2 + 5, 0) NULLIF(c1, N/A) CASE WHEN c1 = 1 THEN match ELSE no match END

FUNCIONES MATEMTICAS

Funciones dexp(foat8)

Retorna fooat8 float8

float(int) float4(int) integer(float)

float8 foat4 int

Descripcin redimensiona al exponente especificado redimensiona un numero al exponente especificado convierte un entero a punto convierte un entero a punto convierte un punto flotante a punto

Ejemplo dexp(2.0) dpow(2.0, 16.0)

float(2) foat4(2) integer(2.0)

FUNCIONES STRING SQL92 define funciones de texto con sintaxis especfica. Algunas son implementadas usando otras funciones Postgres Los tipos de Texto soportados para SQL92 son char, varchar, y text. Funciones char_ characlower(string) octet_ position(string in substring(string upper(text) Retorna int4 ter_ int4 string int4 int4 string string oth] text Descripcin longitud del texto longitud del texto convierte el texto almacena el octet_ localiza la position extrae un substring borra caracteres convierte un texto Ejemplo char_ char_ lower(TOM) octet_ (o) in (Tom) trim(both x )from upper(tom)

La mayora de funciones de texto estn disponibles para tipos text, varchar() y char().Algunas son usadas internamente para implementar las funciones de texto SQL92 descritas arriba. Funciones char(text) char(varchar) initcap(text) pad(text,int,text) ltrim(text,text) textpos(text,text) rpad(text,int,text) rtrim(text,text) Retorna Char char text text text text text text text text text text varchar Descripcin convierte un texto a tipo char convierte un varchar a tipo char primera letra de cada palabra a initcap relleno de caracteres por lpad recorte de caracteres localiza un subtexto relleno de caracteres por rpad recorte de caracteres extrae el subtexto especificado convierte char a tipo text convierte varchar a tipo text convierte character a string translate convierte char a tipo varchar Ejemplo char(text string) (varchar varchar string) (thomas) (hi,4,??)

position(high,ig) (hi,4,x)

substr(hi there,3,5) text(char string) (varchar varchar string) (12345) varchar (char string)

text(char) text(varchar) translate(text,from,to) varchar(char)

varchar(text)

varchar

convierte text a tipo varchar (text varchar string)

La mayora de funciones explcitamente defI8nidas para texto trabajarn para argumentos char () y varchar(). FUNCIONES DE FECHA/HORA Las funciones de Fecha/Hora provee un poderoso conjunto de herramientas para manipular varios tipos Date/Time. Funciones Retorno abstime timespan ) datetime Descripcin Ejemplo convierte a abstime preserva meses y age (now,1957aos 0613::datetime) convierte date datetime(1998a datetime 0224::datetime, porcin de fecha da- te_ part (dow,now:: datetime porcin de hora date_ part(hour,4 hrs 3 mins::timespan) fecha truncada da- te_ trunc(month,now un tiempo finito? isfniuna hora finita? isfniuna hora finita? isfnite(4 convierte a reltime(4 reltime convierte a timespan(4 timespan

datetime(date)

da- te_ da- te_

float8 float8

da- te_ isfnite(abstime) isfnite(datetime) isfnite(timespan) reltime(timespan) timespan(reltime)

datetime bool bool bool reltime timespan

Para las funciones date_part and date_trunc, los argumentos pueden ser year, month, day, hour, minute, y second, as como las mas especializadas cantidades decade, century, millenium, millisecond, y microsecond. date_part permite dow para retornar el da de la semana epoch para retornar los segundos desde 1970 (para datetime) o epoch para retornar el total de segundos transcurridos (para timespan).

FUNCIONES DE FORMATO Las funciones de formato proveen un poderoso conjunto de herramientas para convertir varios datetypes (date/time, int, float, numeric) a texto formateado y convertir de texto formateado a su datetypes original. Funciones to_char(datetime, text) to_char(timestamp, to_char(int, text) to_char(float, text) to_ char(numeric, to_datetime(text, text) to_date(text, text) to_ timestamp(text, text) to_number(text, text) Retorno text text text text text datetime date date numeric Descripcin convierte datetime a string convierte timestamp a to_char convierte int4/int8 a string convierte foat4/ float8 a string convierte numeric a string convierte string a datetime convierte string a date convierte string a timestamp convierte string a numeric Ejemplo to_ to_char( now(), HH12:MI:SS) to_char(125, 999) to_char(125.8, 999D9) to_char(-125.8, 999D99S) to_datetime(05 Dec 2000 13, DD Mon) to_date(05 Dec 2000, DD Mon) to_timestamp(05 Dec 2000, DD Mon)

Para todas las funciones de formato, el segundo argumento es format-picture. Format-picture HH HH12 MI SS SSSS Y,YYY YYYY YYY YY Y Descripcin hora del da(01-12) hora del da(01-12) minuto (00-59) segundos (00-59) segundos pasados la medianoche(086399) ao(4 o mas dgitos) con coma ao(4 o mas dgitos) ltimos 3 dgitos del ao ltimos 2 dgitos del ao ltimo dgito del ao

MONTH Month month MON Mon mon MM DAY Day day DY Dy dy DDD DD D W WW CC J da juliano Q RM

nombre completo del mes(9-letras) todos los caracteres en maysculas nombre completo del mes(9letras) - el primer carcter en maysculas nombre completo del mes(9-letras) todos los caracteres en minsculas nombre abreviado del mes(3-letras) -todos los caracteres en maysculas nombre abreviado del mes(3-letras) - el primer carcter en maysculas nombre abreviado del mes(3-letras) - todos los caracteres en minsculas mes (01-12) nombre completo del da(9-letters) todos los caracteres en maysculas nombre completo del da(9-letters) el primer carcter en maysculas nombre completo del da(9-letters) todos los caracteres en minsculas nombre abreviado del da(3-letters) - todos los caracteres en maysculas nombre abreviado del da(3-letters) - el primer carcter en maysculas nombre abreviado del da(3-letters) - todos los caracteres en minsculas da del ao(001-366) da del mes(01-31) da de la semana(1-7; SUN=1) semana del mes nmero de la semana en el ao centuria (2-digits) (das desde Enero 1, 4712 BC) Quarter mes en numeral romano(I-XII; I=ENE)

JOINS

JOINS (CRUCES) El siguiente ejemplo muestra como las joins (cruces) se realizan en SQL. Para cruzar tres tablas PRODUCTOS, PROVEEDORES y DETALLE ORDENES a travs de sus atributos comunes, formularemos la siguiente instruccin: SELECT pr.nombreprov, p.descripcion, d.cantidad FROM proveedores pr, productos p, detalle_ordenes d WHERE p.productoid = d.productoid AND pr.proveedorid=p.proveedorid:; En la clausula FROM hemos introducido un alias al nombre para cada relacin porque hay atributos con nombre comn en las relaciones. Ahora podemos distinguir entre los atributos con nombre comn simplificando la adiccin de un prefijo al nombre del atributo con el nombre del alias seguido de un punto. La join se calcula de la misma forma, tal como se muestra en Una Inner Join (Una Join Interna). Primero el producto cartesiano PRODUCTOS x PROVEEDORES x DETALLE ORDENES. Ahora seleccionamos nicamente aquellas tuplas que satisfagan las condiciones dadas en la clausula WHERE (es decir, los atributos con nombre comn deben ser iguales). OPERADORES AGREGADOS SQL proporciona operadores agregados (como son AVG, COUNT, SUM, MIN, MAX) que toman el nombre de un atributo como argumento. El valor del operador agregado se calcula sobre todos los valores de la columna especificada en la tabla completa. Si se especifican grupos en la consulta, el clculo se hace slo sobre los valores de cada grupo (vean la siguiente seccin). Ejemplo: Si queremos conocer el coste promedio de todos los artculos de la tabla PART, utilizaremos la siguiente consulta: SELECT AVG(preciounit) AS Precio promedio FROM productos; Si queremos conocer cuntos artculos se recogen en la tabla PART, utilizaremos la instruccin: SELECT COUNT(productoid) FROM productos;

AGREGACIN POR GRUPOS SQL nos permite particionar las tuplas de una tabla en grupos. En estas condiciones, los operadores agregados descritos antes pueden aplicarse a los grupos (es decir, el valor del operador agregado no se calculan sobre todos los valores de la columna especificada, sino sobre todos los valores de un grupo. El operador agregado se calcula individualmente para cada grupo). Ejemplo: Si queremos conocer cuntos artculos han sido vendidos por cada proveedor formularemos la consulta: SELECT pr.proveedorid, pr.nombreprov, COUNT (p.productoid) FROM proveedores pr, productos p WHERE pr.proveedorid= p.proveedorid GROUP BY pr.proveedorid, pr.nombreprov; HAVING La clausula HAVING trabaja de forma muy parecida a la clausula WHERE, y se utiliza para considerar slo aquellos grupos que satisfagan la cualificacin dada en la misma. Las expresiones permitidas en la clausula HAVING deben involucrar funcionen agregadas. Cada expresin que utilice slo atributos planos deber recogerse en la clausula WHERE. Por otro lado, toda expresin que involucre funciones agregadas debe aparecer en la clausula HAVING. Ejemplo Si queremos solamente los proveedores que venden ms de un artculo, utilizaremos la consulta: SELECT pr.proveedorid, pr.nombreprov, COUNT(p.productoid) FROM proveedores pr, productos p WHERE pr.proveedorid= p.proveedorid GROUP BY pr.proveedorid, pr.nombreprov HAVING COUNT(p.productoid) >1;

SUBCONSULTAS

SUBCONSULTAS En las clausulas WHERE y HAVING se permite el uso de subconsultas (subselects) en cualquier lugar donde se espere un valor. En este caso, el valor debe derivar de la evaluacin previa de la subconsulta. El uso de subconsultas ampla el poder expresivo de SQL. Ejemplo: Si queremos conocer los artculos que tienen mayor precio que el producto llamado Tornillos, utilizaremos la consulta: SELECT * FROM productos WHERE preciounit > (SELECT preciounit FROM productos WHERE descripcion =BOTON PARA ASADO); Cuando revisamos la consulta anterior, podemos ver la palabra clave SELECT dos veces. La primera al principio de la consulta - a la que nos referiremos como la SELECT externa - y la segunda en la clausula WHERE, donde empieza una consulta anidada - nos referiremos a ella como la SELECT interna. Para cada tupla de la SELECT externa, la SELECT interna deber ser evaluada. Tras cada evaluacin, conoceremos el precio de la tupla llamada BOTON PARA ASADO, y podremos chequear si el precio de la tupla actual es mayor. Si queremos conocer todos los proveedores que no venden ningn producto (por ejemplo, para poderlos eliminar de la base de datos), utilizaremos: SELECT * FROM proveedores p WHERE NOT EXISTS (SELECT * FROM productos pr WHERE pr.proveedorid = p.proveedorid); UNIN, INTERSECCIN, EXCEPCIN Estas operaciones calculan la unin, la interseccin y la diferencia de la teora de conjuntos de las tuplas derivadas de dos subconsultas. Ejemplo: Union, Intersect, Except La siguiente consulta es un ejemplo de UNION:

SELECT p.nombreprov, p.contacto FROM proveedores p WHERE p.nombreprov= TONY UNION SELECT p.nombreprov, p.contacto FROM proveedores p WHERE p.nombreprov= JURIS Aqu se tiene un ejemplo para INTERSECT: SELECT p.nombreprov, p.contacto FROM proveedores p WHERE p.nombreprov= TONY INTERSECT SELECT p.nombreprov, p.contacto FROM proveedores p WHERE p.nombreprov= JURIS Finalmente, un ejemplo de EXCEPT: SELECT p.nombreprov, p.contacto FROM proveedores p WHERE p.nombreprov= TONY EXCEPT SELECT p.nombreprov, p.contacto FROM proveedores p WHERE p.nombreprov= JURIS

TRANSACCIONES

TRANSACCIONES Las transacciones son un concepto fundamental en todos los sistemas de base de datos, el punto esencial de una transaccin es que engloba mltiples operaciones en un solo paso. En PostgreSQL las transacciones se configuran simplemente encerrando en un bloque las operaciones que se desean incluir en la misma, el bloque debe comenzar y terminar con los comandos BEGIN y COMMIT. BEGIN: Comienza una transaccin en modo encadenado BEGIN [ WORK | TRANSACTION ] Para comenzar una transaccin de usuario: BEGIN WORK; Entrada: WORK, TRANSACTION Palabras clave opcionales. No tienen efecto. Salida: BEGIN Esto significa que una nueva transaccin ha sido comenzada. NOTICE: BEGIN: already a transaction in progress Esto indica que una transaccin ya est en progreso. La transaccin en curso no se ve afectada. Descripcin Por defecto, PostgreSQL ejecuta las transacciones en modo no encadenado (tambin conocido como autocommit en otros sistemas de base de datos). En otras palabras, cada estado de usuario es ejecutado en su propia transaccin y un commit se ejecuta implcitamente al final del estatuto (si la ejecucin fue exitosa, de otro modo se ejecuta un rollback). BEGIN inicia una transaccin de usuario en modo encadenado, todos los estados de usuarios despus de un comando BEGIN se ejecutaran en una transaccin nica hasta un explicito COMMIT, ROLLBACK, o aborte la ejecucin. Los estados en modo encadenado se ejecutan mucho ms rpido, porque la transaccin start/commit requiere una actividad significativa de CPU y de disco. La ejecucin de mltiples estados dentro de una transaccin tambin es requerida para la consistencia cuando se cambian muchas tablas relacionadas. El nivel de aislamiento por defecto de las transacciones en PostgreSQL es READ COMMITTED, donde las consultas dentro de la transaccin solo tienen en cuenta los cambios consolidados antes

de la ejecucin de la consulta. As pues, debes utilizar SET TRANSACTION ISOLATION LEVEL SERIALIZABLE justo despus de BEGIN si necesitas aislamiento de transacciones ms riguroso. Las consultas del tipo SERIALIZABLE solo tendrn en cuenta los cambios consolidados antes de que la transaccin entera comience (realmente, antes de la ejecucin del primer estado DML en una transaccin serializable). Si la transaccin est consolidada, PostgreSQL asegurara que todas las actualizaciones sean hechas o si no que ninguna de ellas lo sea. Las transacciones tienen la propiedad estndar ACID (atmica, consistente, aislada y durable). COMMIT Realiza la transaccin actual COMMIT [ WORK | TRANSACTION ] Para hacer todos los cambios permanentes: COMMIT WORK; Entrada: WORK, TRANSACTION Palabra clave opcional. No tiene efecto. Salida: COMMIT Mensaje devuelto si la transaccin se realiza con xito. NOTICE: COMMIT: no transaction in progress Si no hay transacciones en progreso. Descripcin COMMIT realiza la transaccin actual. Todos los cambios realizados por la transaccin son visibles a las otras transacciones, y se garantiza que se conservan si se produce una cada de la mquina. ROLLBACK Interrumpe la transaccin en curso ROLLBACK [ WORK | TRANSACTION ] Para cancelar todos los cambios: ROLLBACK WORK; Entrada: Ninguna. Salida: ABORT

Mensaje devuelto si la operacin es exitosa. NOTICE: ROLLBACK: no transaction in progress Si no hay transacciones en progreso actualmente. Descripcin ROLLBACK deshace la transaccin actual y provoca que todas las modificaciones originadas por la misma sean descartadas. ABORT es un sinnimo de ROLLBACK. Estructura de una transaccin: BEGIN; UPDATE cuentas SET balance = balance 100 WHERE nombre = Alice; COMMIT; Al momento que se le pasa a PostgreSQL la clausula COMMIT es cuando se escribe en base de datos las actualizaciones u operacin que se desea hacer en la misma, si en algn momento no queremos hacer COMMIT de alguna operacin (quizs se nota que la cuenta de Alice da un balance negativo) entonces se puede utilizar la clausula ROLLBACK y todas las actualizaciones dentro de la transaccin se cancelaran. Si no se desea hacer un rollback completo de la transaccin, entonces se pueden definir marcadores (savepoints) hasta los cuales se desea que se regrese en la transaccin, Ejemplo: BEGIN; UPDATE cuentas SET balance = balance 100 WHERE nombre = Alice; SAVEPOINT marcador1; UPDATE cuentas SET balance = balance + 100 WHERE nombre = Bob; se desea descartar la actualizacion para Bob y en vez hacerla para Wally ROLLBACK TO marcador1; UPDATE cuentas SET balance = balance + 100 WHERE nombre = Wally; COMMIT; En el ejemplo anterior se vio el uso de Marcadores y Rollbacks, en este caso lo que paso es que se realizo una actualizacin sobre la cuenta de Bob, pero a ultima instancia se decide que el dinero no se le va a abonar a Bob sino a Wally, entonces se realiza un rollback hasta el marcador llamado marcador1 y se pasa a hacer la actualizacin en la cuenta de Wally

VISTAS Y REGLAS

VISTAS Y REGLAS

VISTAS Se puede ver una vista como una tabla virtual, es decir, una tabla que no existe fsicamente en la base de datos, pero aparece al usuario como si existiese. Por contra, cuando hablamos de una tabla base, hay realmente un equivalente almacenado para cada fila en la tabla en algn sitio del almacenamiento fsico. Las vistas no tienen datos almacenados propios, distinguibles y fsicamente almacenados. En su lugar, el sistema almacena la definicin de la vista (es decir, las reglas para acceder a las tablas base fsicamente almacenadas para materializar la vista) en algn lugar de los catlogos del sistema (vea System Catalogs). En SQL se utiliza el comando CREATE VIEW para definir una vista. La Sintaxis es:
CREATE VIEW view_name AS select_stmt

Donde select_stmt es una instruccin select vlida, como se defini en Select. Ntese que select_stmt no se ejecuta cuando se crea la vista. Simplemente se almacena en los catlogos del sistema y se ejecuta cada vez que se realiza una consulta contra la vista. SELECT * FROM categorias WHERE nombrecat = CARNICOS REGLAS CREATE RULE - definen una nueva regla de reescritura Sintaxis:
CREATE [ OR REPLACE ] RULE nombre AS ON evento TO tabla [ WHERE condicion ] DO [ ALSO | INSTEAD ] { NOTHING | commando | ( commando ; commando ...) }

Descripcin CREATE RULE define una nueva norma se aplica a una tabla o vista especificada. CREATE OR REPLACE pronunciarse crear una nueva regla, o cambiar una regla existente del mismo nombre para la misma tabla. El sistema de reglas PostgreSQL permite definir una accin alternativa para llevar a cabo en las inserciones, actualizaciones o supresiones en las tablas de bases de datos. En trminos generales, una regla causas comandos adicionales que se ejecutan cuando una orden dada en una tabla dada es ejecutada. Las reglas se utilizan tambin para implementar las vistas de tabla. Es importante darse cuenta de que una norma es en realidad un mecanismo de transformacin de comandos, o macro de comandos. La transformacin ocurre antes que la ejecucin de los comandos se inicie. Parmetros name: El nombre de una norma para crear. Esta debe ser distinta del nombre de cualquier otra norma de la misma tabla. Mltiples reglas sobre la misma mesa y mismo tipo de evento se aplican en el orden del nombre alfabtico. event: El evento es uno de SELECT, INSERT, UPDATE o DELETE. table: El nombre (opcional esquema cualificada) de la tabla o vista se aplica la regla. condition: Cualquier expresin condicional SQL (volviendo boolean. La expresin de condicin no puede referirse a las tablas, salvo NEW y OLD, y no puede contener funciones de agregado. INSTEAD: indica que los comandos deben ser ejecutados en lugar del comando original. ALSO: indica que los comandos deben ser ejecutados, adems de la orden original. command: El comando o comandos que componen la accin de la regla. Comandos vlidos son SELECT, INSERT, UPDATE, DELETE o NOTIFY. Dentro de condicin y de comandos, los nombres de tabla especial NEW y OLD pueden ser usados para referirse a los valores en la tabla referenciada. NUEVO es vlido en ON INSERT y UPDATE ON normas que se refieren a la nueva fila a insertar o actualizar. OLD es vlido en ON y ON UPDATE DELETE normas para hacer referencia a la fila existente se actualiza o eliminado. Es muy importante tener cuidado para evitar reglas circulares.

Ejemplos: CREATE OR REPLACE RULE regla2 AS ON INSERT TO empleados WHERE empleadoid>3 DO NOTHING; CREATE OR REPLACE RULE regla3 AS ON INSERT TO empleados WHERE apellido like NOBOA DO NOTHING

PROCEDIMIENTOS ALMACENADOS

PROCEDIMIENTOS ALMACENADOS Un procedimiento almacenado se puede definir como un programa, procedimiento funcin, el cual est almacenado en la base de datos y listo para ser usado. Existen dos ventajas evidentes al utilizar procedimientos almacenados en nuestro sistema: La ejecucin del procedimiento ocurre en el servidor de bases de datos. Esto probablemente aumentar el rendimiento de nuestra aplicacin al no tenerse que mandar datos entre el cliente y el servidor, y no tener que procesar resultados intermedios en el cliente para obtener el resultado final. Al tener la lgica de la aplicacin implementada en la base de datos no tendremos que implementarla en los clientes, con el consiguiente ahorro de lneas de cdigo redundante y complejidad. Podemos definir e instalar un procedimiento en PL/pgSQL de la siguiente manera: CREATE [ OR REPLACE ] FUNCTION nombre_funcion([ [ argmodo ] [ argnombre ] argtipo [, ...] ]) RETURNS tipo AS $$ [ DECLARE ] [ declaraciones de variables ] BEGIN codigo END; $$ LANGUAGE plpgsql | IMMUTABLE | STABLE | VOLATILE | CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT | [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER | COST execution_cost | ROWS result_rows | SET confguration_parameter { TO value | = value | FROM CURRENT } A continuacin vamos a ver algunas de las opciones y valores ms importantes. argmodo: El modo de un argumento puede ser IN, OUT, or INOUT. Por defecto se usa IN si no se define. argtipo: Los tipos que podemos utilizar son todos los disponibles en PostgreSQL y todos los definidos por el usuario

declaraciones de variables: Las declaraciones de variables se pueden realizar de la siguiente manera ($n = orden de declaracin del argumento.): nombre_variable ALIAS FOR $n; nombre_variable [ CONSTANT ] tipo [ NOT NULL ] [ { DEFAULT | := } expresion ]; IMMUTABLE | STABLE | VOLATILE: IMMUTABLE: Indica que la funcin no puede alterar a la base de datos y que siempre devolver el mismo resultado, dados los mismos valores como argumentos. Este tipo de funciones no pueden realizar consultas en la base de datos. STABLE: Indica que la funcin no puede alterar a la base de datos y que siempre devolver el mismo resultado en una consulta individual de una tabla, dados los mismos valores como argumentos. El resultado podra cambiar entre sentencias SQL. VOLATILE: Indica que la funcin puede devolver diferentes valores, incluso dentro de una consulta individual de una tabla (valor por defecto) CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT: CALLED ON NULL INPUT: Indica que la funcin se ejecutar aunque algunos de los argumentos sean NULL. El usuario tiene la responsabilidad de comprobar si algn argumento es NULL cuando sea necesario tener esto en cuenta. (Valor por defecto) RETURNS NULL ON NULL INPUT / STRICT: Indican que la funcin no se ejecutar y devolver el valor NULL si alguno de los argumentos es NULL. SECURITY INVOKER | SECURITY DEFINER: SECURITY INVOKER: Indica que la funcin se ejecutar con los privilegios del usuario que la ejecuta (valor por defecto). SECURITY DEFINER: Indica que la funcin se ejecutar con los privilegios del usuario que la creo. Ejemplos: Si queremos que cualquier usuario con acceso a la base de datos pueda usarlo sin tener que ser el administrador Postgres, tendremos que utilizar TRUSTED con el comando anterior. CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql;

A continuacin creamos nuestro primer procedimiento. (Podemos copiar y pegar en el cliente psql, escribirlo a mano usar el editor interno en psql (\e)): CREATE OR REPLACE FUNCTION ejemplo() RETURNS integer AS $$ BEGIN RETURN 104; END; $$ LANGUAGE plpgsql; Ahora definimos la funcin con un argumento: CREATE OR REPLACE FUNCTION ejemplo(integer) RETURNS integer AS $$ BEGIN RETURN $1; END; $$ LANGUAGE plpgsql; Este procedimiento se podra haber escrito tambin de las siguientes maneras: CREATE OR REPLACE FUNCTION ejemplo(numero integer) RETURNS integer AS $$ BEGIN RETURN numero; END; $$ LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION ejemplo(integer) RETURNS integer AS $$ DECLARE numero ALIAS FOR $1; BEGIN RETURN numero; END; $$ LANGUAGE plpgsql; Vamos a empezar a complicar un poco las cosas usando dos argumentos y defniendo algunas variables: CREATE OR REPLACE FUNCTION ejemplo(integer , integer) RETURNS integer AS $$ DECLARE numero1 ALIAS FOR $1; numero2 ALIAS FOR $2; constante CONSTANT integer := 100; resultado integer;

BEGIN resultado := (numero1 * numero2) + constante; RETURN resultado; END; $$ LANGUAGE plpgsql; A continuacin vamos a usar una sentencia IF ... THEN en nuestra funcin: CREATE OR REPLACE FUNCTION ejemplo_txt(integer , integer) RETURNS text AS $$ DECLARE numero1 ALIAS FOR $1; numero2 ALIAS FOR $2; constante CONSTANT integer := 100; resultado INTEGER; resultado_txt TEXT DEFAULT El resultado es 104; BEGIN resultado := (numero1 * numero2) + constante; IF resultado <> 104 THEN resultado_txt := El resultado NO es 104; END IF; RETURN resultado_txt; END; $$ LANGUAGE plpgsql;

TRIGGERS

TRIGGER Las diversas funciones proporcionan grandes ventajas al simplificar acciones en la base de datos. Pero estas acciones requieren la intervencin de una persona encargada de ejecutar dichas funciones cuando se requiera de su actuacin. Los Triggers al contrario son funciones que se ejecutan de forma automtica en respuesta a ciertos eventos que ocurren en la base de datos. Un trigger es un tipo especial de procedimiento almacenado que es disparado cuando se intenta modificar los datos que protegen. Un procedimiento almacenado es invocado por el usuario mientras que un trigger lo es por el SQL. CREATE TRIGGER crea un nuevo trigger. El trigger se asociar con la tabla especificada y ejecutar la funcin especificada function_name cuando ocurra cierto evento. Los triggers pueden ser definidos a ejecutarse antes o despus de cualquier operacin INSERT, UPDATE O DELETE, una vez por fila modificada o por una declaracin del SQL. La funcin trigger debe ser definida antes de que el propio trigger se cree. Si el trigger se ejecuta antes del evento, el trigger puede saltar la operacin de la fila actual, o cambiar la fila a ser insertada (solamente para operaciones INSERT y UPDATE). Si el trigger se ejecuta despus del evento, todo cambia, incluyendo los efectos de otros triggers, son visibles al trigger. Un trigger que es marcado FOR EACH ROW (row-level) es llamado una vez por cada fila que modifica la operacin. Por ejemplo, una operacin DELETE que afecta a 10 filas causara cualquier ON DELETE triggers en la relacin designada a ser llamada 10 veces independientemente, una vez por cada fila borrada. En contraste, un trigger que es marcado FOR EACH STATEMENT (statement-level) slo se ejecuta una vez para cada operacin dada sin tener en cuenta cuantas flas modifica (en particular, una operacin que modifica cero filas todava producir la ejecucin de cualquier FOR EACH STATEMENT trigger). Adicionalmente: Los triggers pueden ser definidos para disparar a un TRUNCATE, aunque solo FOR EACH STATEMENT. Tambin, una definicin de trigger puede especificar una condicin booleana WHEN, la cual se probar para ver si el trigger se disparar o no. En los triggers de niveles de flas la condicin WHEN puede examinar los valores antiguos y/o nuevos de la columna de la fila.

Los triggers de nivel de sentencias pueden tambin tener condiciones WHEN, aunque el rasgo no es tan til para ellos ya que la condicin no puede referirse a cualquier valor en la tabla. Si se definen mltiples triggers del mismo tipo para el mismo evento, pueden ser disparados alfabticamente de acuerdo al nombre. SELECT no modifica flas por lo tanto no se pueden crear triggers SELECT. Las reglas y vistas son ms apropiadas en estos casos. Para crear un trigger en una tabla, el usuario debe tener el privilegio de crear triggers para esa tabla. Para eliminar un trigger se debe utilizar la clausula DROP TRIGGER. Sintxis:

CREATE TRIGGER name { BEFORE | AFTER } { event [ OR ... ] } ON table [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN ( condition ) ] EXECUTE PROCEDURE function_name ( arguments )

Donde: name: Nombre del Nuevo trigger. Este debe ser distinto de cualquier nombre de otro trigger en la misma tabla. BEFORE, AFTER: Determina si la funcin es llamada antes o despus de un evento. event: Una de INSERT, UPDATE, DELETE o TRUNCATE; este especifica el evento que ocurrir cuando el trigger dispare. Se pueden utilizar varios eventos utilizando OR. Para los triggers UPDATE, es posible especificar una lista de columnas utilizando eta sintaxis: UPDATE OF column_name1 [, column_name2 ... ] El trigger disparar solamente si al menos una de las columnas listadas es mencionada como designada a actualizar. table: Nombre de la tabla para la cual es el trigger.

FOR EACH ROW, FOR EACH STATEMENT: Especifica si el procedimiento del trigger ser disparado una vez para todas las flas afectadas por el evento, o solo una vez por cada declaracin SQL. Si no se especifica, el valor predeterminado es FOR EACH STATEMENT. condition: Una expresin booleana que determina si la funcin del trigger se ejecutar realmente. Si WHEN es especificado, la funcin solo ser llamada si la condicin retorna verdadero. function_name: Funcin de usuario declarada para no tomar ningn valor y retornar el tipo de trigger, la cual es ejecutada cuando el trigger dispara. arguments: Una lista opcional de argumentos separados por coma para ser proporcionada a la funcin cuando el trigger es ejecutado. Los argumentos son cadenas de caracteres constantes. Simples nombres o constantes numricas pueden ser utilizados tambin pero pueden ser convertidos en cadenas de caracteres. Ejemplos: Ejecutar la funcin check_account_update siempre que una fila de la tabla accounts sea actualizada: CREATE TRIGGER trigger_actualizacion BEFORE UPDATE ON PROVEEDORES FOR EACH ROW EXECUTE PROCEDURE check_proveedores_update();

You might also like