No es un bug, es una característica no documentada

viernes, 6 de marzo de 2015

Bases de datos. SQL programado (II)

9:34 Posted by Inazio , No comments
Estructura de un procedimiento

create procedure nombreProcedimiento([parametro1[,…]])
            [LANGUAJE SQL] à Indica que el lenguaje cumple el estándar SQL.

[[NOT] DETERMINISTIC] à Refiere al comportamiento del procedimiento.
Será determinado si el resultado no varía (por ejemplo, hallar el perfecto de un número), e indeterminado si el resultado sí varía (consultar la fecha de hoy)

[{CONTAINS SQL | MODIFIES SQL DATA | READS SQL DATA | NO SQL}] à Indica el acceso que realizará el procedimiento a la base de datos

[SQL SECURITY {DEFINER | INVOKER}] à Se define la seguridad del procedimiento, es decir, los permisos que tendrá el usuario durante la consulta. Definer tendrá los permisos del usuario que creo el procedimiento, e invoker dará al procedimiento los permisos del usuario que lo ejecuta.
           

Bloque de instrucciones del procedimiento

¿Cómo ver los procedimientos existentes, y sus características?

show procedure status;

O ver como está creado un procedimiento concreto:

show create procedure bloque1;

Utilización de instrucciones DDL y DML en procedimientos SQL
"¿Cómo se meten? Pues escribiendolas, joder"
Alberto, profesor obvious causa.

Las instrucciones DDL son de lenguaje de definición de datos, y las DML son de lenguaje de manipulación de datos.

En el siguiente ejemplo:


Las líneas 7 a 11 son DDL, con la finalidad de crear una tabla, y la línea 14 es DML, que inserta en la tabla al alumno de nombre y código i cada vez que se ejecute el bucle.

¿Select?

Realizar dentro de un procedimiento un SELECT a pelo MySQL deja, pero por regla general no lo permitirán. Por ejemplo Oracle.

Para mostrarlo tendremos que user un SELECT INTO. Veamos un ejemplo


Esto almacena los campos de la consulta en las variables declaradas previamente. Posteriormente, se realiza un select a las variables donde se ha almacenado el resultado de la consulta.

Eso sí, tiene ciertos detalles que hay que cumplir:

  • Las varibles tendrán que ser del mismo tipo que el campo a consultar.
  • Tendré que tener tantas variables como campos a consultar haya en el SELECT
  • El SELECT INTO está preparado para recoger una sola fila. Si la consulta devuelve varias no se podrá, saldrá un error de "Error 1172. Result consisted of more than one row"
¿Cómo "arreglar" un poco esto entonces?

Nos declararemos tres variabes, una de entrada y dos de salida
p_id INT, OUT o_id INT, OUT o_alumno VARCHAR(30)

Indicamos que el INTO se realice a las dos variables de salida
SELECT id, alumno
INTO o_id, o_alumno

El where lo comparamos a la variable de entrada
WHERE id = p_id

Y realizamos la llamada fuera del procedimiento
CALL prodcedimiento2(1,@id,@nombre);

Por ejemplo, claro. Eso sería la forma correcta de hacer un procedimiento.

Sólo quedaría sacar los datos por pantalla

SELECT @id, @nombre;

"Esto es lo elegante" 
Alberto, profesor elegantis causa

0 comentarios:

Publicar un comentario