La primera sorpresa que me llevé fue que con los procedimientos almacenados un select no es tan sencillo como un insert. Hay que usar cursores para realizarlo, al menos en Oracle. MySQL sí que permite hacer un select en un procedimiento, por lo que de momento no necesito un cursor en MySQL y dejaré ese tema para más adelante.
¿Qué es un cursor? Pues si no entendí mal es una herramienta para recorrer datos cuando necesitamos varios de ellos en una sola consulta. Parecido a un ciclo donde interamos sobre una matriz en programación.
La explicación no es la mejor pero pueden encontrar mucha información en estos enlaces:
http://www.techonthenet.com/oracle/cursors/declare.php
http://stackoverflow.com/questions/1170548/get-resultset-from-oracle-stored-procedure
http://stackoverflow.com/questions/3535405/execute-an-oracle-function-that-returns-a-reference-cursor-in-c-sharp
http://elbauldelprogramador.com/plsql-cursores/
http://www.desarrolloweb.com/articulos/cursores-pl-sql-I.html
https://es.wikibooks.org/wiki/Oracle/PL/SQL/Cursores
Los últimos son en español si te preocupa el idioma :)
Vamos a volver en Oracle a nuestra base de datos ejemplo1 y vamos a crear la tabla mascota (Lo siento, no se me ocurrió otra cosa). Esta tabla tiene dos columnas: amo que será una clave foránea y se corresponde con el nombre de la persona en la tabla ejemplo, nombre_mascota y tipo_mascota que definen la mascota que corresponde a cada amo.
Ahora que tenemos dos tablas para trabajar, vamos a crear un procedimiento almacenado que nos muestre el amo con la edad y el nombre de la mascota.
Para eso vamos a necesitar un cursor y yo les voy a mostrar la forma que conozco yo de momento para hacerlo en Oracle, pero no es la única. Nuevamente les remito a los enlaces de arriba.
La sintaxis sería esta (He puesto unos signos -- con notas aclaratorias):
create or replace procedure "amos_mascotas" --Nombre del procedimientoiscursor curs is --curs es el nombre del cursor. Pueden poner cualquiera.select nombre, edad, nombre_mascota -- Los datos que queremos verfrom ejemplo join mascota --Las tablas que unimos con joinon nombre = amo; --on es lo mismo que where :)begin -- Aquí comienza el procedimiento almacenadofor resultado in curs loop --Resultado es el iteradordbms_output.put_line ('Nombre: '|| resultado.nombre ||' Edad: '|| resultado.edad ||' Mascota: '|| resultado.nombre_mascota);end loop; --Aquí termina de iterarend;
¨Una forma de crearlo es yendo a create, procedure y desmarcar la opción include arguments. En la ventana que nos queda colocamos:
Podemos ejecutarlo en terminal usando execute o en la interfaz web poniendo el procedimiento entre begin y end, nuevamente si no sabes de qué hablo debes ir al tutorial anterior.
El resultado es este:
Y eso es todo con Oracle, para MySQL no necesitamos tanto lío para hacer un select así que el tutorial anterior les sirve. Más adelante cuando la base esté conectada a un programa sí que vamos a necesitar cursores en MySQL para iterar línea por línea los registros.