Sei sulla pagina 1di 38

FUNCIONES Y TRIGGERS

Freddy Condori

PROCEDIMIENTOS ALMACENADOS Y FUNCIONES


Los procedimientos almacenados y funciones son nuevas funcionalidades de la versin de MySQL 5.0. Un procedimiento almacenado es un conjunto de comandos SQL que pueden almacenarse en el servidor. Una vez que se hace, los clientes no necesitan relanzar los comandos individuales pero pueden en su lugar referirse al procedimiento almacenado.

PROCEDIMIENTOS ALMACENADOS Y FUNCIONES(2)


Algunas situaciones en que los procedimientos almacenados pueden ser particularmente tiles: Cuando mltiples aplicaciones cliente se escriben en distintos lenguajes o funcionan en distintas plataformas, pero necesitan realizar la misma operacin en la base de datos. Cuando la seguridad es muy importante. las aplicaciones y los usuarios no obtendran ningn acceso directo a las tablas de la base de datos, slo pueden ejectuar algunos procedimientos almacenados.

SINTAXIS DE PROCEDIMIENTOS ALMACENADOS


Los procedimientos almacenados y rutinas se crean con comandos CREATE PROCEDURE y CREATE FUNCTION . Una rutina es un procedimiento o una funcin. Un procedimiento se invoca usando un comando CALL , y slo puede pasar valores usando variables de salida. Una funcin puede llamarse desde dentro de un comando como cualquier otra funcin (esto es, invocando el nombre de la funcin), y puede retornar un valor escalar. Las rutinas almacenadas pueden llamar otras rutinas almacenadas.

SINTAXIS DE PROCEDIMIENTOS ALMACENADOS(2)


CREATE PROCEDURE sp_name ([parameter[,...]]) [characteristic ...] routine_body CREATE FUNCTION sp_name ([parameter[,...]]) RETURNS type [characteristic ...] routine_body

EJEMPLO PROCEDIMIENTO
delimiter // CREATE PROCEDURE procedimiento1 (OUT variable1 INT) BEGIN SELECT COUNT(*) INTO variable1 FROM persona; END // delimiter ;

Probar el Procedimiento:
CALL funcion1(@a); SELECT @a;

EJEMPLO FUNCION
delimiter // CREATE FUNCTION hola (s CHAR(20)) RETURNS CHAR(50) RETURN CONCAT(Hola ',s,'!'); // delimiter; Probar la Funcion: SELECT hola(mundo');

ELIMINAR PROCEDMIENTOS O FUNCIONES


DROP {PROCEDURE | FUNCTION} [IF EXISTS] nombre Este comando se usa para borrar un procedimiento o funcin almacenado. Esto es, la rutina especificada se borra del servidor.

VER EL ESTADO DE UNA FUNCION O PROCEDIMIENTO


SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern'] Este comando es una extensin de MySQL . Retorna caractersticas de rutinas, como el nombre de la base de datos, nombre, tipo, creador y fechas de creacin y modificacin. Si no se especifica un patrn, le lista la informacin para todos los procedimientos almacenados, en funcin del comando que use. SHOW FUNCTION STATUS LIKE 'hola'\G

LA SENTENCIA CALL
CALL sp_name([parameter[,...]])

El comando CALL invoca un procedimiento definido previamente con CREATE PROCEDURE. CALL puede pasar valores al llamador usando parmetros declarados como OUT o INOUT . Tambin retorna el nmero de registros afectados.

SENTENCIA COMPUESTA BEGIN END


[begin_label:] BEGIN [statement_list] END [end_label] Los procedimientos almacenados pueden contener varios comandos, usando un comando compuesto BEGIN ... END . Un comando compuesto puede etiquetarse. end_label no puede darse a no ser que tambin est presente begin_label , y si ambos lo estn, deben ser el mismo.

SENTENCIA DECLARE
El comando DECLARE se usa para definir varios iconos locales de una rutina: las variables locales, condiciones y handlers y cursores. Los comandos SIGNAL y RESIGNAL no se soportan en la actualidad. DECLARE puede usarse slo dentro de comandos compuestos BEGIN ... END y deben ser su inicio, Antes de cualquier otro comando. Los cursores deben declararse antes de declarar los handlers, y las variables y condiciones deben declararse antes de declarar los cursores o handlers.

DECLARAR VARIABLES LOCALES CON DECLARE


DECLARE var_name[,...] type [DEFAULT value] Este comando se usa para declarar variables locales. Para proporcionar un valor por defecto para la variable, incluya una clusula DEFAULT . El valor puede especificarse como expresin, no necesita ser una constante. Si la clusula DEFAULT no est presente, el valor inicial es NULL. La visibilidad de una variable local es dentro del bloque BEGIN ... END donde est declarado. Puede usarse en bloques anidados excepto aquellos que declaren una variable con el mismo nombre.

