Anda di halaman 1dari 37

E:\MAESTRIA\ESPCOM BD\ presentacion9_BDMySQL7.ppt http://es.debugmodeon.com/articulo/procedimientos-almacenados-en-mysql ejemplos de cmo crearlos http://www.nosolocodigo.com/procedimientos-almacenados-con-mysql-5 ejemplos de cmo llamarlos desde php http://msmvps.com/blogs/jvargas/archive/2008/09/19/como-trabajar-conprocedimientos-almacenados.

aspx ejemplos de cmo llamarlos desde .net http://grupos.emagister.com/debate/llamar_procedimiento_almacenado_desde_visua l_studio_2005/6906-488055 ejemplo de cmo llamarlos desde visual studio http://es.scribd.com/doc/48025182/Administracion-de-BD-MySQL-5-1 Administracin de Bases de Datos, curso de MySQL MISIN Hacer llamado a una funcin desde php y luego desde .net que devuelva un valor: numrico del valor mximo nmero de cliente Hacer llamado a procedimiento almacenado desde php y luego desde .net que devuelva dos valores: numrico del valor mximo nmero de cliente y su descripcin Hacer llamado a funcin o procedimiento almacenado desde php y luego desde .net que devuelva dos valores: numrico del valor (0=ok, 1=error) y varchar(50) mensaje si se hizo commit o rollback INTRODUCCIN: PROCEDIMIENTOS ALMACENADOS UNO SENCILLO (ya) UNO CON PARM DE ENTRADA (ya) UNO QUE DEVUELVE DATOS (ya) FUNCIONES UNA SENCILLA (ya) CTL+Z CONTROL DE COMPROMISO

Pg 1

EJEMPLOS BSICOS DE ROLLBACK Y COMMIT


HACER EN CONSOLA. SE VER QUE SE EJECUTA LA SENTENCIA PERO NO FUNCIONA EL DESHACER delete from clientes where num_cte=47; rollback; HACER EN CONSOLA. SE VER QUE SE EJECUTA DESHACER set autocommit=0; delete from clientes where num_cte=47; rollback; LA SENTENCIA Y YA FUNCIONA EL

HACER EN CONSOLA, SE VER QUE DE LOS SEIS REGISTROS INSERTADOS SLO QUE DARN LOS DOS QUE SE CONFIRMARON, PUES CUATRO DE DESHICIERON SET AUTOCOMMIT=0; INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); ROLLBACK; INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); COMMIT; INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); ROLLBACK; INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); COMMIT;

Pg 2

LLAMADO A FUNCIONES DESDE CONSOLA Y DESDE PHP


http://www.forosdelweb.com/f18/llamadas-funcion-mysql-desde-php-917289/ HACER EN CONSOLA. SLO PARA PRCTICA DE FUNCIONES

DELIMITER $$ DROP FUNCTION IF EXISTS FunNombreCliente $$ CREATE FUNCTION FunNombreCliente(numero int) returns varchar(50) BEGIN DECLARE salida varchar(50); SELECT nombre_cte INTO salida FROM clientes WHERE num_cte=numero; return salida; END $$ #si no funciona, quitarle el pesospesos o ponerle ; o darle salto de linea
SELECT FunNombreCliente(2) HACER EN CONSOLA. LLAMARLA DESDE CONSOLA.

DELIMITER $$ DROP FUNCTION IF EXISTS FunContarClientes $$ CREATE FUNCTION FunContarClientes() returns int DETERMINISTIC READS SQL DATA BEGIN DECLARE salida int; SELECT COUNT(*) INTO salida FROM clientes; return salida; END $$ #si no funciona, ponerle salto de lnea, o quitarle $$ o ponerle ;
SELECT FunContarClientes()
LLAMARLA DESDE UN PROGRAMA DE PHP. (sitiobasesdedatos/Transacciones1.php)
Pg 3

echo "Llamado a una funcion que cuenta los clientes<br>"; $resultado = mysql_db_query("puntodeventa", "select FunContarClientes() as rr") or die(mysql_error()); $row = mysql_fetch_assoc($resultado); echo "El total de clientes es: ".$row["rr"];

Pg 4

HACER EN CONSOLA. SE VER QUE SE EJECUTA LA SENTENCIA PERO NO FUNCIONA EL DESHACER

DELIMITER $$ DROP PROCEDURE IF EXISTS procedure1 $$ CREATE PROCEDURE procedure1 (in parameter1 INTEGER) BEGIN DECLARE variable1 CHAR(10); IF parameter1 = 17 THEN SET variable1 = 'birds'; ELSE SET variable1 = 'beasts'; END IF; INSERT INTO table1 VALUES(variable1); END $$ DELIMITER $$ DROP PROCEDURE IF EXISTS ProcCreaCliente $$ CREATE PROCEDURE ProcCreaCliente (IN nombre varchar(50), rfc char(13)) BEGIN #DECLARE variable1 CHAR(10); IF nombre <> 'PEPITO' THEN INSERT INTO clientes VALUES(' ', nombre, rfc); END IF; END $$ LLAMADO A PROCEDIMIENTOS ALMACENADOS DESDE CONSOLA
LLAMADO DESDE CONSOLA. CON ACCION=0 HACE ROLLBACK, SE BORRARA LA TRANSACCIN. NO FUNCIONAR EL ROLLBACK PORQUE EL AUTOCOMMIT POR DEFAULT ES 1 (VERDADERO) call ProcInsertarCliente(0, 'Pancho Lopez', 'PAN121212CHO') call ProcInsertarCliente(1, 'Pancho Lopez', 'PAN121212CHO') HACER EN CONSOLA. SE VER QUE SE EJECUTA LA SENTENCIA PERO YA FUNCIONAR EL DESHACER
Pg 5

