Sunteți pe pagina 1din 18

Captulo 8

Construccin de
guiones

NDICE CAPTULO 8
Lenguajes de programacin y bases de datos
Procedimientos y funciones almacenados en MySQL

Sintaxis y ejemplos
Parmetros y variables
Instrucciones condicionales
Instrucciones repetitivas o loops
SQL en rutinas: Cursores
Gestin de rutinas almacenadas
Manejo de errores

Lenguajes de programacin y bases


de datos

Aumentan la funcionalidad de los


sistemas gestores
La mayora incorporan lenguajes
propios
Suelen incorporar APIs de otros
lenguajes (Java, C++, perl, Ruby,
php, etc.)

Procedimientos y funciones
almacenados en MySQL

Esquema general

Procedimientos y funciones
almacenados en MySQL
Ejemplo hola mundo con Workbench

Sintaxis y ejemplos de rutinas


almacenadas
Sintaxis general
Funcin
CREATE FUNCTION sp_name
([parameter[,...]])
RETURNS type
[characteristic ...]
routine_body

Procedimiento
CREATE PROCEDURE sp_name
([parameter[,...]])
[characteristic ...]
routine_body

parameter:
[ IN | OUT | INOUT ] param_name type
type:
Any valid MySQL data type
characteristic:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL
SECURITY { DEFINER | INVOKER }

PARMETROS Y VARIABLES I
Parmetros
IN:
OUT:
INOUT:

Variables

entrada
salida
entrada/salida

en una rutina

Tipos:

Alcance
variables:

de una rutina

de datos
determinado por
bloque BEGIN/END

PARMETROS Y VARIABLES II
Ejemplo
CREATE PROCEDURE proc3(OUT p INT)
CALL proc3(@y)$$
SELECT @y$$
+------+
| @y |
+------+
| -5 |
+------+

SET p = -5 $$

En este caso hemos creado una nueva variable @y al


llamar al procedimiento cuyo valor se actualiza dentro
del mismo por ser sta de tipo OUT.

INSTRUCCIONES CONDICIONALES I
If-then-else
IF expr1 THEN
...
ELSEIF expr2 THEN
...
ELSE
...
END IF

CASE
CASE expression
WHEN value THEN

[WHEN value THEN


...]
[ELSE
]
END CASE;

Instrucciones condicionales II
Ejemplo IF-THEN-ELSE
En el siguiente ejemplo insertamos o actualizamos la tabla de prueba t en la base de datos
test segn el valor de entrada:
DELIMITER $$
CREATE PROCEDURE proc7 (IN par1 INT)
BEGIN
DECLARE var1 INT;
SET var1 = par1 + 1;
IF var1 = 0 THEN
INSERT INTO t VALUES (17);
END IF;
IF par1 = 0 THEN
UPDATE t SET s1 = s1 + 1;
ELSE
UPDATE t SET s1 = s1 + 2;
END IF;
END; $$

Cuando el valor de la variable1 es 0 entonces hacemos una insercin, en caso de que sea 0
el parmetro de entrada actualizamos sumando 1 al valor actual y si no sumamos 2.

INSTRUCCIONES REPETITIVAS I
Simple loop
[etiqueta:] LOOP
instrucciones
END LOOP
[etiqueta];

While loop
[etiqueta:] WHILE expression DO
instrucciones
END WHILE [etiqueta]

Repeat until loop


[etiqueta:] REPEAT
instrucciones
UNTIL expresion
END REPEAT [etiqueta]

INSTRUCCIONES REPETITIVAS II
Ejemplo
En el siguiente ejemplo se muestran los nmeros
impares desde 0 a 10
DELIMITER $$
CREATE PROCEDURE proc10()
BEGIN
DECLARE i int;
SET i=0;
loop1: REPEAT
SET i=i+1;
IF MOD(i,2)<>0 THEN /*nmero impar*/
SELECT CONCAT(i," es impar");
END IF;
UNTIL i >= 10
END REPEAT;
END; $$

SQL en rutinas: Cursores


Definicin/comandos I
Cursor
Objeto que hace referencia a un conjunto de datos obtenidos de una consulta
Comandos de cursores

DECLARE: define un nuevo cursor


DECLARE cursor_name CURSOR FOR SELECT_statement;

OPEN:

Abre el cursor o sus filas asociadas

OPEN cursor_name

FETCH:

Extrae la siguiente fila de un cursor

FETCH cursor_name INTO variable list;

CLOSE:

Cierra el cursor

CLOSE cursor_name ;

SQL en rutinas: Cursores


Definicin/comandos II
Ejemplo para contar el nmero de noticias mediante un cursor
CREATE PROCEDURE cursor_demo3()
BEGIN
DECLARE tmp VARCHAR(200);
DECLARE lrf BOOL;
DECLARE nn INT;
DECLARE cursor2 CURSOR FOR SELECT titulo FROM noticias;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET lrf=1;
SET lrf=0,nn=0;
OPEN cursor2;
l_cursor: LOOP
FETCH cursor2 INTO tmp;
SET nn=nn+1;
IF lrf=1 THEN
LEAVE l_cursor;
END IF;
END LOOP l_cursor;
CLOSE cursor2;
SELECT nn;
END; $$

GESTION DE RUTINAS ALMACENADAS

Creacin (ya visto)

Eliminacin rutinas
Para eliminar procedimientos o funciones usamos el comando SQL DROP con la
siguiente sintaxis:

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

Consulta rutinas
SHOW CREATE {PROCEDURE | FUNCTION} sp_name
SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']

MANEJO DE ERRORES

Sintaxis

DECLARE {CONTINUE | EXIT} HANDLER FOR


{SQLSTATE sqlstate_code| MySQL error code| condition_name}
handler_actions

Tipo de manejador:

EXIT o CONTINUE

Condicin del manejador:

Estado SQL (SQLSTATE), error


propio de MySQL o cdigo de error
definido por el usuario

Acciones del manejador:

Acciones a tomar cuando se active


el manejador

EJEMPLO COMPLETO
Ejemplo completo en el que se obtienen y muestran el nmero de noticias publicadas de
cada autor para lo cual se precisan dos cursores:
CREATE PROCEDURE noticias_autor( )
READS SQL DATA
BEGIN
DECLARE vautor,na_count INT;
DECLARE fin BOOL;
DECLARE autor_cursor cursor FOR SELECT id_autor FROM autor;
DECLARE noticia_cursor cursor FOR SELECT autor FROM noticias WHERE autor=vautor;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin=1;
SET na_count=0;
OPEN autor_cursos;
autor_loop: LOOP
FETCH ac into vautor;
IF fin=1 THEN LEAVE autor_loop;
END IF;
OPEN noticia_cursor;
SET na_count=0;
noticias_loop: LOOP
FETCH nc INTO vautor;
IF fin=1 THEN LEAVE autor_loop;
END IF;
SET na_count=na_count+1;
END LOOP noticias_loop;
CLOSE noticia_cursor;
SET fin=0;
SELECT CONCAT('El autor',vautor,'tiene', na_count,' noticias');
END LOOP autor_loop;
CLOSE autor_cursor;
END;$$

FIN CAPTULO 8

S-ar putea să vă placă și