SENTENCIA SET PARA VARIABLES


SET var_name = expr [, var_name = expr] ... El comando SET en procedimientos almacenados es una versin extendida del comando general SET. Las variables referenciadas pueden ser las declaradas dentro de una rutina, o variables de servidor globales. El comando SET en procedimientos almacenados se implementa como parte de la sintaxis SET preexistente. Esto permite una sintaxis extendida de SET a=x, b=y, ... donde distintos tipos de variables (variables declaradas local y globalmente y variables de sesin del servidor) pueden mezclarse.

LA SENTENCIA SELECT INTO


SELECT col_name[,...] INTO var_name[,...] table_expr Esta sintaxis SELECT almacena columnas seleccionadas directamente en variables. Por lo tanto, slo un registro puede retornarse. SELECT id,data INTO x,y FROM test.t1 LIMIT 1;

DECLARE CONDITIONS
DECLARE condition_name CONDITION FOR condition_value

Este comando especifica condiciones que necesitan tratamiento especfico. Asocia un nombre con una condicin de error especfica. El nombre puede usarse subsecuentemente en un comando DECLARE Adems de valores SQLSTATE , los cdigos de error MySQL se soportan.

DECLARE HANDLERS
DECLARE handler_type HANDLER FOR condition_value[,...] sp_statement

Este comando especifica handlers que pueden tratar una o varias condiciones. Si una de estas condiciones ocurren, el comando especificado se ejecuta. Para un handler CONTINUE , contina la rutina actual tras la ejecucin del comando del handler. Para un handler EXIT , termina la ejecucin del comando compuesto BEGIN...END actual.

CURSORES
Se soportan cursores simples dentro de procedimientos y funciones almacenadas. La sintaxis es la de SQL empotrado. Los cursores no son sensibles, son de slo lectura, y no permiten scrolling. No sensible significa que el servidor puede o no hacer una copia de su tabla de resultados. Los cursores deben declararse antes de declarar los handlers, y las variables y condiciones deben declararse antes de declarar cursores o handlers.

DECLARAR CURSORES
DECLARE cursor_name CURSOR FOR select_statement

Este comando declara un cursor. Pueden definirse varios cursores en una rutina, pero cada cursor en un bloque debe tener un nombre nico. El comando SELECT no puede tener una clusula INTO .

FUNCIONES DEL CURSOR


Sentencia OPEN del cursor OPEN cursor_name Este comando abre un cursor declarado previamente. Sentencia de cursor FETCH FETCH cursor_name INTO var_name [, var_name] ... Este comando trata el siguiente registro (si existe) usando el cursor abierto especificado, y avanza el puntero del cursor.

FUNCIONES DEL CURSOR(2)


Sentencia de cursor CLOSE CLOSE cursor_name Este comando cierra un cursor abierto prviamente.Si no se cierra explcitamente, un cursor se cierra al final del comando compuesto en que se declara.

LA SENTENCIA IF
Sentencia IF
IF search_condition THEN statement_list [ELSEIF search_condition THEN statement_list] ... [ELSE statement_list] END IF

IF implementa un constructor condicional bsico. Si search_condition se evala a cierto, el comando SQL correspondiente listado se ejectua. Si no coincide ninguna search_condition se ejecuta el comando listado en la clusula ELSE. statement_list puede consistir en varios comandos.

LA SENTENCIA CASE
La sentencia CASE
CASE case_value WHEN when_value THEN statement_list [WHEN when_value THEN statement_list] ... [ELSE statement_list] END CASE O: CASE WHEN search_condition THEN statement_list [WHEN search_condition THEN statement_list] ... [ELSE statement_list] END CASE

LA SENTENCIA CASE(2)
El comando CASE para procedimientos almacenados implementa un constructor condicional complejo. Si una search_condition se evala a cierto, el comando SQL correspondiente se ejecuta. Si no coincide ninguna condicin de bsqueda, el comando en la clusula ELSE se ejecuta. .

LA SENTENCIA LOOP
Sentencia LOOP [begin_label:] LOOP statement_list END LOOP [end_label] LOOP implementa un constructor de bucle simple que permite ejecucin repetida de comandos particulares. El comando dentro del bucle se repite hasta que acaba el bucle, usualmente con un comando LEA-VE

LA SENTENCIA LEAVE
LEAVE label Este comando se usa para abandonar cualquier control de flujo etiquetado. Puede usarse con BEGIN... END o bucles.

LA SENTENCIA ITERATE
ITERATE label