DELIMITER $$ DROP PROCEDURE IF EXISTS ProcInsertarCliente $$ CREATE PROCEDURE ProcInsertarCliente (in accion INTEGER, nombre_cte VARCHAR(50), rfc_cte CHAR(13) ) BEGIN DECLARE valor INTEGER; SET AUTOCOMMIT = 0; INSERT INTO clientes VALUES (' ', nombre_cte, rfc_cte); SET valor = 5; IF accion = 0 THEN ROLLBACK; ELSE COMMIT; END IF; END $$
call ProcInsertarCliente(0,'LOLA','RFC939393LOL') call ProcInsertarCliente(1,'LOLA','RFC939393LOL') PROCEDIMIENTO ALMACENADO CON PARAMETROS DE SALIDA DELIMITER $$ DROP PROCEDURE IF EXISTS ProcInsertarCliente $$ CREATE PROCEDURE ProcInsertarCliente (in accion INTEGER, nombre_cte VARCHAR(50), rfc_cte CHAR(13), out saludo CHAR(10) ) BEGIN DECLARE valor INTEGER; SET AUTOCOMMIT = 0; INSERT INTO clientes VALUES (' ', nombre_cte, rfc_cte); SET valor = 5; IF accion = 0 THEN ROLLBACK; SET saludo='desecho'; ELSE COMMIT; SET saludo='confirmado'; END IF; END $$ call ProcInsertarCliente(0,'LOLA','RFC939393LOL', @a); select @a; PROCEDIMIENTO ALMACENADO CON PARAMETROS (2) DE SALIDA
Pg 6

DELIMITER $$ DROP PROCEDURE IF EXISTS ProcInsertarCliente $$ CREATE PROCEDURE ProcInsertarCliente (in accion INTEGER, nombre_cte VARCHAR(50), rfc_cte CHAR(13), out saludo CHAR(10), OUT maximo INTEGER ) BEGIN DECLARE valor INTEGER; SET AUTOCOMMIT = 0; INSERT INTO clientes VALUES (' ', nombre_cte, rfc_cte); SET valor = 5; IF accion = 0 THEN ROLLBACK; SET saludo='desecho'; ELSE COMMIT; SET saludo='confirmado'; END IF; Set maximo=300; END $$ call ProcInsertarCliente(0,'LOLA','RFC939393LOL', @s, @m) select @s, @m

PROCEDIMIENTO ALMACENADO QUE RECIBE UN PARM Y DEVUELVE 2 PARM

DELIMITER $$ DROP PROCEDURE IF EXISTS ProcDatosCliente $$ CREATE PROCEDURE ProcDatosCliente (IN numero int, OUT nombre varchar(50), OUT rfc char(13)) BEGIN SELECT nombre_cte, rfc_cte INTO nombre,rfc FROM clientes WHERE num_cte=numero; END $$ call ProcDatosCliente(4, @n, @r); select @n, @r;
LLAMADO EL PROCEDIMIENTO ALMACENADO DESDE PHP

$conexion = mysql_connect("localhost:3306", "root", "");


Pg 7

echo "<h3>LLAMADO A UN PROCEDIMIENTO ALMACENADO<br>"; echo "QUE DEVUELVE DOS PARAMETROS</h3>"; $resultado = mysql_db_query("puntodeventa", "call ProdDatosCliente ('4', @p1, @p2)") or die(mysql_error()); $resultado2=mysql_db_query("puntodeventa", "select @P1,@P2"); $row = mysql_fetch_assoc($resultado2); echo "Nombre del cliente: ".$row["@P1"]."<br>"; echo " RFC del cliente: ".$row["@P2"]."<br>";
PROCEDIMIENTO ALMACENADO QUE CALCULA UN VALOR A PARTIR DE LA BASE DE DATOS Y LO ASIGNA A UNA VARIABLE DELIMITER $$ DROP PROCEDURE IF EXISTS ProcInsertarCliente $$ CREATE PROCEDURE ProcInsertarCliente (in accion INTEGER, nombre_cte VARCHAR(50), rfc_cte CHAR(13), out saludo CHAR(10), out maximo INTEGER ) BEGIN DECLARE valor INTEGER; SET AUTOCOMMIT = 0; SELECT MAX(num_cte) FROM clientes INTO maximo; #comentario SELECT MAX(num_cte) INTO maximo FROM clientes; #cul es el bueno? INSERT INTO clientes VALUES (' ', nombre_cte, rfc_cte); SET valor = 5; IF accion = 0 THEN ROLLBACK; SET saludo='desecho'; ELSE COMMIT; SET saludo='confirmado'; END IF; END $$ call ProcInsertarCliente(0,'LOLA','RFC939393LOL', @s, @m) HACER EN CONSOLA, SE VER QUE DE LOS SEIS REGISTROS INSERTADOS SLO QUE DARN LOS DOS QUE SE CONFIRMARON, PUES CUATRO DE DESHICIERON SET AUTOCOMMIT=0; INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR');
Pg 8

