Vous êtes sur la page 1sur 16

Unidad 3

Stored Procedures

[MySQL Avanzado]
De Intecap-TICS
[Optimizar y Automatizar las gestiones a las bases de datos son muy importantes para hacer que el sistema de bases de datos sea ms rpido, flexible y seguro; los Objetivos de la Unidad son adquirir las competencias de los siguientes contenidos.]

Unidad 3

MySQL Avanzado
+-----------------------+ | Stored Procedures | +-------------_---------+
Introduccin a procedimientos avanzados de MySQL Este es un tema de mucha importancia para los administradores de bases de datos o programadores avanzados de servidores de bases de datos ya el uso de los Stored Procedure permite optimizar y automatizar las gestiones a las bases de datos. MySQL permite la definicin de funciones, procedimientos y mtodos. Y se pueden definir mediante el componente procedimental de SQL o mediante un lenguaje de programacin como Java, C o C++. Las funciones se pueden escribir como un tipo especial de procedimientos. En este curso se trataran dos objetos procedimentales parecidos: Stored Procedure (SP) y Trigger. Antes de empezar con Stored Procedure Aviso: Para ejecutar los SP tiene que contar con una versin 5.0.x de MySQL, de lo contrario los Stored Procedure y Triggers no funcionaran. Para ejecutar los SP debe trabajar con una cuenta como administrador con todos los privilegios o como root. Stored Procedure (SP) Un Stored Procedure <en espaol: procedimiento almacenado> o database procedure es un procedimiento (como un subprograma en un lenguaje de computacin regular) que se guarda (en la base de datos). Hablando correctamente, MySQL soporta "rutinas" y hay dos tipos de rutinas: los procedimientos almacenados (SP) que se invocan bajo peticin, o funciones definidas por el usuario que utilizan en otras sentencias SQL de la misma manera que se utiliza funciones preinstaladas de MySQL, como, por ejemplo pi(). Los procedimientos almacenados ( Stored Procedures, SP) suponen una importante innovacin introducida en MySQL desde la versin 5.0. Son funciones SQL definidas por el usuario que se ejecutan directamente en el servidor. Con los SP es posible guardar parte de la lgica de la aplicacin cliente-servidor en el servidor. Un Stored Procedure es una determinada porcin de cdigo (el procedimiento) que consiste en sentencias SQL declarativas y procedimentales almacenados en el catlogo de una base de datos que pueden ser activadas mediante una llamada desde un programa O un trigger (estos sern tratados en la siguiente unidad), u otro procedimiento almacenado. Por lo tanto, un SP es un fragmento de cdigo. Este cdigo puede constar de sentencias declarativas de SQL, tales como CREATE, UPDATE, SELECT; y posiblemente complementado con declaraciones procesales, tales como IF-THEN-ELSE y WHILE-DO, el cual es el cdigo del que se construye un procedimiento almacenado, por lo tanto, es una parte de un programa, pero se almacena en el catlogo. Llamar a un SP es comparable a llamar a un procedimiento normal (de lo contrario es llama a una funcin o rutina) en los lenguajes procedimentales. Para llamar a un SP, una nueva sentencia de SQL se ha de introducir llamada CALL. Al llamar a un SP, tambin se puede especificar parmetros de entrada y de salida. Como se indica al principio, los SP pueden ser
2

MySQL es Software Libre

