Casi puedo asegurar que ninguno de los que hemos tenido la oportunidad de trabajar con procedimientos almacenados y/o funciones, ya sea con MS SQL-Server o con cualquier otro manejador que soporte este tipo de objetos de datos, dudaríamos en reconocer el poder que estos objetos encierran, y el poder que le proveen a las aplicaciones que los utilizan.
-A continuación un par de links a Microsoft donde se comentan un par de características sobre los SPs: enlace 1, enlace 2.-
Desde hace unos cuantos años he estado trabajando en el desarrollo de aplicaciones web, fundamentalmente en entornos LAMP (linux, apache, mysql y php) y en ciertas ocasiones me sentí desesperado e incluso frustrado al no poder utilizar SPs en ellas.
La razón era porque no me había puesto a indagar como funcionaban y como controlarlos en MySQL.
En esta serie de artículos les explicaré lo que descubrí, y les daré ejemplos para que ustedes mismos puedan obtener el máximo provecho de sus datos mediante el uso de este versátil y poderoso objeto de datos, tan poco comentado en los foros y con tan poca decumentación práctica que los desarrolladores de nivel medio y básico quizás sólo prefieren pasarlos por alto y seguir su camino a través de sentencias SQL estáticas o a lo mucho, vistas.
En fín, espero que esta información sea de su provecho y gran utilidad ... si es así, no olviden dejar algún comentario :-) ... Un abrazo.
PRELIMINARES
El objetivo de este artículo es mas bien "inspirar" a los desarrolladores web de niveles medio y básico de aplicaciones basadas en LAMP oWAMP para que incursionen y profundicen un poco en los objetos de datos y la optimización de consultas hacia sus bases de datos, y bueno, si sirve también para dar algún aporte a algún desarrollador experimentado, pues ... excelente también, adelante!
En primer lugar, me gustaría dejar en la "atmósfera", algunas ideas o conceptos que más adelante profundizaremos:
1) Los procedimientos almacenados son sólo uno de varios objetos de datos que, en función de nuestras necesidades y objetivos específicos, aportarán un valor importante y poder a nuestras aplicaciones; pero existen otros: vistas, funciones, triggers, índices, relaciones, etc., que deberán ser también considerados eventualmente, como parte importante que son, de la optimización y eficiencia en la gestión de los datos en nuestras aplicaciones.
2) Los procedimientos almacenados pueden servir para varias tareas, entre otras: insertar, actualizar, eliminar, y consultar/extraer información de nuestra base de datos. Para los efectos prácticos de este artículo, nos enfocaremos sólo en los SPs de consulta parametrizada que devuelven un resultado en forma de "tabla" con datos condicionados de manera específica por los parámetros que le pasaremos a dicho procedimiento.
3) Profundizaré sólo lo mínimo necesario para mostrar los efectos del uso de los SPs, sin embargo; ustedes pueden continuar investigando tan profundamente como deseen, ya que luego de esto aún queda mucha tela que cortar en el tema de "objetos de datos", etc.
PRIMERA PARTE
En muchos blogs, foros y sitios sobre MySQL, hay ejemplos de cómo crear procedimientos almacenados; el problema está en que la mayoría se trata de crearlos desde la cónsola de "mysql>", cambiando el "delimiter" y luego ejecutarlos con un "Call" desde php. En fin ... creánme, no sé cuantas horas pasé tratando de que me funcionara "así de fácil" como lo pintan ... Y NADA!
Lo primero que debía entender es:
1) ¿qué es ese tal delimiter?
2) ¿por qué debo cambiarlo antes y después de crear el SP?
3) ¿puedo crear el SP desde phpmyadmin?
4) ¿cómo puedo crear el SP desde phpmyadmin y no desde la consola?
Bueno, en esta primera parte intentaré responder de manera clara y simple a esas "primeras" preguntas.
1) El delimiter, en términos sencillos, es el caracter que va a indicar a MySQL que hasta allí llega la instrucción o comando SQL que queremos ejecutar. Normalmente el delimiter es el ";".
Por ejemplo: si escribimos en la cónsola de mysql:
mysql> set names utf8; select now() as ahora;
Le estaremos indicando a mysql que se queremos ejecutar esas dos instrucciones, una detrás de la otra, pero se lo estamos indicando en una sóla linea ... separando las instrucciones con el delimiter ";".
2) El delimiter se debe cambiar antes de crear el SP ya que las instrucciones que utilizaremos en nuestro SP pudieran tener ";" como delimitador, pero como nuestra instrucción y objetivo principal es CREAR el SP, esta instrucción "CREATE PROCEDURE" debe tener también su delimitador particular, así pues al cambiar el delimiter antes de crear el SP, le estamos diciendo que para la instruccion CREATE PROCEDURE utilizaremos un delimitador diferente, y que dentro de nuestro procedimiento (ya sea un "select" o lo que sea) utilizaremos el delimitador normal ";" y así éste no afectará la creación del procedimiento indicando erróneamente a mysql que terminó la instrucción. -si no he sido muy claro en esta respuesta de todas formas lo veremos claramente cuando estemos creando el SP, más adelante.
3) Si, claro que se puede crear un SP desde phpmyadmin.
4) El secreto está en cambiar el valor del campo "delimiter" que está en la parte inferior-izquierda debajo del espacio de texto en el que creas el SQL. Podemos colocarle otro delimitador como "//" en lugar del ";" que tiene allí por defecto. Lo veremos más claramente cuando creemos el SP. Y desde luego debes tener habilitado los permisos en tu usuario de mysql para ejecutar instrucciones CREATE (pero si eres root, ni te preocupes por permisos).
SEGUNDA PARTE
Antes de proceder a crear el SP, hay algo importante que debemos saber (esto es algo que tuve que descubrir por mis propios medios ya que en ningún foro o blog estaba esta información). Cuando ejecutemos SPs desde php utilizaremos el comando "Call" en lugar de un "select" o lo que sea, y .... este comando "Call" no devuelve a php una tabla como lo hace un "select" normal, devuelve una estructura que php no puede manejar!
Más adelante comprenderán mejor qué es lo que exactamente trato de decir (entender esto fue lo que más tiempo me tomó a mí).
Bien, procederemos a probar "cómo se crea un procedimiento almacenado o stored proceduro o SP".
Indicaré los pasos uno a uno para asegurarnos de que todo funcione como se espera.
1) Ingresamos a phpmyadmin con el usuario root (o algún usuario que tenga permisos para CREAR procedimientos, tablas, etc.)
NOTA: Es importante trabajar en una versión reciente de phpMyAdmin, ya que la funcionalidad que te permite "ver" los procedimientos almacenados en tu base de datos es relativamente nueva así que si tu versión de phpMyAdmin es muy vieja, quizás no te funcionen las cosas como esperamos (yo uso para este artículo la versión 3.2.1 de phpMyAdmin y la versión 5.0 de MySQL).
2) Seleccionamos la base de datos sobre la cual haremos las consultas.
3) Nos colocamos en la pestaña "SQL" del phpMyAdmin.
4) En este punto yo normalmente "Construyo la consulta" utilizando valores fijos en las condiciones del "where", valores que luego cambiaré por los parámetros que recibirá el SP al ser invocado.
Para nuestro ejemplo práctico probamos el siguiente query:
Select concat ('Hola ', 'mi nombre!') as campo1;
El resultado será una tabla de un solo "campo" cuyo valor es "Hola mi nombre".
NOTA: El procedimiento que crearemos en lugar de 'mi nombre', colocará el parámetro que le pasaremos. Será realmente simple pero suficiente para lograr el objetivo de este artículo.
5) Estando en la pestaña "SQL" de phpMyAdmin, procedemos a cambiar el "delimiter". En el lugar donde está ";" colocaremos "//" (dos slash pegados sin comillas).
6) Una vez cambiado el delimiter, escribimos en el "área de texto" del "SQL" lo siguiente:
DROP PROCEDURE IF EXISTS miPrimerProcedimientoAlmacenado//
NOTA: El procedimiento que crearemos en lugar de 'mi nombre', colocará el parámetro que le pasaremos. Será realmente simple pero suficiente para lograr el objetivo de este artículo.
5) Estando en la pestaña "SQL" de phpMyAdmin, procedemos a cambiar el "delimiter". En el lugar donde está ";" colocaremos "//" (dos slash pegados sin comillas).
6) Una vez cambiado el delimiter, escribimos en el "área de texto" del "SQL" lo siguiente:
DROP PROCEDURE IF EXISTS miPrimerProcedimientoAlmacenado//
CREATE PROCEDURE miPrimerProcedimientoAlmacenado (pNombre varchar(20))
BEGIN
Set names utf8;
Select concat ('Hola ', pNombre) as campo1;
END//
ATENCIÓN: Observa acá la utilización tanto de un delimitador como del otro y revisa lo que comenté un poco antes en este artículo sobre el uso y el cambio del "delimiter". Es importante que veas la diferencia antes de seguir adelante.
Bien.-
7) Si todo ha salido bien hasta acá, hacemos clic en el botón "Go" o "Ejecutar". Y mysql nos muestra el mensaje: "Your SQL query has been executed successfully!"
lo cual significa, que hemos creado con éxito nuestro primer store procedure!Bien.-
7) Si todo ha salido bien hasta acá, hacemos clic en el botón "Go" o "Ejecutar". Y mysql nos muestra el mensaje: "Your SQL query has been executed successfully!"
Hasta aquí hemos creado nuestro SP utilizando phpMyAdmin, hemos comprendido el uso del delimitador al crear un SP y hemos aprendido un par de instrucciones nuevas ... pero .......
¿¿Y AHORA CÓMO HAGO PARA LLAMAR AL SP DESDE PHP Y MANIPULAR EL RESULTADO QUE SE SUPONE DEBE RETORNARME EN FORMA DE TABLA??
Estén pendientes a la próxima entrega de este artículo ... allí les mostraré cómo ...
¡Éxito!
Julio J.