ROLLBACK; INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); COMMIT; INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); ROLLBACK; INSERT INTO CLIENTES VALUES('', 'CESARITO', 'CES808080SAR'); COMMIT; Procedimiento almacenado con Ciclos http://cassianinet.blogspot.com/2011/05/stored-procedure-en-mysql-parte1.html#axzz1m9DBTjfJ DELIMITER $$ DROP PROCEDURE IF EXISTS InsertaMuchos $$ CREATE PROCEDURE InsertaMuchos (in n INTEGER, out suma INT) BEGIN DECLARE i INT; SET i=1; SET suma = 0; WHILE i<=n DO INSERT INTO yy VALUES(i, i*1000+i); set suma = suma + i; Set i = i + 1; END WHILE; END $$

call InsertaMuchos(10, @suma); select @suma;

Para hacer una llamada a un procedimiento almacenado usaremos la sentencia call: call introducePersona(25,JoseManuel); Una vez tenemos ya nuestro procedimiento simplemente lo ejecutaremos desde PHP mediante una llamada como esta: $nombre = $_POST['nombre']; $edad = $_POST['edad']; mysql_query('call introducePersona(' . $edad . ' , " '.$nombre. ' "); ');

Pg 9

TAREA: CREAR LAS SIGUIENTES FUNCIONES/PROCEDIMIENTOS ALMACENADOS EN LA BASE DE DATOS PUNTODEVENTA: - FUNCION QUE DEVUELVA CUNTOS CLIENTES HAY EN LA TABLA CLIENTES - FUNCIN QUE RECIBA DE PARAMETRO EL NUMERO DE CLIENTE, Y DEVUELVA EL NOMBRE DE ESTE CLIENTE - PROCEDIMIENTO QUE RECIBA DE PARMETRO EL NUMERO DE CLIENTE, Y DEVUELVA EL NOMBRE Y EL RFC DE ESTE CLIENTE - LOS MISMOS TRES ANTERIORES PERO PARA LA TABLA ARTICULOS - PROCEDIMIENTO ALMACENADO QUE INSERTE UN REGISTRO EN LA TABLA VENTAS, RECIBE DE PARAMETRO EL NUMERO DE CLIENTE, EL ID_VTA ES AUTOMTICO, Y LA FECHA USE LA FUNCION CURRENTDATE(). - Sa -

http://www.nosolocodigo.com/como-crear-funciones-en-mysql

Uso de las variables en funciones:


Las variables en las funciones se usan de igual manera que en los procedimientos almacenados, se declaran con la sentencia DECLARE, y se asignan valores con la sentencia SET.
DELIMITER // CREATE FUNCTION holaMundo() RETURNS VARCHAR(30) BEGIN DECLARE salida VARCHAR(30) DEFAULT 'Hola mundo'; ; SET salida = Hola mundo con VARIABLES; RETURN salida; END //

Esta variable es de mbito local, y ser destruida una vez finalice la funcin. Cabe destacar el uso de la sentencia DEFAULT en conjunto con DECLARE, que asigna un valor por defecto al declarar la variable.

Uso de parmetros en funciones:


DROP FUNCTION IF EXISTS holaMundo CREATE FUNCTION holaMundo(entrada VARCHAR(20)) RETURNS VARCHAR(20) BEGIN DECLARE salida VARCHAR(20); SET salida = entrada; RETURN salida;
Pg 10

END

Ahora hemos creado una funcin que devuelve el mismo valor que le pasamos como parmetro. Obtenemos como resultado lo mismo que le hemos pasado como prametro, en este caso nosolocodigo Para finalizar, algo un poco ms complejo, vamos a crear una funcin que acepte un dividendo y un divisor y haga una divisin sin usar el operador divisin:
CREATE FUNCTION divide(dividendo int,divisor int) returns int begin declare aux int; declare contador int; declare resto int; SET contador = 0; SET aux = 0; while (aux + divisor) &lt;= dividendo do SET aux = aux + divisor ; SET contador = contador + 1; end while; SET resto = dividendo - aux ; RETURN contador; end; //

Para usarlo, simplemente llamaramos a la funcin as:


SELECT divide(20,2)

Lo que devolvera 10.

DELIMITER | CREATE FUNCTION FUNCION_01(NUM INT) RETURNS TEXT BEGIN CASE NUM WHEN 1 THEN RETURN UNO; WHEN 2 THEN RETURN DOS; WHEN 3 THEN RETURN TRES; WHEN 4 THEN RETURN CUATRO; WHEN 5 THEN RETURN CINCO; WHEN 6 THEN RETURN SEIS; WHEN 7 THEN RETURN SIETE; END CASE; END DELIMITER |

Pg 11

Estoy esperando sus tareas (lo que hayan trado, aunque no haya funcionado, aunque tenga faltas de ortografa) -mysql y .net (bsico,verde) -bases de datos, diseo e implementacin (grande, blanco) http://dev.mysql.com/doc/ref man/5.1/en/storedprograms-logging.html

Pg 12

