Anda di halaman 1dari 9

InsertarregistrosenMYSQLconProcedimi entosalmacenadosyPHP

Hace poco publique un post titulado Insertar registros en MYSQL con PHP un amigo me sugiri que haga lo mismo con procedimientos almacenados, brevemente voy a explicar cmo hacerlo. Debo admitir que har lo mismo que en el post anterior pero con Procedimientos Almacenados. Y usaremos php para invocar este procedimiento y enviar los datos. En caso no tengan claro que es un procedimiento almacenado pueden leer ms en este enlace:http://es.wikipedia.org/wiki/Procedimiento_almacenado#Procedimientos_almacenados_en_MySQL Crear Base de Datos Planilla y Tabla empleado

Codigo:

Cdigo Fuente
--- Base de datos: `planilla` -CREATE DATABASE `planilla` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; USE `planilla`; --- Estructura de tabla para la tabla `empleado` -CREATE TABLE `empleado` ( `id_empleado` int(11) NOT NULL auto_increment, `nombre` varchar(150) NOT NULL, `apellido` varchar(150) NOT NULL, `telefono` varchar(20) NOT NULL, `cargo` varchar(100) NOT NULL, `sueldo` varchar(30) NOT NULL, PRIMARY KEY (`id_empleado`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; Creamos un procedimiento almacenado llamado: InsertarEmpleado en la Base de datos Creamos el procedimiento almacenado y lo nombramos InsertarEmpleado luego definimos parmetros de entrada, sabemos que son de entrada por que estn precedidos por IN Codigo Mysql:

Cdigo Fuente

CREATE procedure InsertarEmpleado(IN nombre varchar(150), IN apellido varchar(150), IN telefono varchar(20), IN cargo varchar(100), IN sueldo varchar(30)) --Creamos el query INSERT INTO empleado VALUES(id_empleado, nombre, apellido, telefono, cargo, sueldo); Nota: Observamos que en el Query del Procedimiento almacenado colocamos el id_empleado y no la consideramos en los parmetros, es necesario por ser la llave primaria, si no la colocamos saltara el error 1054 de Mysql, al ser esta columna de autoincremento en la base de datos no hay problema. Esto es importante! El siguiente paso es crear un formulario HTML formulario.html

Cdigo Fuente
<form id="form1" name="form1" method="post" action="guardar.php"> <p>Nombres: <br /> <input name="nombres" type="text" id="textfield" size="60 " /><br /> <p> Apellidos: <br /> <input name="apellidos" type="text" id="textfield" si ze="60" /> <p> Telefono: <br /> <input name="telefono" type="text" id="textfield" siz e="30" /> <p> Cargo : <br /> <input name="cargo" type="text" id="textfield" size=" 30" /> <p> Sueldo : <br /> <input type="text" name="sueldo" id="textfield" /> </p> <p> <input type="submit" name="button" id="button" value="Enviar" /> <br /> </p> </form> Ahora que hemos creado nuestra base de datos, procedimiento almacenado y formulario solo nos queda invocarlo desde nuestro cdigo php, esto es muy til pues nos permite reutilizar el procedimiento y no redundar cdigo innecesariamente, tambin aporta mucho en la performance de la aplicacin por razones que deben leer en el link de Wikipedia lneas arriba Ahora vamos al archivo guardar.php .

Cdigo Fuente
<? //Invocamos la cadena de conexin que se encuentra en el archivo conexion.php require ("conexion.php"); //Recibimos los parametros enviados mediante POST por el Formulario $nombre = $_POST["nombres"]; $apellido = $_POST["apellidos"]; $telefono = $_POST["telefono"]; $cargo = $_POST["cargo"]; $sueldo = $_POST["sueldo"]; //Invocamos el procedimiento almacenado, incluyendo los valores $insertar = mysqli_query($enlace,"call InsertarEmpleado('$nombre','$apellido','$telefono','$cargo','$sueldo')"); if (!$insertar){echo "Error al guardar";}else{echo "Guardado con exito";}

mysqli_close($enlace); ?> Eso es todo, cualquier duda o sugerencia no duden en escribir, les dejo la descarga:

Laboratorio: triggers y procedimientos almacenados en MySQL


foo ( MYSQL, mysql store procedure, mysql trigger )

Unas opciones no muy usadas cuando se trabaja con MySQL son los triggers y los procedimientos almacenados (stored procedures), supongo que a que es algo nuevo en MySQL y la gente no est acostumbrada a estas dos funcionalidades.

Vamos a mostrar un ejemplo de uso de triggers y procedimientos almacenados paso a paso. Quizs el ejemplo no sea el ms correcto, o simplemente sea poco til, pero lo importante es el uso en s, no el ejemplo.

Nuestro sistema tendr dos tablas, una con ventas y la otra con comisiones. En la primera se almacenarn cada venta que se realiza en un comercio, y en la segunda las comisiones que le corresponden a cada vendedor en el momento.

CREATE TABLE `ventas` ( `vendedor` int(11), `producto` int(11), `importe` float ) CREATE TABLE `comisiones` ( `vendedor` int(11), `comision` float )

Las comisiones se calcula de una forma especial, le corresponde un porcentaje de las ventas segn el tipo de producto, y es importante para los vendedores el que se sepa en cada momento qu comisiones lleva ganadas (esto es una justificacin para no usar un cron o algo parecido).

Para calcular qu comisin le corresponde a un vendedor, calcularemos los porcentajes para cada tipo de producto vendido y luego lo aadiremos/actualizaremos en la tabla de comisiones. Todo se realizar en un procedimiento almacenado.

DELIMITER $$ DROP PROCEDURE IF EXISTS `test`.`sp_comisiones`$$ CREATE PROCEDURE `test`.`sp_comisiones` (IN mivendedor INT) BEGIN DECLARE micomision INT DEFAULT 0; DECLARE suma INT; DECLARE existe BOOL; select IFNULL(sum(importe),0) into suma from ventas where producto = 1 and vendedor = mivendedor; SET micomision = micomision + (suma * 0.15); select IFNULL(sum(importe),0) into suma from ventas where producto = 2 and vendedor = mivendedor; SET micomision = micomision + (suma * 0.1); select IFNULL(sum(importe),0) into suma from ventas where producto = 3 and vendedor = mivendedor; SET micomision = micomision + (suma * 0.2); select count(1)>0 into existe from comisiones where vendedor = mivendedor; if existe then UPDATE comisiones set comision = comision+micomision where vendedor = mivendedor; else insert into comisiones (vendedor, comision) values (mivendedor, micomision); end if; END$$

DELIMITER ;

Ahora, para actualizar los datos de las comisiones usaremos un trigguer, as cuando se haga una venta (insert en la tabla ventas), se llamar al procedimiento almacenado (sp_comisiones), que recalcular la comisin para ese vendedor.

DELIMITER $$ DROP TRIGGER `test`.`tr_ventas_insert`$$ CREATE TRIGGER `test`.`tr_ventas_insert` AFTER INSERT on `test`.`ventas` FOR EACH ROW BEGIN call sp_comisiones(new.vendedor); END$$ DELIMITER ;

Procedimiento Almacenado y Estructuras de Control en MySQL WHILE, IF THEN ELSE, SWITCH


29DIC

6 Votes

Bien como ya hemos visto los procedimientos almacenados son muy interesantes, aqu no hemos visto estructuras de control, como lo son IF, SWITCH, WHILE,VARIABLES, etc y creo que es bueno comenzar con esta ultima. VARIABLES

DECLARE edad INT;

Esta tendr un mbito local y cuando se acabe el procedimiento no podr ser accedida. Una vez la variable es declarada, para cambiar su valor usaremos la sentencia SET como en el siguiente ejemplo:

SET edad = 56 ;

Para poder acceder a una variable a la finalizacin de un procedimiento se tiene que usar parmetros de salida como en el siguiente Cdigo: IF THEN ELSE

1 2 3 4
declare miVar int; /* se declara variable local */ /* se establece la variable */ delimiter // CREATE procedure miProc(IN p1 int) begin /* Parmetro de entrada */

5 6 7 8

SET miVar = p1 +1 ; IF miVar = 12 then

INSERT INTO lista VALUES(55555); else INSERT INTO lista VALUES(7665);

9
end IF;

10 11 12
SWITCH

end; //

delimiter //

1
CREATE procedure miProc (IN p1 int)

begin

3 4

declare var int ; SET var = p1 +2 ; case var

5
when 2 then INSERT INTO lista VALUES (66666);

6 7 8 9

when 3 then INSERT INTO lista VALUES (4545665); else INSERT INTO lista VALUES (77777777); end case; end; //

10 11 12
Creo que no hacen falta explicaciones. COMPARACIN DE CADENAS

1 2 3 4 5

delimiter // CREATE procedure compara(IN cadena varchar(25), IN cadena2 varchar(25)) begin IF strcmp(cadena, cadena2) = 0 then SELECT "son iguales!"; else

6 7 8 9

SELECT "son diferentes!!"; end IF; end; //

10
La funcin strcmp devuelve 0 si las cadenas son iguales, si no devuelve 0 es que son diferentes. USO DE WHILE

1 2 3
begin delimiter // CREATE procedure p14()

4 5 6 7 8

declare v int; SET v = 0; while v < 5 do INSERT INTO lista VALUES (v); SET v = v +1 ; end while;

9 10 11

end; //

Un while de toda la vida. USO DEL REPEAT

1 2 3

delimiter // CREATE procedure p15() begin declare v int;

4 5

SET v = 20; repeat

6 7

INSERT INTO lista VALUES(v); SET v = v + 1; until v <= 1

8
end repeat;

9 10 11 12

end; //

El repeat es similar a un do while de toda la vida