domingo, 22 de noviembre de 2015

Procedimientos almacenados (Parte 2): Select y cursores con Oracle

Aquí me estoy metiendo en camisas de once varas porque de este tema sólo se lo que aprendí entre ayer y hoy. Pero la idea es que estos apuntes me saquen de líos en algún momento y de paso, tal vez, sirvan como guía a alguien.
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.



Una vez hemos creado la segunda tabla le insertamos algunos datos desde terminal o por la interfaz web, como prefieras. Si no sabes cómo mira el tutorial anterior:

(Sí, Natalia tiene un rinoceronte llamado Mimosín :P ).


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 procedimiento
is
cursor curs is  --curs es el nombre del cursor. Pueden poner cualquiera.
select nombre, edad, nombre_mascota -- Los datos que queremos ver 
from ejemplo join mascota --Las tablas que unimos con join
on nombre = amo; --on es lo mismo que where :)
begin -- Aquí comienza el procedimiento almacenado
for resultado in curs loop --Resultado es el iterador
dbms_output.put_line ('Nombre: '|| resultado.nombre ||' Edad: '|| resultado.edad ||'  Mascota: '|| resultado.nombre_mascota);
end loop; --Aquí termina de iterar
end;

¨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.






No hay comentarios:

Publicar un comentario