http://dev.mysql.com/doc/ref man/5.0/es/index.html captulo 18.7 SELECT * FROM CLIENTES WHERE NUM_CTE<50 SELECT NUM_CTE,RFC_CTE FROM CLIENTES SELECT * FROM CLIENTES WHERE NOMBRE_CTE LIKE 'P %'
Pg 13

SELECT * FROM CLIENTES WHERE NUM_CTE>=2 AND NUM_CTE<=5 SELECT * FROM CLIENTES WHERE NUM_CTE BETWEEN 2 AND 5 SELECT NUM_CTE AS ID FROM CLIENTES SELECT COUNT(*) AS TOTAL FROM CLIENTES
Pg 14

SELECT MAX(NUM_CTE) AS MAYOR FROM CLIENTES


CONSULTA QUE MUESTRE EL PROMEDIO DE LOS PRECIOS Y LA SUMA DE LAS EXISTENCIAS: SELECT AVG(PRECIO_ART) AS PROMEDIO, SUM(EXISTENCIA_ART) AS TOTALES FROM ARTICULOS
PROCEDIMIENTO ALMACENADO QUE RECIBA DE PARM EL NOMBRE Y EL RFC DEL CLIENTE, Y LO INSERTE EN LA TABLA DE CLIENTES, SIEMPRE Y CUANDO NO SE LLAME PEPITO Insert into tabla values(v1,v2,v3.)
Pg 15

EJEMPLOS BSICOS DE TRANSACCIONES


PROCEDIMIENTO ALMACENADO CON (2) PARAMETROS DE SALIDA Y TRANSACCIONES DELIMITER $$ DROP PROCEDURE IF EXISTS ProcCreaTransaccion $$ CREATE PROCEDURE ProcCreaTransaccion (IN numventa INT, numart INT, cantidad FLOAT, OUT bandera INT, OUT mensaje VARCHAR(100) ) BEGIN #DECLARACION DE VARIABLES DECLARE precio, importe, existenciaactual FLOAT; DECLARE numconsec INT; #SET AUTOCOMMIT = 0; #CALCULA DATOS SET existenciaactual=0.0; SET numconsec =0; SELECT precio_art,existencia_art INTO precio,existenciaactual FROM articulos WHERE id_art=numart; #CALCULA CAMPOS DE LA TRANSACCION SET importe=precio*cantidad; SELECT COUNT(consec_vta) INTO numconsec FROM ventasdetalle WHERE id_vtadet=numventa; IF (numconsec=0) then SET Numconsec=1; ELSE SELECT MAX(consec_vta) INTO numconsec FROM ventasdetalle WHERE id_vtadet=numventa; SET Numconsec=numconsec+1; END IF; #AFECTA A TABLAS START TRANSACTION; INSERT INTO ventasdetalle VALUES (numventa, numconsec, numart, cantidad, precio, importe); SET existenciaactual=existenciaactual-cantidad; UPDATE articulos SET existencia_art = existenciaactual WHERE id_art=numart; #EN CASO DE ERROR DESHACER IF (existenciaactual < 0) THEN ROLLBACK; SET bandera=1; SET mensaje='No se insert porque la existencia no puede quedar negativa.'; ELSE #SI NO HAY ERROR CONFIRMAR COMMIT; SET bandera=0; SET mensaje='Transaccin aplicada.'; END IF;
Pg 16

END $$ call ProcCreaTransaccion( 3, 3,1, @band , @mensaje); #idvta,art,cant select @band, @mensaje;

PROCEDIMIENTO ALMACENADO QUE LE PASAMOS EL NUM. DE CLIENTE, Y NOS DEVUELVE SU NOMBRE Y SU RFC
EVALUACION PARA EL MARTES: DEL SISTEMA EN PHP QUE HA SE HIZO, YA EST EL MEN DEL ADMINISTRADOR, AHORA HACER LA OPCIN DE VENTAS PARA EL CAJERO. REQUERIMIENTOS: CUANDO HAGA UNA NUEVA VENTA: -INSERTAR UN REGISTRO EN LA TABLA VENTAS, SELECCIONANDO UN CLIENTE DE UNA LISTA, E INSERTANDO FECHA ACTUAL -DE LA VENTA QUE SE EST REALIZANDO, SELECCIONAR UN ARTCULO Y CREAR UN REGISTRO EN LA TABLA VENTASDETALLE, Y DISMINUIR LA CANTIDAD A LA EXISTENCIA DEL ARTCULO (Con procedimiento almacenado) -AL DAR LA OPCIN DE PAGAR, QUE SE MUESTRE EL TOTAL DE LA VENTA (Con funcin)

Pg 17

FACTURA 42423 CLIENTE: EDGAR PERALES FECHA: 15-JULIO-2010 CACAHUATES SABRITAS PISTACHES CERVEZA SOL HAMBURGUESA 3 $10 1 $8 2 5 6 10 2 22 TOTAL $30 $8 $10 $60 $44 $154

-ENTREGAR SU TRABAJO EN UNA CARPETA LLAMADA: BDU34Nombre, ejemplo: BDU34Lupita (Si no lo terminaron, lo que tengan) -Lo que no se entregue hoy, ser de recuperacin -Fecha lmite de entrega para recuperacin el mircoles 28 de JULIO (con el respectivo recibo) -Sus funciones/procedimientos almacenados ponerlos en un archivo de texto