MySQL Avanzado
llamados desde otros procedimientos almacenados, de la misma forma como las funciones en C pueden llamar a otras funciones. Los SP son una buena idea (mas velocidad, mas seguridad para los datos, menos duplicacin de cdigo,...). En general, las razones para usar SP son: Velocidad. En muchas ocasiones, determinadas operaciones de una aplicacin pueden suponer que muchos datos sean enviados del servidor al cliente y viceversa. El cliente ejecuta un SELECT que produce muchos resultados, que son enviados desde el servidor al cliente. El cliente los procesa y enva una gran lista de UPDATEs de vuelta al servidor. Si todos estos pasos se pudieran ejecutar en el servidor se evitara una gran sobrecarga de la comunicacin cliente-servidor. Adems, MySQL puede reprocesar el cdigo de los SP, evitando tener que compilar el cdigo de un SP cada vez que se ejecuta. Sin embargo, MySQL no documenta que tipo de optimizaciones realiza cuando precompila los SP. De todas formas, usar SP no garantiza una mejora en la velocidad de ejecucin de nuestras aplicaciones. Solo se consiguen mejoras si el cdigo del SP es eficiente. Y como SQL es un lenguaje mucho mas primitivo que otros, no siempre es posible escribir cdigo eficiente. Otro aspecto a tener en cuenta es que los SP aumentan la carga del servidor, mientras que la reducen en la parte del cliente. El resultado de este balance depender mucho de como este configurado nuestro sistema y de cuales sean los cuellos de botella de nuestra aplicacin. Reutilizacin de cdigo. Ocurre frecuentemente que diferentes aplicaciones, o diferentes usuarios de una misma aplicacin realizan la misma operacin una y otra vez. Si la lgica de estas operaciones puede ser trasladada al servidor en forma de SPs entonces se consigue reducir la redundancia de cdigo, y adems, y muy importante, el sistema es mucho mas fcil de mantener. Seguridad de los datos . Hay muchas aplicaciones en la que la integridad de los datos es crtica. En estos casos, es deseable que los usuarios no puedan acceder directamente a determinadas tablas. La manera de obtener los datos es a travs de SPs que se encargan de realizar los SELECT, UPTATE o INSERT a travs de los SPs que son visibles a los usuarios. Un beneficio adicional es que los administradores pueden monitorizar los accesos a la base de datos mucho ms fcilmente. La gran desventaja de los SP es que normalmente su portabilidad es muy baja, con lo que las funciones escritas para un sistema concreto no se ejecutaran directamente en otro sistema. La razn es que cada sistema de bases de datos usa su propia sintaxis y sus propias extensiones para los SP, de forma que estos no estn estandarizados. Esquema general de un Stored Procedure Un procedimiento almacenado tiene: un nombre, una lista de parmetros, y una sentencia SQL que puede contener muchas ms declaraciones de SQL. Hay adems una nueva sintaxis en los bloques declarados con BEGIN_END para las variables locales, manejo de errores; y control de bucle. Aqu est un ejemplo de una declaracin completa que crea un procedimiento almacenado.

MySQL es Software Libre

MySQL Avanzado

