Las funciones y procedimientos en MySQL, permiten realizar ciertas acciones directamente desde el motor de la base de datos, como búsquedas, inserciones, modificaciones, cálculos intermedios,etc. de forma independiente del código de un sistema.
El uso adecuado de las funciones y procedimientos en MySQL permite ser más ágil en la manipulación de datos, directamente desde el motor de la base, haciendo más mantenible el código del sistema, ya que las modificaciones sobre los datos se pueden realizar más fácilmente sobre la fuente, y no sobre un código que puede estar compilado.
Funciones en MySQL
Las funciones tienen como objetivo retornar algún tipo de valor, por ejemplo devolver un número entero o decimal, una cadena de texto, o un valor verdadero o positivo.
Las funciones reciben datos de entrada a modo de parámetros que se definen entre paréntesis, mientras que el tipo de dato que entrega se define luego de la palabra reservada RETURNS.
Por ejemplo esta función llamada pos_per, se encarga retornar una posición (valor entero bigint) en un rango de datos, los datos de entrada los recibe entre paréntesis, recibiendo una fecha inicial (fi varchar), una fecha final (ff varchar) y un código (cod_d varchar) en formato de texto, y un valor entero (p int). El cuerpo de la función se inicia por la palabra reservada BEGIN y termina en END:
FUNCTION `pos_per`(`fi` varchar(30),`ff` varchar(30),`cod_d` varchar(40), `p` INT ) RETURNS bigint(20) DETERMINISTIC BEGIN DECLARE per BIGINT; SET per=0; --> Consulta que entrega un solo resultado en la variable per Select truncate( C.N*p/100,0) INTO per from ( Select Count(*) as N, cod_dircon from ( select distinct (i.cod_dircon) as cod_dircon,r.subida,r.bajada from t_datos_identificacion i inner join (t_rates_vrf r right join t_servidor s on r.direccion_ip=s.ip_publica) on i.cod_dato_identificacion=s.cod_contrato where r.fecha between str_to_date(fi,'%Y-%m-%d %H:%i:%s') and str_to_date(ff,'%Y-%m-%d %H:%i:%s') and i.cod_dircon=cod_d ) B group by cod_dircon ) C; ->> Valor entero que se retorna en la función return per+1; END;
También te puede interesar ¿Qué es y para que sirve MySQL Database?
Para el ejemplo la función podría ser llamada de la siguiente forma:
pos_per( '2015-03-12 00:00:00','2015-03-14 23:59:59',5 )
Procedimientos en MySQL
También te podría interesar leer ¿Qué es la Programación Orientada a Objetos POO?
En el ejemplo de abajo, el procedimiento se llama perc_baj, recibe parámetros de entrada como fecha inicial (fi varchar), fecha final (ff varchar) y código (cod_d varchar) en formato de texto, y un valor entero (p int), y entrega de salida además un valor en formato de texto, en la variable out_valor.
PROCEDURE `perc_baj`(fi varchar(30), ff varchar(30),cod_d varchar(40), p INT , out valor varchar(20)) begin SET @_fi = fi; SET @_ff = ff; SET @_cod_d = cod_d; SET @_p = p-1; set @v=''; set @c=''; PREPARE stmt FROM "select distinct (i.cod_dircon) as cod_dircon,r.bajada INTO @c,@v from t_datos_identificacion i inner join (t_rates_vrf r right join t_servidor s on r.direccion_ip=s.ip_publica) on i.cod_dato_identificacion=s.cod_contrato where r.fecha between str_to_date(?,'%Y-%m-%d %H:%i:%s') and str_to_date(?,'%Y-%m-%d %H:%i:%s') and i.cod_dircon=? order by r.bajada asc limit ?,1 "; EXECUTE stmt USING @_fi, @_ff, @_cod_d, @_p; DEALLOCATE PREPARE stmt; set valor=@v; end;
set @a=''; call perc_baj( '2015-03-12 00:00:00','2015-03-14 23:59:59',5 ,@a); set valor=@a;
Llamar procedimiento desde PHP
<?php $mysqli = new mysqli("182.1.8.1","user","pass","db"); if (mysqli_connect_errno()) { printf("<br />Connect failed: %s\n", mysqli_connect_error()); exit(); } if ($mysqli->multi_query("call percentil('2015-03-01 00:00:00','2015-03-14 23:59:59',5);")) { if ($result = $mysqli->store_result()) { while ($row = $result->fetch_assoc()) { echo "<pre>"; print_r($row); } $result->close(); } } ?>