Pg 18

Creacin de Reporte mediante Crystal/Reports

CONCURRENCIA: CUANDO MS DE UN PROCESO INTENTA ACCESAR AL MISMO DATO AL MISMO TIEMPO LLAMADO A FUNCIONES/PROC.ALMACENADOS DESDE UN LENGUAJE DE PROGRAMACIN: HOMEWORK: TRAER UN PROC. ALMACENADO QUE DEVUELVA 2 PARMS SER EL SIGUIENTE: RECIBE DE PARM DE ENTRADA EL NUM. DE CLIENTE Y DEVUELVE EL NOMBRE Y EL RFC

Pg 19

Estructuras de control en Transact SQL

Estructura condicional IF
La estuctura condicional IF permite evaluar una expresion booleana (resultado SI - NO), y ejecutar las operaciones contenidas en el bloque formado por BEGIN END.
IF (<expresion>) BEGIN ... END ELSE IF (<expresion>) BEGIN ... END ELSE BEGIN ... END

Ejemplo de la estructura condicional IF.


DECLARE @Web varchar(100), @diminutivo varchar(3) SET @diminutivo = 'DJK' IF @diminutivo = 'DJK' BEGIN PRINT 'www.devjoker.com' END

ELSE BEGIN PRINT 'Otra Web (peor!)' END

La estructura IF admite el uso de subconsultas:


DECLARE @coPais int, @descripcion varchar(255) set @coPais = 5 set @descripcion = 'Espaa' IF EXISTS(SELECT * FROM PAISES WHERE CO_PAIS = @coPais) BEGIN UPDATE PAISES SET DESCRIPCION = @descripcion WHERE CO_PAIS = @coPais
Pg 20

END ELSE BEGIN INSERT INTO PAISES (CO_PAIS, DESCRIPCION) VALUES (@coPais, @descripcion)

END

Estructura condicional CASE


La estructura condicional CASE permite evaluar una expresion y devolver un valor u otro. La sintaxis general de case es:
CASE <expresion> WHEN <valor_expresion> THEN <valor_devuelto> WHEN <valor_expresion> THEN <valor_devuelto> ELSE <valor_devuelto> -- Valor por defecto END

Ejemplo de CASE.

DECLARE @Web varchar(100), @diminutivo varchar(3) SET @diminutivo = 'DJK' SET @Web = (CASE @diminutivo WHEN 'DJK' THEN 'www.devjoker.com' WHEN 'ALM' THEN 'www.aleamedia.com' ELSE 'www.devjoker.com' END) PRINT @Web

Otra sintaxis de CASE nos permite evaluar diferentes expresiones:


CASE

WHEN <expresion> = <valor_expresion> THEN <valor_devuelto> WHEN <expresion> = <valor_expresion> THEN <valor_devuelto> ELSE <valor_devuelto> -- Valor por defecto

END

El mismo ejemplo aplicando esta sintaxis:


DECLARE @Web varchar(100), @diminutivo varchar(3) SET @diminutivo = 'DJK'
Pg 21

SET @Web = (CASE WHEN @diminutivo = 'DJK' THEN 'www.devjoker.com' WHEN @diminutivo = 'ALM' THEN 'www.aleamedia.com' PRINT @Web END) ELSE 'www.devjoker.com'

Otro aspecto muy interesante de CASE es que permite el uso de subconsultas.


DECLARE @Web varchar(100), @diminutivo varchar(3) SET @diminutivo = 'DJK' SET @Web = (CASE WHEN @diminutivo = 'DJK' THEN (SELECT web FROM WEBS WHERE id=1) WHEN @diminutivo = 'ALM' THEN (SELECT web FROM WEBS WHERE id=2) ELSE 'www.devjoker.com'

PRINT @Web

END)

Bucle WHILE
El bucle WHILE se repite mientras expresion se evalue como verdadero. Es el nico tipo de bucle del que dispone Transact SQL.
WHILE <expresion> BEGIN ... END

Un ejemplo del bucle WHILE.


DECLARE @contador int SET @contador = 0 WHILE (@contador < 100) BEGIN SET @contador = @contador + 1 PRINT 'Iteracion del bucle ' + cast(@contador AS varchar)
Pg 22

END

Podemos pasar a la siguiente iteracin del bucle utilizando CONTINUE.


DECLARE @contador int SET @contador = 0 WHILE (@contador < 100) BEGIN SET @contador = @contador + 1 IF (@contador % 2 = 0) CONTINUE PRINT 'Iteracion del bucle ' + cast(@contador AS varchar) END

El bucle se dejar de repetir con la instruccin BREAK.


DECLARE @contador int SET @contador = 0 WHILE (1 = 1) BEGIN SET @contador = @contador + 1 IF (@contador % 50 = 0) BREAK PRINT 'Iteracion del bucle ' + cast(@contador AS varchar) END

Tambin podemos utilizar el bucle WHILE conuntamente con subconsultas.


DECLARE @coRecibo int WHILE EXISTS (SELECT * FROM RECIBOS WHERE PENDIENTE = 'S')-- Ojo, la subconsulta se ejecuta -- una vez por cada iteracion -- del bucle! BEGIN SET @coRecibo = (SELECT TOP 1 CO_RECIBO FROM RECIBOS WHERE PENDIENTE = 'S') UPDATE RECIBOS SET PENDIENTE = 'N' WHERE CO_RECIBO = @coRecibo END

