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
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
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
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
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
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 $$
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
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.
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) <= dividendo do SET aux = aux + divisor ; SET contador = contador + 1; end while; SET resto = dividendo - aux ; RETURN contador; end; //
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
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
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
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
END ELSE BEGIN INSERT INTO PAISES (CO_PAIS, DESCRIPCION) VALUES (@coPais, @descripcion)
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
WHEN <expresion> = <valor_expresion> THEN <valor_devuelto> WHEN <expresion> = <valor_expresion> THEN <valor_devuelto> ELSE <valor_devuelto> -- Valor por defecto
END
SET @Web = (CASE WHEN @diminutivo = 'DJK' THEN 'www.devjoker.com' WHEN @diminutivo = 'ALM' THEN 'www.aleamedia.com' PRINT @Web END) 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
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
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
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
*/
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
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
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