{"id":5453,"date":"2017-11-15T12:23:13","date_gmt":"2017-11-15T17:23:13","guid":{"rendered":"https:\/\/itsoftware.com.co\/content\/?p=5453"},"modified":"2019-11-19T10:46:38","modified_gmt":"2019-11-19T15:46:38","slug":"funciones-y-procedimientos-en-mysql","status":"publish","type":"post","link":"https:\/\/itsoftware.com.co\/content\/funciones-y-procedimientos-en-mysql\/","title":{"rendered":"Funciones y Procedimientos en MySQL &#8211; Definici\u00f3n y Usos"},"content":{"rendered":"<p>Las funciones y procedimientos en MySQL, permiten realizar ciertas acciones directamente desde el motor de la base de datos, como b\u00fasquedas, inserciones, modificaciones, c\u00e1lculos intermedios,etc.\u00a0 de forma independiente del c\u00f3digo de un sistema.<\/p>\n<figure id=\"attachment_5454\" aria-describedby=\"caption-attachment-5454\" style=\"width: 569px\" class=\"wp-caption aligncenter\"><img fetchpriority=\"high\" decoding=\"async\" class=\" wp-image-5454\" src=\"https:\/\/itsoftware.com.co\/content\/wp-content\/uploads\/2017\/11\/Funciones-y-procedimientos-en-MySQL.png\" alt=\"Funciones y procedimientos en MySQL\" width=\"569\" height=\"284\" \/><figcaption id=\"caption-attachment-5454\" class=\"wp-caption-text\">Funciones y procedimientos en MySQL<\/figcaption><\/figure>\n<p><!--more--><\/p>\n<p>El uso adecuado de las funciones y procedimientos en MySQL permite ser m\u00e1s \u00e1gil en la manipulaci\u00f3n de datos, directamente desde el motor de la base, haciendo m\u00e1s mantenible el c\u00f3digo del sistema, ya que las modificaciones sobre los datos se pueden realizar m\u00e1s f\u00e1cilmente sobre la fuente, y no sobre un c\u00f3digo que puede estar compilado.<\/p>\n<hr \/>\n<h2>Funciones en MySQL<\/h2>\n<hr \/>\n<p>Las funciones tienen como objetivo retornar alg\u00fan tipo de valor, por ejemplo devolver un n\u00famero entero o decimal, una cadena de texto, o un valor verdadero o positivo.<\/p>\n<p>Las funciones reciben datos de entrada a modo de par\u00e1metros que se definen entre par\u00e9ntesis, mientras que el tipo de dato que entrega se define luego de la palabra reservada RETURNS.<\/p>\n<p>Por ejemplo esta funci\u00f3n llamada <em><strong>pos_per<\/strong><\/em>, se encarga retornar una posici\u00f3n (valor entero bigint)\u00a0 en un rango de datos, los datos de entrada los recibe entre par\u00e9ntesis, recibiendo una fecha inicial (<em><strong>fi<\/strong> <\/em>varchar), una fecha final (<em><strong>ff<\/strong> <\/em>varchar) y un c\u00f3digo (<em><strong>cod_d<\/strong> <\/em>varchar) en formato de texto, y un valor entero (<em><strong>p<\/strong> <\/em>int). El cuerpo de la funci\u00f3n se inicia por la palabra reservada <strong>BEGIN<\/strong> y termina en <strong>END:<\/strong><\/p>\n<pre><strong>FUNCTION<\/strong> `pos_per`(`fi` varchar(30),`ff` varchar(30),`cod_d` varchar(40), `p` INT ) RETURNS bigint(20)\n\u00a0\u00a0\u00a0 DETERMINISTIC\nBEGIN\n\n\u00a0 DECLARE per BIGINT;\n\u00a0 SET per=0;\n\n--&gt; Consulta que entrega un solo resultado en la variable per\nSelect truncate( C.N*p\/100,0) INTO per from\n\u00a0\u00a0\u00a0 (\n\u00a0\u00a0\u00a0 Select Count(*) as N, cod_dircon from\n\u00a0\u00a0\u00a0\u00a0\u00a0 (\n\u00a0\u00a0\u00a0\u00a0\u00a0 select distinct (i.cod_dircon) as cod_dircon,r.subida,r.bajada from\n\u00a0\u00a0\u00a0\u00a0\u00a0 t_datos_identificacion i inner join (t_rates_vrf r right join t_servidor s on r.direccion_ip=s.ip_publica)\n\u00a0\u00a0\u00a0\u00a0\u00a0 on i.cod_dato_identificacion=s.cod_contrato\n\u00a0\u00a0\u00a0\u00a0\u00a0 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\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ) B\n\u00a0\u00a0\u00a0\u00a0 group by cod_dircon\n\u00a0\u00a0\u00a0\u00a0 ) C;\n\n-&gt;&gt; Valor entero que se retorna en la funci\u00f3n\nreturn per+1;\n\nEND;<\/pre>\n<div>En este ejemplo, luego de realizar una consulta sobre un conjunto de datos, se obtiene un solo valor entero, que se retorna en el llamado de la funci\u00f3n.<\/div>\n<div><\/div>\n<div>La funci\u00f3n puede ser llamada desde una consulta de la base de datos, o dentro de otra funci\u00f3n o procedimiento de MySQL.<\/p>\n<hr \/>\n<\/div>\n<div><\/div>\n<blockquote>\n<div><em>Tambi\u00e9n te puede interesar\u00a0<a href=\"https:\/\/itsoftware.com.co\/content\/que-es-y-para-que-sirve-mysql\/\" rel=\"bookmark\">\u00bfQu\u00e9 es y para que sirve MySQL Database?<\/a><\/em><\/div>\n<\/blockquote>\n<div><\/div>\n<div>\n<hr \/>\n<p>Para el ejemplo la funci\u00f3n podr\u00eda ser llamada de la siguiente forma:<\/p><\/div>\n<div><\/div>\n<pre>pos_per( '2015-03-12 00:00:00','2015-03-14 23:59:59',5 )<\/pre>\n<div><\/div>\n<div>MySQL tiene un sinn\u00famero de funciones incorporadas que permiten realizar muhcas otras operaciones sobre los datos, como por ejemplo operaciones matem\u00e1ticas, operaciones sobre cadenas de texto, etc.<\/div>\n<div><\/div>\n<div>\n<hr \/>\n<\/div>\n<h2>Procedimientos en MySQL<\/h2>\n<hr \/>\n<div><\/div>\n<div>Un procedimiento generalmente se encarga de realizar una acci\u00f3n sobre un conjunto de datos, ya sea para listarlos, borrarlos, modificarlos o agregar nuevos datos.<\/div>\n<div><\/div>\n<div>El procedimiento tambi\u00e9n recibe valores de entrada en forma de par\u00e1metros entre par\u00e9ntesis, pero no especif\u00edca un valor de retorno. Aunque tambi\u00e9n puede retornar valores en variables de tipo <strong>out<\/strong>.<\/p>\n<hr \/>\n<\/div>\n<div><\/div>\n<blockquote>\n<div><em>Tambi\u00e9n te podr\u00eda interesar leer\u00a0<a href=\"https:\/\/itsoftware.com.co\/content\/que-es-la-programacion-orientada-a-objetos\/\" rel=\"bookmark\">\u00bfQu\u00e9 es la Programaci\u00f3n Orientada a Objetos POO?<\/a><\/em><\/div>\n<\/blockquote>\n<div><\/div>\n<div>\n<hr \/>\n<p>En el ejemplo de abajo, el procedimiento se llama <em><strong>perc_baj<\/strong><\/em>,\u00a0 recibe par\u00e1metros de entrada como\u00a0fecha inicial (<em><strong>fi<\/strong> <\/em>varchar), fecha final (<em><strong>ff<\/strong> <\/em>varchar) y c\u00f3digo (<em><strong>cod_d<\/strong> <\/em>varchar) en formato de texto, y un valor entero (<em><strong>p<\/strong> <\/em>int), y entrega de salida adem\u00e1s un valor en formato de texto, en la variable <em><strong>out_valor.<\/strong><\/em><\/div>\n<div><\/div>\n<div>\n<pre><strong>PROCEDURE<\/strong> `perc_baj`(fi varchar(30), ff varchar(30),cod_d varchar(40), p INT , out valor varchar(20))\nbegin\n\nSET @_fi = fi;\nSET @_ff = ff;\nSET @_cod_d = cod_d;\nSET @_p = p-1;\nset @v='';\nset @c='';\n\nPREPARE stmt FROM \"select distinct (i.cod_dircon) as cod_dircon,r.bajada INTO @c,@v from\n\u00a0\u00a0\u00a0\u00a0\u00a0 t_datos_identificacion i inner join (t_rates_vrf r right join t_servidor s on r.direccion_ip=s.ip_publica)\n\u00a0\u00a0\u00a0\u00a0\u00a0 on i.cod_dato_identificacion=s.cod_contrato\n\u00a0\u00a0\u00a0\u00a0\u00a0 where r.fecha between str_to_date(?,'%Y-%m-%d %H:%i:%s') and str_to_date(?,'%Y-%m-%d %H:%i:%s')\n\u00a0\u00a0\u00a0\u00a0\u00a0 and i.cod_dircon=? order by r.bajada asc limit ?,1 \";\n\nEXECUTE stmt USING @_fi, @_ff, @_cod_d, @_p;\nDEALLOCATE PREPARE stmt;\n\nset valor=@v;\n\nend;<\/pre>\n<\/div>\n<div><\/div>\n<div>Este procedimiento se encarga de listar datos provenientes de una consulta, adem\u00e1s de devolver un resultado en la variable <strong><em>valor<\/em><\/strong>.<\/div>\n<div><\/div>\n<div>El procedimiento se llama precedido por la palabra clave <em><strong>call<\/strong><\/em>, por ejemplo:<\/div>\n<div><\/div>\n<div>\n<pre>set @a='';\ncall perc_baj( '2015-03-12 00:00:00','2015-03-14 23:59:59',5 ,@a);\nset valor=@a;<\/pre>\n<\/div>\n<div><\/div>\n<div>Aqu\u00ed se declara una variable <strong>@a<\/strong> que se encarga de recibir el valor de retorno del procedimiento.<\/div>\n<div>\n<hr \/>\n<\/div>\n<h2>Llamar procedimiento desde PHP<\/h2>\n<hr \/>\n<div>El procedimiento se puede llamar desde php m\u00e1s o menos de la siguiente forma:<\/div>\n<div><\/div>\n<div>\n<pre>&lt;?php\n\n$mysqli = new mysqli(\"182.1.8.1\",\"user\",\"pass\",\"db\");\n\n\nif (mysqli_connect_errno()) {\n  printf(\"&lt;br \/&gt;Connect failed: %s\\n\", mysqli_connect_error());\n  exit();\n}\n\nif ($mysqli-&gt;multi_query(\"call percentil('2015-03-01 00:00:00','2015-03-14 23:59:59',5);\")) {\n  if ($result = $mysqli-&gt;store_result()) {\n    while ($row = $result-&gt;fetch_assoc()) {\n    echo \"&lt;pre&gt;\";\n    print_r($row);\n  }\n  $result-&gt;close();\n  }\n}\n?&gt;<\/pre>\n<\/div>\n<div>Las funciones y procedimientos en MySQL facilitan realizar operaciones y c\u00e1lculos con los datos de la base, para que sean independientes del c\u00f3digo que las usa, o si se realizan directamente en una consulta SQL normal.<\/div>\n<div><\/div>\n<div>Este art\u00edculo hace parte del sistema de divulgaci\u00f3n de conocimiento de <a href=\"http:\/\/itsoftware.com.co\">ITSoftware SAS<\/a>.<\/div>\n<div><\/div>\n<h3>Si te gust\u00f3, por favor no te olvides compartirlo en las redes sociales. \ud83d\ude09<\/h3>\n<div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Las funciones y procedimientos en MySQL, permiten realizar ciertas acciones directamente desde el motor de la base de datos, como b\u00fasquedas, inserciones, modificaciones, c\u00e1lculos intermedios,etc.\u00a0 de forma independiente del c\u00f3digo[&#8230;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[97,1070,521],"tags":[1382,1383],"class_list":["post-5453","post","type-post","status-publish","format-standard","hentry","category-bases-de-datos","category-desarrollo-de-software","category-software","tag-funciones-mysql","tag-procedimientos-mysql"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/posts\/5453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/comments?post=5453"}],"version-history":[{"count":0,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/posts\/5453\/revisions"}],"wp:attachment":[{"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/media?parent=5453"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/categories?post=5453"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itsoftware.com.co\/content\/wp-json\/wp\/v2\/tags?post=5453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}