Estructura GOTO
La sentencia goto nos permite desviar el flujo de ejecucin hacia una etiqueta. Fu muy utilizada en versiones anteriores de SQL Server conjuntamente con la variable de sistema @@ERROR para el control de errores.
Pg 23

Actualmente, se desaconseja el uso GOTO, recomendandose el uso de TRY - CATCH para la gestion de errores.
DECLARE @divisor int, @dividendo int, @resultado int SET @dividendo = 100 SET @divisor = 0 SET @resultado = @dividendo/@divisor IF @@ERROR > 0 GOTO error PRINT 'No hay error' RETURN error: PRINT 'Se ha producido una division por cero'

Pg 24

Cuando desarrollamos una aplicacin tenemos (por seguridad) que estar atentos con las validaciones, evitar que el usuario tenga que introducir la menor cantidad de datos posibles. Es necesario tratar de reducir la carga del servidor, dividir el trabajo, conseguir la manera mas eficaz de llevar a cabo los procedimientos, etc. Podemos reducir el tiempo de desarrollo, el mantenimiento de los sistemas, evitar hacer peticiones de grandes cantidades de datos, si la lgica ms relevante la dejamos del lado de los gestores de base de datos, especficamente, usando los stored procedure (procedimientos almacenados). Lo procedimientos almacenados son soportados en MySQL desde la versin cinco (5), un stored procedure es una rutina que puede ser llamada en cualquier momento y que se encuentra almacenada dentro de la base de datos, pudiendo validar datos de entrada, utilizar cualquier valor de la base de datos, devolver solo lo que la misma permita y adems, ser usado por cualquier lenguaje de programacin; lo que significa que si tienes un sistema desarrollado en PHP y que ejecuta cierto procedimiento almacenado, no estas atado a que solo lo puedas llamar desde ese lenguaje, si no que puedes usar otros como, JAVA, ASP.NET, etc .

Comenzando con los stored procedure Antes de todo hay que seleccionar la base de datos que almacenar los procedimientos:
USE nombre_base_de_datos

En MySQL las sentencias se ejecutan luego de escribir el signo punto y coma (;), es por eso que cuando introducimos una sentencia el prompt sigue apareciendo:
mysql> show databases -> ->

hasta que no coloquemos el punto y coma (;) [delimitador por defecto] seguir esperando que introduzcas nuevos datos, como dentro de los procedimientos almacenados necesitamos de ese carcter especial (punto y coma), hay que indicarle a MySQL que temporalmente NO lo use como carcter delimitador, eso lo haremos usando la sentencia DELIMITER:
DELIMITER nuevo_caracter

ejemplo:
mysql> DELIMITER < mysql> show databases < +--------------------+ | Database | +--------------------+ | information_schema | | dbprueba |
Pg 25

| mysql | +--------------------+ 4 rows in set (0.00 sec)

nota Luego de programado el procedimiento, lo recomendable es regresar al carcter punto y coma (;) su funcin de DELIMITADOR y eso lo haces de la misma manera: DELIMITER ;

Quienes han programado en Pascal notaran cierta semejanza con ese lenguaje a la hora de armar el store procedure. Dentro del procedimiento podras hacer uso de los bloques de control de flujo de datos que nos permitirn determinar el orden en el que se ejecutarn las instrucciones, bloques (IF, While, Repeat - Until, Labe Loop, CASE, etc.). Las sentencias que podemos usar dentro de los procedimientos son: INSERT, UPDATE, SELECT, DROP, CREATE, REPLACE. Por otro lado, no podemos usar: - CREATE PROCEDURE, ALTER PROCEDURE, DROP PROCEDURE - CREATE FUNCTION, DROP FUNCTION - CREATE TRIGGER, DROP TRIGGER Existen dos tipos de procedimientos almacenados: - procedure: se limita a ejecutar las instrucciones cuando es llamada, no devuelve un valor directamente, pero se pueden establecer valores en variables que puedan ser accedidas luego del que el procedimiento haya culminado su ejecucin (ver variables de usuarios). - function: se usa para que cuando adems de ejecutar determinadas instrucciones, retorne un valor (solo uno) que pueda ser usado luego en alguna expresin. Para crear un procedimiento la sintaxis es la siguiente:
mysql> create procedure nombre_del_procedimiento () -> begin /* indica el inicio de la rutina */ -> /* aqui va el contenido */ -> end /* indica el fin de la rutina */; Query OK, 0 rows affected (0.06 sec) mysql> delimiter < mysql> create function saludo () returns char(5)
Pg 26

-> begin -> return 'hola'; -> end <

Para llamar a un procedimiento usamos la sentencia call:


mysql> call nombre_del_procedimiento();

y para llamar a una funcin, lo hacemos con select:


mysql> select saludo(); +------------+ | + saludo() | +------------+ | hola | +------------+

Antes de crear un procedure es recomendable verificar si existe algn procedimiento con los mismo nombre y de ser as, eliminarlo, eso lo hacemos usando DROP:
DROP PROCEDURE IF EXISTS Nombre_procedimiento

Los comentarios dentro de los procedimientos pueden hacerse de la siguiente manera:


# comentario con almohadilla (solo una linea) -- comentario con 2 guiones (solo una linea) /* esto es un comentario multilinea

*/

Para declarar una variable, de la siguiente manera:


declare Variable tipo_de_dato; -- tipo_de_dato -> int, char, varchar ..

Asignando valores a las variables:


set variable = VALOR ; -- valor de acuerdo al tipo de dato

Estructuras de control de flujo: 1.- Bloque IF


IF expresin THEN -- que hacer en caso correcto ELSE -- que hacer en caso contrario END IF; -- necesario para cerrar el bloque
Pg 27

podemos usar el ELSIF, ejemplo:


IF (Num = 1) THEN -- .. ELSEIF (Num = 2) THEN -- .. ELSEIF (Num = 3) THEN -- .. ELSE -- .. END IF;

2.- Ciclos/loop (While)


WHILE expresin DO -- contenido del bucle END WHILE;

3.- Ciclos/loop (Repeat - Until)


REPEAT -- CODE DEL BUCLE UNTIL variable >= 1 END REPEAT;

4.- Ciclos/loop (etiqueta : Loop)


ETIQUETA : LOOP -- code del bucle IF variable >= VALOR THEN LEAVE ETIQUETA; -- se ejecuta hasta encontrar esto END IF; END LOOP;

Donde ETIQUETA es una cadena de caracteres cualquiera. Para el caso de este bucle, su cdigo se ejecutara hasta que se encuentre la sentencia LEAVE ETIQUETA cuyo objetivo es similar a la funcin que cumple BREAK en algunos lenguajes de programacin. Funciones de control de flujo 1.- funcin IF (if en una sola lnea): es similar al IFF de visual basic6. - sintaxis: IF(expresin1,expr1,expr3) --> devuelve expr2 si se cumple la expresin1, sino, devuelve expr3, ejemplo:
SET @valor =IF (5<5,1,0); SELECT @valor; -- devuelve 0 porque 5 no puede ser menor que 5 .. SELECT IF(1>2,'uno ES mayor que dos','uno NO es mayor que dos') as Resultado; +-------------------------+ | Resultado | +-------------------------+
Pg 28

| uno No es mayor que dos | +-------------------------+

2.- CASE (similar al SWITCH o SELEC CASE de algunos lenguajes de programacin)


CASE variable WHEN 1 THEN WHEN 2 THEN WHEN x THEN ELSE -- que END CASE; -- que hacer en caso -- que hacer en caso -- que hacer en caso hacer en caso de que de de de no que variable = 1 que variable = 2 que variable = x Valor se presente alguno de los casos anteriores

3.- IFNULL - sintaxis: IFNULL(expr1,expr2) --> si la primera expresin (expr1) es NULL, devuelve expr1, sino, devuelve expr2.
SELECT IFNULL(NULL,6); -- devuelve 6 SELECT IFNULL(1/0,10); --> devuelve 10

4.- NULLIF - sintaxis: NULLIF(expresin1,expresin2) --> devuelve NULL si las dos expresiones son iguales, sino, devuelve la expresin1.
SELECT NULLIF(1,1); -- devuelve NULL SELECT NULLIF(1,2); -- devuelve 1

Los parmetros La lista de parmetros es lo que est entre parntesis inmediatamente despus del nombre del procedimiento almacenado y pueden ser IN, OUT y INOUT. - IN: es opcional colocarlo, puedes no indicar que tipo de argumento usaras y por defecto se tomara como IN (entrada). Los valores que tomen las variables de este tipo no se conservaran una vez termine de ejecutarse el procedimiento.
DROP PROCEDURE IF EXISTS ejemplo; DELIMITER // CREATE PROCEDURE ejemplo(IN id INT) BEGIN -- el parametro es IN (solo de entrada), no se podra acceder a su valor luego -- de que termine el procedimiento. -- se concatenan dos campos y se muestra el resultado SELECT CONCAT(apellido,' ',nombre) as Nombre_Completo FROM usuarios WHERE idusuario=id; END// DELIMITER ; -- mostrara el registro de id 2 CALL ejemplo(2);
Pg 29

- OUT: los valores de este tipo de argumentos se establecen dentro del procedimiento y pueden ser accedidos mas adelante, aun cuando la ejecucin del procedimiento haya terminado.
DROP PROCEDURE IF EXISTS ejemplo; DELIMITER // CREATE PROCEDURE ejemplo ( -- recibe la variable de usuario donde se almacenara el resultado OUT total INT ) BEGIN -- calculamos el numero de registros y los almacenamos en la variable de usuario SELECT COUNT(*) INTO total FROM usuarios; END// DELIMITER ; -- llamamos al procedimiento indicandole donde almacenara el resultado (@mi_variable) call ejemplo(@mi_variable); -- ahora podemos acceder a @mi_variable cuando lo deseemos SELECT @mi_variable;