ITERATE slo puede aparecer en comandos LOOP, REPEAT, y WHILE . ITERATE significa vuelve a hacer el bucle. vease el ejemplo ejemplo_iterate

LA SENTENCIA REPEAT
[begin_label:] REPEAT statement_list UNTIL search_condition END REPEAT [end_label] El comandos dentro de un comando REPEAT se repite hasta que la condicin search_condition es cierta. Un comando REPEAT puede etiquetarse. end_label no puede darse a no ser que begin_label est presente, y si lo estn, deben ser el mismo. vease ejemplo_repeat

LA SENTENCIA WHILE
[begin_label:] WHILE search_condition DO statement_list END WHILE [end_label] El comando dentro de un comando WHILE se repite mientras la condicin search_condition es cierta. Un comando WHILE puede etiquetarse. end_label no puede darse a no ser que begin_label tambin est presente, y si lo estn, deben ser el mismo. vease ejemplo_while

TRIGERS (DISPARADORES)
Una de las principales caractersticas que han sido incorporadas en la versin 5.0 de MySQL es algo llamado "Triggers". Los triggers son objetos relacionados a tablas que son ejecutados o mostrados cuando sucede algn evento en contra de sus tablas asociadas. Estos eventos son aquellas sentencias (INSERT, DELETE, UPDATE) que modifican los datos dentro de la tabla a la que est asociado el trigger y pueden ser disparados antes (BEFORE) y/o despus (AFTER) de que la fila es modificada.

TRIGERS(2)
Los triggers son muy parecidos a los procedimientos almacenados, de tal forma que si deseamos ejecutar mltiples acciones cuando un trigger es disparado, podemos encapsular estas acciones dentro de una construccin BEGIN, END. Los triggers tienen un par de palabras clave extra OLD y NEW las cuales se refieren respectivamente a los valores de las columnas antes y despus de que la sentencia fue procesada. Las sentencias INSERT nicamente permiten NEW, las sentencias UPDATE permiten ambos, NEW y OLD, y las sentencias DELETE permiten slo OLD. La razn para esto debe ser obvia.

SINTAXIS DE CREATE TRIGER


CREATE TRIGGER nombre_disp momento_disp evento_disp ON nombre_tabla FOR EACH ROW sentencia_disp momento_disp = AFTER O BEFORE evento_disp = es la accion en la que se ejecuta el triger (insert, update, delete)

EJEMPLO

Se va ha crear una tabla clientes. Se va ha crear una tabla auditoria_clientes. Por ultimo se va ha crear un triger que se ejecute cada vez que se actualice un valor de la tabla clientes, y lo que hace este triger es insertar un registro en la tabla auditoria_clientes con el nombre de usuario que realizo la modificacin, y la fecha de la modificacin.

EJEMPLO cont. (TRIGER)


CREATE TRIGGER trigger_auditoria_clientes AFTER UPDATE ON clientes FOR EACH ROW BEGIN INSERT INTO auditoria_clientes(nombre, anterior_ejecutivo_cuenta, usuario, cambiado) VALUES (OLD.nombre, OLD.ejecutivo_cuenta, CURRENT_USER(), NOW() ); END;

EJEMPLO cont.

Se ejecuta el archivo ejemplo1_triger.sql (crear las tablas inserta valores y crea el triger) Vemos el contenido de la tabla clientes y la tabla auditoria_clientes Probamos el triger ejecutando una modificacion: UPDATE clientes SET ejecutivo_cuenta='Mario' WHERE nombre='Acme; Vemos el contenido de la tabla auditoria_clientes;

EJEMPLO2

Una cosa importante que se debe mencionar es que dentro los triger se puede llamar a funciones Vamos a crear una tabla para el registro de todas las ventas Vamos a crear un procedimiento para fijar el porcentaje de comisin para la gente basada en la venta. Vamos a crear un trigger que llama al procedimiento y fija la comisin despus de la insercin a la tabla ventas

EJEMPLO2 TRIGER
CREATE PROCEDURE comision(valor DECIMAL(9,2)) BEGIN SET @comm := valor / 10; -> END; CREATE TRIGGER ventas_comm BEFORE INSERT ON ventas FOR EACH ROW BEGIN CALL comision(NEW.valor); -> SET NEW.comision = @comm; END;

EJEMPLO2

Lo que tenemos que hacer es probar el triger insertando valores en la tabla ventas: INSERT INTO ventas(item, valor, ejecutivo_cuenta) VALUES('Queso',300.00,'Mario'); INSERT INTO ventas(item, valor, ejecutivo_cuenta) VALUES('Papas',400.00,'Mario'); Vemos el contenido de la tabla ventas

Potrebbero piacerti anche