Figura 1: Esquema general de un Stored Procedure Esta unidad se explica en detalle todas las cosas que puede hacer con SP. En la siguiente unidad se trata un nuevo tipo de objeto de base de datos, los triggers, debido a que es una tendencia comn a asociar triggers con stored procedure. La sintaxis para crear un SP es: CREATE FUNCTION nombre ([parametro[...]) RETURNS tipo_de_datos [opciones] codigo_sql CREATE PROCEDURE nombre ([parametro[...]) [opciones] codigo_sql La nica diferencia entre los dos es que FUNCTION retorna un valor y PROCEDURE no. El SP creado se asocia a la base de datos actual. Puede haber una FUNCTION y un PROCEDURE con el mismo nombre. Los parmetros tienen la sintaxis: nombre_parametro[IN | OUT | INOUT] Los parmetros de FUNCTION son todos IN por defecto. Los parmetros que son OUT en un PROCEDURE son valores que se retornan y que se inicializan a NULL. Los INOUT son parmetros de PROCEDURE que son tanto de entrada como de salida, esto se explicara mejor con los ejemplos encontrados ms adelante. Algunas de las opciones que se puede especificar son: LANGUAGE SQL: el nico valor posible de momento. Se prev que en el futuro se puedan usar otros lenguajes de programacin. [NOT]DETERMINISTIC: un SP esta considerado determinista cuando siempre retorna el mismo resultado con los mismos parmetros. Los SP que dependen de una tabla de la base de datos son no deterministas obviamente. Por defecto los SP son no deterministas. Sin embargo, los SP que si lo son pueden ejecutarse de una manera mucho ms eficiente ya que, por ejemplo, los resultados se pueden almacenar en una cache. De cualquier manera, actualmente esta opcin es ignorada por MySQL. SQL SECURITY DEFINER o INVOKER: el modo SQL SECURITY especifica los privilegios de acceso al SP. COMMENT 'text': el comentario se almacena con el SP a modo de documentacin.

MySQL es Software Libre

MySQL Avanzado
Estas opciones se ejecutaran en la Consulta-ejemplo 4-8. Sintaxis General de los SP Los SP estn compuestos principalmente de un conjunto de instrucciones SQL ordinarias. Sin embargo hay una serie de instrucciones adicionales que permiten control de flujo, alternativas, cursores, etc. Primero veremos cuales son las diferencias entre FUNCTION y un PROCEDURE, que estn resumidas en Tabla 1.

Tabla 1: Diferencias entre FUNCTION y PROCEDURE Las reglas generales para escribir SP son: 1. Punto y coma (;): Para separar las diferentes instrucciones que componen un SP se utiliza el carcter ';', por lo que ser necesario cambiar el delimitador ; de MySQL temporalmente cuando se escribe un SP. 2. BEGIN-END: Las instrucciones que no se encuentran entre dos palabras reservadas (por ejemplo IF, THEN, ELSE) han de ponerse entre un BEGIN y un END. 3. Salto de lnea: Los saltos de lnea son considerados como espacios en blanco. 4. Variables: Las variables locales y los parmetros se acceden sin un carcter @ al principio. El resto de variables SQL deben comenzar con @; y por lo general se definen con la sentencia SET. 5. Maysculas/minsculas: MySQL no las distingue al definir el nombre del SP. 6. Caracteres especiales: Evitar el uso de caracteres fuera del cdigo ASCII (tildes, , etc.). A pesar de estar permitidos, pueden aparecer problemas al administrar la base de datos o hacerlo inmerso en otros lenguajes de programacin con java, C++, etc. 7. Comentarios: Los comentarios se introducen con '--' y se extienden hasta el final de la lnea. Para ejemplificar los SP ser necesario contar con una base de datos de prueba, la cual crearemos a continuacin, se recomienda al estudiantes realizar todos los ejemplos a continuacin para ejercitar el uso de los SP. "Base de datos" de ejemplo Los SP trabajan sobre bases de datos existentes, entonces antes se debe crear una base de datos con sus respectivas tablas y registros, como se har a continuacin. Consulta-ejemplo 4.1: Crear una nueva base de datos de nombre DB5 y hacer de ella la base de datos por defecto para trabajar. mysql> CREATE DATABASE DB5; Query OK, 0 rows affected (0.19 sec)
5

MySQL es Software Libre

MySQL Avanzado
mysql> USE DB5; Database changed Ahora le realizaremos unos cambios a la base de datos, le vamos a crear una tabla y un registro. Consulta-ejemplo 4.2: Crear una tabla con un registro. mysql> CREATE TABLE t (s1 INT); Query OK, 0 rows affected (0.19 sec) mysql> INSERT INTO t VALUES (5); Query OK, 1 row affected (0.07 sec) Verifique que se han realizado los cambios a la base de datos DB5. Consulta-ejemplo 4.3: Muestre las tablas y registro en DB5. mysql> SHOW TABLES; +---------------+ | Tables_in_db5 | +---------------+ | t | +---------------+ mysql> SELECT * FROM t; +------+ | s1 | +------+ | 5 | +------+ Elija un delimitador Tambin como se comento en las reglas para crear SP, antes de empezar a trabajar con SP, va a ser necesario cambiar el delimitador por defecto de MySQL, pues como se ve en el ejemplo de la Figura 1, en el bloque inmerso en el SP se utiliza el delimitador de cambio de lnea ; el cual no es precisamente el final de la instruccin del SQL. El delimitador que vamos a usar para MySQL es // (este es arbitrario y se elige a conveniencias otros ejemplos de delimitadores son $$, /$). La siguiente consulta muestra como realizarlo. Consulta-ejemplo 4.4: Cambiar el delimitador de MySQL, por // mysql> DELIMITER // entonces de ahora en adelante para terminar una sentencia en SQL utilizar //, por ejemplo: mysql> SELECT * FROM t // +------+ | s1 | +------+ | 5 | +------+

MySQL es Software Libre

MySQL Avanzado
El delimitador es el carcter o una cadena de caracteres que se va a utilizar para indicar al cliente mySQL que haya terminado de escribir en una sentencia SQL. Por default, el delimitador ha sido siempre un punto y coma ;. Esto causa un problema porque, en un SP, uno puede tener muchos estados lneas, y cada una debe terminar con un punto y coma. As que para crear su delimitador, elige una cadena que es muy poco probable que ocurra dentro de cualquier declaracin, o dentro de cualquier procedimiento. Se ha usado barras diagonales. Otros utilizan una barra vertical. Usted puede usar el delimitador que quiera siempre y cuando no se confunda con las sintaxis estndares de MySQL, durante este curso se utilizar //. Considero que no es necesario explicar como volver al delimitador por default de MySQL, o si? Nota: Los SP pueden ser del tipo FUNCION o PROCEDURE, pero en este curso se trata exclusivamente los PROCEDURE. Ahora si, veamos unas consultas para aprender a crear y utilizar los Stored Procedure. Consulta-ejemplo 4.5: Crear un Stored Procedure que realice una consulta a toda la tabla t. mysql> CREATE PROCEDURE p1() SELECT * FROM t; // Comentarios 1. La primera parte de la instruccin CREATE PROCEDURE es para crea un nuevo procedimiento almacenado. 2. La segunda parte p1 es el nombre del procedimiento. El nombre de este nuevo procedimiento ser p1, las reglas para nombrar SP son las mismas que se usan en todas las sentencias CREATE. Nota: Los nombres de los procedimientos no distinguen entre maysculas y minsculas, as 'p1' y 'P1' son el mismo nombre. 3. (): Es la "lista de parmetros". Siempre es necesario contar con una lista de parmetros que se colocan entre parntesis. En este procedimiento, no hay parmetros, por lo que la lista de parmetros est vaca. Pero los () son obligatorios dentro de la sintaxis de un SP.

MySQL es Software Libre

4. Las instruccin SQL SELECT * FROM t//, ser la accin a realizar por el Stored Procedure. La utilidad y aplicacin de un SP es extensa, y este curso se limita a dar un primer acercamiento a los SP, es importante aclarar que el uso avanzado de de los SP requiere conocimiento de construccin de programacin lgica estructurada lo cual esta fuera de los objetivos de este curso. 5. "SELECT * FROM t," es el cuerpo del SP. Es la parte procedimental, que es una sentencia SQL. Aqu el cuerpo es "SELECT * FROM t;", que incluye un punto y coma ";". El punto y coma es opcional cuando existe una verdadera declaracin-terminada en el SP por el "//" que le sigue. Es probablemente bueno aclarar que se esta llamando a esta parte del cuerpo bloque del procedimiento, porque el cuerpo es un trmino tcnico que se utiliza. 6. No se puede utilizar dos procedimientos con el mismo nombre en la misma base de datos. Eso es sobrecarga. Algunos DBMS permiten la sobrecarga. MySQL no es as. Si lo desea puede utilizar nombres completos de la forma "nombre_base-datos.nombre_SP", para calificar al SP, por ejemplo "db5.p1".

MySQL Avanzado
7. Los nombres de los procedimientos pueden ser delimitados. Si el nombre est delimitado, este puede contener espacios. La longitud mxima del nombre es de 64 caracteres. Sin embargo, evitar el uso de los nombres que ya estn asignados a nombres de las funciones integradas de MySQL. De omitir esta sugerencia a la hora de llamar al SP puede producir un error como se muestra en los siguientes ejemplos: mysql> CALL pi(); Error 1064 (42000): You have a syntax error. mysql> CALL pi (); Error 1305 (42000): PROCEDURE does not exist. En la primer entrada de ejemplo, se ha utilizado una funcin llamada pi. Es legal, pero debe dejar un espacio despus del nombre cuando usted lo est llamando, como se hace en el segundo ejemplo, sin embargo una explicacin mas extensa de un SP delimitado cae fuera de los objetivos de este curso, pero para las ltimas versiones de MySQL podr omitir este punto 7 comentado, ya que es indistinto dejar o no dejar un espacio a la hora de llamar al SP. Declaraciones MySQL que son permitidas en un cuerpo del procedimiento Qu instrucciones SQL son permitidas en el cuerpo de un procedimiento de MySQL? Un procedimiento puede contener casi cualquier sentencia SQL, como INSERT, UPDATE, DELETE, SELECT, DROP, CREATE, REPLACE, y as sucesivamente. El nico punto importante a recordar es que su cdigo no ser portable si se incluye una extensin de MySQL. Al igual que en SQL estndar: cualquier sentencia SQL definida que se aplique a una base de datos es permitida, por ejemplo: CREAR PROCEDIMIENTO p() DELETE FROM t; // Adems, SET y COMMIT y ROLLBACK son legales: CREAR PROCEDIMIENTO p() SET @x = 5; //

MySQL es Software Libre

Las instrucciones de manipulacin de bases de datos son permitas: CREAR PROCEDIMIENTO p() DROP TABLE t // Vea que es posible incluir instrucciones DDL en un procedimiento SP. Una restriccin importante es que, dentro de un cuerpo del procedimiento, no se puede poner la manipulacin de bases de datos que manipulen una rutina. Por ejemplo, no es permitido: CREATE PROCEDURE p1() CREATE PROCEDURE DELETE p2() FROM t; // As que las siguientes sentencias MySQL 5.0, no son permitidas en el cuerpo de un procedimiento: CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE, CREATE FUNCTION, CREATE TRIGGER, DROP TRIGGER.

MySQL Avanzado
Por otro lado, si es permitido: CREATE PROCEDURE db5.p1() DROP DATABASE DB5 // Declaraciones como "USE nombre_base-de-datos" tampoco son permitas. Ya que MySQL asume que la base de datos por defecto para aplicar el procedimiento es la que esta en uso, mediante la sentencia USE. Llamar al procedimiento 1. Para llamar a un procedimiento, todo lo que tienes que hacer es ingresar la sentencia CALL y luego el nombre del procedimiento seguido de los parntesis. Una vez ms, los parntesis son obligatorios. Consulta-ejemplo 4.6: Llamar al procedimiento p1. mysql> CALL p1()// +------+ | s1 | +------+ | 5 | +------+ Comentarios El resultado es lgico. Ya que el cuerpo del procedimiento es una declaracin: SELECT * FROM t; Note que la funcin en este caso del SP fue ejecutar una accin SQL. El punto fundamental es puede crear un procedimiento casi sobre cualquier accin que se desea realizar sobre una base de datos. Ahora vamos a hacer una serie de ejemplos en los que se aade una clusula en un momento dado, o variar a alguna de las clusulas existentes. Habr muchas clusulas de este tipo, incluso antes de llegar a cdigos ms complejos. Todos los SP que se crean quedan guardados en el sistema, para consultar un SP se utiliza la sentencia SHOW. Consulta-ejemplo 4.7: Mostrar las caractersticas del SP p1 mysql> SHOW CREATE PROCEDURE p2// Nota: para ver el siguiente display, dele un zoom a este documento pdf, o ejecute la instruccin en su lnea de comandos de MySQL
+-----------+----------+--------------------------------------------------------------------+----------------------+----------------------+--------------------+ | Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation | +-----------+----------+--------------------------------------------------------------------+----------------------+----------------------+--------------------+ | p2 | | CREATE DEFINER=`root`@`localhost` PROCEDURE `p2`()SELECT * FROM t | cp850 | cp850_general_ci | latin1_swedish_ci | +-----------+----------+--------------------------------------------------------------------+----------------------+----------------------+--------------------+ 1 row in set (0.02 sec)

MySQL es Software Libre

Caractersticas de las clusulas Vamos a hacer un procedimiento que tiene algunas clusulas que describen las caractersticas del procedimiento. Las clusulas se colocan despus de los parntesis, pero antes de que el cuerpo. Estas clusulas son opcionales .
9

MySQL Avanzado
Consulta-ejemplo 4.8: mostrar la fecha del sistema y un numero aleatorio, incluyendo las clausulas procedimentales de un SP mysql> -> -> -> -> -> CREATE PROCEDURE pa () LANGUAGE SQL NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT '' SELECT CURRENT_DATE, RAND() FROM t //

mysql> call pa()// +--------------+---------------------+ | CURRENT_DATE | RAND() | +--------------+---------------------+ | 2012-07-04 | 0.23271597943521663 | +--------------+---------------------+ Comentario No olvide que hay que llamar al SP con CALL, y note que se muestra la fecha del sistema y un numero aleatorio, no olvide que los SP trabajan sobre base de datos, y especficamente sobre las tablas, por lo que es necesario referenciar a una tabla arbitraria para mostrar estos valores, las clausulas son opcionales pero le dan integridad a los resultados devueltos por los SP. Implementacin de SP Los SP de MySQL siguen el estndar SQL:2003. De esta manera, los SP de MySQL se pueden portar fcilmente al sistema DB2 de IBM. Sin embargo, no se pueden portar a Oracle o Microsoft SQL Server ya que estos no siguen el estndar SQL. El almacenamiento interno de los SP se hace en la tabla mysql.proc, la cual se debe de crear en caso no exista. En las columnas de esta tabla estn almacenados todos los datos relativos al SP. Si no tenemos acceso a la base de datos mysql, podemos recuperar la misma informacin con INFORMATION_SCHEMA.ROUTINES . Eliminar un Stored Procedure

MySQL es Software Libre

Sintaxis DROP PROCEDURE IF EXISTS nombre-SP La opcin IF EXISTS hace que si el SP no existe no se produzca ningn error y la puede utilizar en sentencias como CREATE, DELETE, UPDATE. Los SP pueden modificarse con ALTER. Se necesita el privilegio ALTER ROUTINE para hacerlo. La sintaxis es: ALTER PROCEDURE nombre [NAME nombre_nuevo] [SQL SECURITY DEFINER/INVOKER] [COMMENT 'nuevo comentario'] Parmetros Pueden definirse parmetros en un procedimiento almacenado.
10

MySQL Avanzado
1. CREATE PROCEDURE p5 () ... 2. CREATE PROCEDURE p5 ([IN] name data-type) ... 3. CREATE PROCEDURE p5 (OUT name data-type) ... 4. CREATE PROCEDURE p5 (INOUT name data-type) ... Recordemos que la lista de parmetros es lo que hay entre los parntesis justo despus del nombre del procedimiento almacenado. En el primer ejemplo la lista de parmetros est vaca. En el segundo ejemplo hay un parmetro de entrada. La palabra IN es opcional, ya que son parmetros IN (entrada) por defecto. En el tercer ejemplo hay un parmetro de salida. En el cuarto ejemplo hay un parmetro que es tanto de entrada como de salida. Veamos unos ejemplos de estos parmetros. Ejemplo IN mysql> CREATE PROCEDURE p5(p INT) SET @x = p // Query OK, 0 rows affected (0.00 sec) mysql> CALL p5(12345)// Query OK, 0 rows affected (0.00 sec) mysql> SELECT @x// +-------+ | @x | +-------+ | 12345 | +-------+ Comentario El ejemplo muestra el procedimiento con un parmetro de entrada. En el cuerpo del procedimiento, se le indica que se quiere establecer una variable de sesin llamada x con el valor de lo que al valor del parmetro p se asigne. Entonces a la hora de llamar el procedimiento se le indica el valor de 12345 como argumento para el parmetro p. Luego seleccione la variable de sesin y se evala en el SP, y se muestra la accin del bloque con la asignacin 12345 a x como se ve en el identificador de columna que se muestra al llamado. Note que, como se estn creando variables locales, no es necesario referenciar a ninguna tabla.

MySQL es Software Libre

11

MySQL Avanzado
Ejemplo OUT mysql> CREATE PROCEDURE p6 (OUT p INT) -> SET p = -5 // mysql> CALL p6(@y)// mysql> SELECT @y// +------+ | @y | +------+ | -5 | +------+ Comentario Ahora, aqu hay un ejemplo donde la salida es distinta. p es el nombre de un parmetro de salida y se esta pasando su valor a una variable de sesin llamada @y, en la sentencia CALL. En el cuerpo del procedimiento, se le indica que el parmetro que se obtendr es el valor -5. Y despus de llamar al procedimiento, vea la accin del SP. As que la palabra OUT le dice a la DBMS que el valor sale del procedimiento. El efecto es el mismo que si se hubiese ejecutado la sentencia "SET @y = -5;" similar al ejemplo IN anterior. Nuevas sentencias SQL Variables La declaracin que se utiliza para definir las variables en una sentencia compuesta es DECLARE. (1) Ejemplo con dos sentencias DECLARE CREATE PROCEDURE p8 () BEGIN DECLARE a INT; DECLARE b INT; SET a = 5; SET b = 5; INSERT INTO t VALUES (a); SELECT s1 * a FROM t WHERE s1 >= b; END; // Comentarios Note que no se definen variables en el procedimiento almacenado. Estos se definen en el BEGINEND del bloque. Tenga en cuenta que estas variables no son como las variables de sesin: Note que empiezan con un signo de arroba (@). Se debern declarar explcitamente al inicio del bloque BEGIN-END, junto con sus tipos de datos. Una vez que haya declarado una variable, se puede usar en cualquier lugar del SP como cualquier otra variable de sesin, o literal, o nombre de la columna.

MySQL es Software Libre

12

MySQL Avanzado
Queda al lector llamar al SP para verificar la accin. (2) Ejemplo sin clusula DEFAULT y la instruccin SET CREATE PROCEDURE p9 () BEGIN DECLARE a INT /* there is no DEFAULT clause */; DECLARE b INT /* there is no DEFAULT clause */; SET a = 5; /* there is a SET statement */ SET b = 5; /* there is a SET statement */ INSERT INTO t VALUES (a); SELECT s1 * a FROM t WHERE s1 >= b; END; // /* Este SP no ser llamado*/ Hay varias formas de inicializar una variable. Cuando se declare sin una clusula DEFAULT, el valor inicial de una variable siempre es NULL. Puede utilizar la instruccin SET para asignar otro valor a una variable en cualquier momento. (3) Ejemplo con clausula DEFAULT CREATE PROCEDURE p10 () BEGIN DECLARE a, b INT DEFAULT 5; INSERT INTO t VALUES (a); SELECT s1 * a FROM t WHERE s1 >= b; END; // Aqu hay una variacin que hace lo mismo. Esta vez se ponen las dos declaraciones de variables en la misma lnea y el uso de una clusula DEFAULT para establecer el valor inicial, en lugar de hacer dos declaraciones separadas DECLARE y SET. (4) Example of CALL mysql> CALL p10() // +--------+ | s1 * a | +--------+ | 25 | | 25 | +--------+ Una vez ms, slo se esta pidiendo mostrar el SP. Control de flujo Hay bsicamente dos maneras de controlar el flujo en SPs. IF-THEN-ELSE La sintaxis de esta construccin es: IF condicion THEN instrucciones; [ELSE IF condicion THEN instrucciones;] [ELSE instrucciones;] END IF;

MySQL es Software Libre

13

MySQL Avanzado
Nos es necesario usar BEGIN-END dentro de estas estructuras de control. La condicin puede formularse usando consultas con WHERE o HAVING. CASE Es una variante de IF que es til cuando todas las condiciones dependen de un solo valor de una expresin. La sintaxis es: CASE expresion WHEN valor1 THEN instrucciones; [WHEN valor2 THEN instrucciones;] [ELSE instrucciones;] END CASE; Bucles MySQL ofrece una serie de opciones para construir bucles. Curiosamente, la opcin de FOR no existe en MySQL. LOOP Con esta construccin se define un bucle que se ejecuta hasta que se sale de el mediante una instruccin LEAVE. Sintaxis: nombre_bucle: LOOP instrucciones; END LOOP nombre_loop; REPEAT-UNTIL Las instrucciones dentro de esta construccin se ejecutan hasta que se cumple una determinada condicin. Como la condicin se evala al final del bucle, este siempre se ejecuta al menos una vez. El bucle puede llevar opcionalmente una etiqueta, que puede ser usada para abandonar el bucle usando la instruccin LEAVE, o repetir una iteracin con ITERATE. [nombre_loop:] REPEAT instrucciones; UNTIL condicion1 END REPEAT [nombre_loop]; WHILE-DO Las instrucciones entre WHILE y DO se ejecutan siempre que la condicin correspondiente sea cierta. Como la condicin se evala al principio del bucle, es posible que no se produzca ninguna iteracin. Sintaxis: [nombre_bucle:] WHILE condicion DO instrucciones; END WHILE [nombre-.bucle]; Nota: No se pretende en este curso ejemplificar todas las posibles sentencias de control, debido a que el estudiante tendra que tener bases de programacin y lgica de algoritmos; pero si se
14

MySQL es Software Libre

MySQL Avanzado
muestra un ejemplo ms para mostrar el uso de estas sentencias y que servir de base para que usted cree sus propios SP. Condiciones IF-THEN-ELSE Ejemplificaremos las condiciones IF-ELSE ya que son tpicas en los lenguajes de programacin, desarrollando un SP que implica estas sentencias. CREATE PROCEDURE p12 (IN parameter1 INT) BEGIN DECLARE variable1 INT; SET variable1 = parameter1 + 1; IF variable1 = 0 THEN INSERT INTO t VALUES (17); END IF; IF parameter1 = 0 THEN UPDATE t SET s1 = s1 + 1; ELSE UPDATE t SET s1 = s1 + 2; END IF; END; // Comentarios 1. Nota: tiene que tener la tabla t creada anteriormente en su sistema, este ejercicio ya se hizo ms arriba de este documento. 2. Se explica este SP siguiendo la secuencia de ejecucin de programacin: lnea tras lnea. 3. Note que hay un procedimiento almacenado que contiene instrucciones IF. Uno de ellos es IF [condicin-1] END IF. La otra es IF[condicin-2] ELSE [condicin-3] END IF. Con este SP se muestra que es posible tener algo complejo, pero, al mismo tiempo se trata de mantenerlo tan simple que usted puede averiguar lo que est pasando. Si llamamos al SP con un valor de 0. CALL p12(0) //

MySQL es Software Libre

Supongamos que llamamos a este procedimiento y se pasa un valor de cero. As el parmetro1 ser cero. Lo primero que sucede es que se establecen la variable1 y el parmetro1 ms uno (+1), lo que significa que se pone a cero ms uno (por lo que ser uno (1) el inicio el valor de inicio). 4. La prxima cosa que pasa no es nada. Desde variable1 con valor uno, la condicin "si variable1 = 0" no es cierto. Por lo tanto todo lo que este entre el primer IF-END IF se salta. 5. Pasando a analizar la segunda instruccin IF. Y por esta declaracin, la condicin es verdadera, porque sabemos que parmetro1 es igual a cero. 6. Si el parmetro1 hubiese sido nulo, La otra actualizacin es la que ejecutara en su lugar. Actualmente hay una fila en la tabla t, y ambos contienen el valor de 5, por lo que ahora si llamamos a p12, la fila debe contener a 6.
15

MySQL Avanzado
a mysql> CALL p12(0)// Query OK, 2 rows affected (0.28 sec) a mysql> SELECT * FROM t// +------+ | s1 | +------+ | 6 | +------+ Y efectivamente, se cumple la accin del SP. Existe mucho mas que aprender de Stored Procedure, pero por el tiempo que dura el curso no es posible exponer ms temas, sin embargo se han expuesto los puntos ms importantes del SP, queda al lector ampliar y poner en practica usos avanzados de SP, sin embargo en la siguiente unidad que trata de trigger que son otros objetos que automatizan las acciones sobre las bases de datos y los cuales pueden invocar a SP definidos en el sistema. BIBLIOGRAFIAS 1. FUNDAMENTOS DE BASES DE DATOS. Abraham S. Henry F. Cuarta edicin. McGrawHill. Mxico. 2008. 2. Beginning Oracle SQL. Oracle Lex de Haan Et.Al Apress. USA. 2009. 3. http://dev.mysql.com/doc/refman/5.6/en/ MySQL 5.6 Reference Manual

MySQL es Software Libre

16

Vous aimerez peut-être aussi