En este ltimo ejemplo hicimos uso de la sentencia SELECT .. INTO .., que permite almacenar en determinadas variables, el resultado de determinadas columnas. - INOUT: una combinacin de las dos anteriores, la variable puede recibir valores de entrada y puede ser accedida mas adelante .
DROP PROCEDURE IF EXISTS ejemplo; DELIMITER // CREATE PROCEDURE ejemplo ( -- recibe la variable de usuario donde se almacenara el resultado -- puede trabajar con el valor recibido por parmetro -- el valor actualizado de la variable puede ser accedida en cualquier momento INOUT var INT ) BEGIN SET var := var + 6; END// DELIMITER ; -- inicializamos la variable SET @mi_variable := 4; -- llamamos al procedimiento indicandole donde almacenara el resultado (@mi_variable) call ejemplo(@mi_variable); -- ahora podemos acceder a @mi_variable cuando lo deseemos -- devuelve 10 ya que se actualizo su valor dentro del procedure SELECT @mi_variable;

Pg 30

Ejemplo prctico: Clic aqu para mostrar/ocultar el cdigo

Fuentes: conclase.net mysql.com wikipedia.org Fuente: Cassianet >> http://cassianinet.blogspot.com/2011/05/stored-procedure-en-mysqlparte-1.html#ixzz1m9HLFczp

Pg 31

SET AUTOCOMMIT=0; delete from xx where a=9; delete from xx where a=8; ROLLBACK; #deshacer delete from xx where a=7; COMMIT; #confirmar delete from xx where a=6; ROLLBACK; delete from xx where a=5; COMMIT;

Pg 32

DELIMITER $$ DROP PROCEDURE IF EXISTS insertaxx $$ CREATE PROCEDURE insertaxx () BEGIN DECLARE ultimo INT; SELECT MAX(a) INTO ultimo FROM xx; SET ultimo = ultimo + 1; INSERT INTO xx VALUES(ultimo, ultimo); END $$

Pg 33

Ejercicio de hoy (lunes 12 de marzo de 2012) Procedimiento almacenado Recibe un parm y crea el registro Si el parm es <500, deshacer De lo contrario, confirmarlo El parm se lo pasa el programa, ser un numero aleatorio entre 200 y 1000

Pg 34

MISIN PARA 60% DE EVALUACION DE UNIDAD 3: - CREAR UNA TABLA QUE SE LLAME CUENTAS (NUMERO INT (LLAVE), TITULAR CHAR(50), SALDO DOUBLE, ESTADO CHAR(1) ) - CREAR OTRA TABLA QUE SE LLAME MOVIMIENTOS (NUMERO INT (LLAVE), FOLIO INT (LLAVE), TIPOMOV CHAR(1), MONTO DOUBLE ) PROGRAMA QUE MUESTRE UNA FORMA CON LA SIMULACIN DE UN CAJERO AUTOMTICO, CADA QUIEN PUEDE DARLE EL DISEO PARTICULAR PARA FACILIDAD DE USO DEL USUARIO: -PIDE LA CUENTA CON LA QUE SE VA A TRABAJAR -EL SALDO DE LA CUENTA EN UNA CAJA DE TEXTO -Y UN GRID CON SUS MOVIMIENTOS -BOTON PARA DEPOSITAR (LO DE UNA CAJA DE TEXTO) EL DEPOSITO SERA UN MOVIMIENTO EN LA TABLA MOVIMIENTOS DE TIPO E, EL FOLIO SERA CALCULADO EL SIGUIENTE, Y RECALCULAR SALDO Y REFRESCARLO EN PANTALLA -BOTON PARA RETIRO (LO DE LA CAJA DE TEXTO) EL DEPOSITO SERA UN MOVIMIENTO EN LA TABLA MOVIMIENTOS DE TIPO S, EL FOLIO SERA CALCULADO

Pg 35

EL SIGUIENTE, Y RECALCULAR SALDO Y REFRESCARLO EN PANTALLA RESTRICCIONES: -SI EL SALDO ES MENOR A LO QUE SE QUIERE RETIRAR, NO SE PUEDE HACER EL MOVIMIENTO, Y QUE MUESTRE UN MENSAJE EN LA PANTALLA -SI LA CUENTA ESTA CONGELADA (ESTADO=H) NO SE PUEDE HACER NINGUN MOVIMIENTO, Y QUE MUESTRE UN MENSAJE EN LA PANTALLA -CREAR UNA VARIABLE QUE TENGA VALORES ALEATORIOS ENTRE 0 Y 1 QUE LOS CALCULE UN TIMER CADA 5 SEG. PARA SIMULAR SI EL CAJERO TRABAJA CORRECTAMENTE O TIENE FALLA. SI AL MOMENTO DE HACER UNA OPERACIN LA VARIABLE VALE CERO (FALLA) SIGNIFICA QUE EL CAJERO NO TE PUDO DAR EL DINERO, POR LO TANTO DESHACER EL MOVIMIENTO Y REGRESAR EL SALDO, DE LO CONTRARIO, ENVIAR MENSAJE DE OPERACIN REALIZADA TODOS LOS MOVIMIENTOS EN LAS TABLAS, SERAN MEDIANTE PROCEDIMIENTO ALMACENADO

Pg 36

-MAIRA ENTREGA JUEVES A LAS 9AM EN EL CDS -CLARA, SILVA, PEDRO, EDGAR ENTREGAN JUEVES 12HRS O EN SU DEFECTO A PARTIR DE LAS 3PM EN EL CUBICULO -ANGELICA IGUAL QUE CLARA SILVA Y PEDRO. -CLAUDIA YO LO VEO CON ELLA.

Pg 37

Anda mungkin juga menyukai