You are on page 1of 30

Introducción a TSQL

Unidad 13

Autor
Isabel Ponce
Unidad 13

Objetivos
• Procedimientos Almacenados
– Aplicaciones
– Ventajas
– Creación
– Parámetros
• De entrada
• De salida
• De entrada/salida
– Retornar valores
– Modificar Procedimientos
– Renombrar Procedimientos
– Borrar Procedimientos
– Recomendaciones
– Restricciones
Introducción

• Durante muchos años, los


programadores han luchado
para proporcionar métodos de
manipulación de datos
consistentes, sencillos y
optimizados.

• Estas características se pueden


encontrar en los
Procedimientos Almacenados.

• La admisión de Procedimientos
Almacenados (Store
Procedures) difiere mucho
entre las distintas plataformas
de bases de datos.
Lotes

• En la unidad anterior se
examinaron los archivos en
lote.

• A manera de breve repaso:

– Un lote es una o más


instrucciones SQL
– Si una instrucción en un lote es
inválida, el lote entero se
rechaza.

• MySQL soporta de manera


general “rutinas” de dos tipos:
procedimientos almacenados y
funciones que retornan un
valor.
Procedimientos
Almacenados

• Un Procedimiento Almacenado
es un lote de instrucciones SQL,
reunidos en una unidad lógica,
compilada y almacenada en la
base de datos bajo un nombre.

• Las diferencias entre un lote o


bloque anónimo y un
procedimiento almacenado son
que un lote no tiene nombre, se
compila al momento de ejecución
y se pierde al salir de la sesión;
en cambio un procedimiento
almacenado tiene nombre, ya
está compilado y permanece en la
base de datos.
Aplicaciones

• Aunque los objetivos de los


procedimientos almacenados
dependen de las necesidades
de la empresa, comúnmente
son usados para:

– Consultas usadas frecuen-


temente.
– Definir las reglas del negocio.
– Establecer rutinas de manejo
de errores.
– Sistematizar funciones admi-
nistrativas repetitivas.
– Mantener la seguridad de los
datos.
Ventajas

• Permiten que muchos usuarios


reutilicen el mismo código.
– Se crean una vez y se usan N veces, por
los usuarios que tengan permisos de
hacerlo.

• Proporcionan una implementación de


código centralizada y consistente.
– Un solo lugar donde buscar errores y
corregirlos.
– Los comandos se ejecutan iguales.
– Se estandariza el manejo de errores.

• Proporcionan independencia lógica.


– Mantienen ocultos los métodos
complejos de manipulación de datos del
nivel de presentación.
– Si hay cambios en los procedimientos
por ejemplo para mejorar el rendimiento,
no se afecta el código del cliente.
Ventajas

• Separan las tareas Cliente/Servidor.


– Se pueden tener procedimientos
almacenados en el servidor que realicen
procesamientos lentos y costosos, mientras
el cliente se encarga principalmente de la
presentación.

• Reducen el tráfico de la red.


– Se está enviando un comando de ejecutar
un procedimiento en vez del lote completo
de SQL a través de la red.

• Se ejecutan más rápido que el mismo


conjunto de instrucciones ejecutado
como un lote.
– El código ya está compilado.
– No se requiere crear un plan de ejecución
cada vez que se ejecuta.
– El código generalmente reside en memoria.
Ventajas

• Permiten el diseño modular.


– Analizando las consultas y procedimientos
almacenados existentes, se puede
encontrar código redundante que realice la
misma tarea y escribir con él un módulo lo
realice.

• Proporcionan seguridad.
– Los usuarios pueden obtener permisos
sobre un procedimiento que modifica datos
en vez de permisos para modificar
directamente la tabla.
Creación

• Para crear un procedimiento almacenado,


se usa el comando de creación de
procedimientos.

create procedure <nombreProc>


([{in | out | inout} <parámetro> <tipo>]*)
[begin]
<instrución SQL> | <lote>
[end];

• El procedimiento almacenado se
almacena en la base de datos actual,
pero puede acceder objetos de otras BD.
Creación

• Ejemplo:

create procedure prNombreAutores()


select au_fname, au_lname
from authors;

• Este procedimiento, solo extrae el


nombre y apellido de los autores.
Ejecución

• Para ejecutar un procedimiento


almacenado, se utiliza un comando call:
call <nombreProc> [(<parámetro>*)];

• Los procedimientos pueden llamarse


desde:
– Lotes
– Otros procedimiento almacenado
– Disparadores (Triggers)
– Otros programas (SQL inmerso)

• Ejemplo:
call prNombreAutores;
call prNombreAutores();
Parámetros de entrada

• La mayoría de los procedimiento


almacenado requieren recibir
parámetros de entrada.

• Un parámetro de entrada es una


variable que tiene un valor cuando el
usuario ejecuta el procedimiento
almacenado.

• Los parámetros de entrada se


definen en el procedimiento almace-
nado opcionalmente con la palabra
IN, ya que si no se indica, por
omisión un parámetro es de entrada.

• Éstos incrementan la flexibilidad del


procedimiento.
Parámetros de entrada

• Sintaxis:

([IN] <parámetro> <tipo> [default <valor>])

• Ejemplo

create procedure prEstadoAutor(


IN nombre varchar(40))
select state
from authors
where au_lname = nombre;//

call prEstadoAutor (‘Smith’);//


Parámetros de salida

• En ocasiones se necesita retornar valores


desde un procedimiento almacenado.

• Esto se puede hacer con los parámetros


de salida y no es compatible con todos
los DBMSs:

• Sintaxis:

(out <parámetro> <tipo>)

create procedure p11(out p int)


set p = -5;//

call p11(@y)//

select @y//
Parámetros de salida

• Un parámetro de entrada pasa un


valor a un procedimiento. El
procedimiento puede modificar su
valor, pero la modificación no es
visible fuera del procedimiento al salir
de él.

• Un parámetro de salida retorna un


valor desde el procedimiento. Su valor
inicial es nulo al entrar al
procedimiento, y su valor es visible al
salir del procedimiento.

• Un parámetro de entrada/salida es
pasado el procedimiento con un valor,
puede ser modificado por el
procedimiento y cualquier cambio será
visible al salir del procedimiento.
Múltiples Parámetros

• Se pueden definir varios parámetros en


un procedimiento almacenado:
create proc myproc
(par1 int, par2 int, par3 char(2))…

• Ejemplo:
create procedure prInfoAutor
(nombre varchar(40),
apellido varchar(40))
select au_fname, au_lname, title, pub_name
from authors A, publishers P, titles T, titleAuthor TA
where au_fname = nombre
and au_lname = apellido
and A.au_id = TA.au_id
and T.title_id = TA.title_id
and P.pub_id = T.pub_id;//

CALL prInfoAutor(‘Marjorie’, ‘Green’);//


Errores comunes

• Al pasar parámetros se debe


tener cuidado de cometer los
siguientes errores:

– Que los valores no sean


compatibles con el tipo de dato
definido.

– Que falten uno o más


parámetros.

– Que los parámetros se pasen


en un orden incorrecto.
Manejo de Errores

• Siempre se debe implementar el


manejo de errores en un
procedimiento almacenado.

• Esto incluye:
– mostrar un mensaje de error
– control de transacciones
– retornar estado

• Para depurar un procedimiento


almacenado, se puede usar la
instrucción select para informar el
estado de las variables y los saltos
en la ejecución.

• Estos mensajes deben eliminarse


antes de que el procedimiento vaya
a producción.
Funciones Almacenadas

• Las funciones almacenadas son


similares a los procedimientos
almacenados a excepción que
permiten retornar un valor.

create function <nombreProc>


([<parámetro> <tipo>]*)
returns <tipo>
[begin]
<instrución SQL> | <lote>
return <valor>;
[end];
return

• La instrucción return finaliza la


ejecución de una función y
devuelve un valor que puede
comprobarse por quien lo haya
llamado.

• La instrucción return no puede


usarse en procedimientos
almacenados, sólo en
funciones, si un procedimiento
almacenado debe retornar
algún valor, se usan los
parámetros de salida.

• Las funciones sólo manejan


parámetros de entrada.
Eliminar un
Procedimiento

• Para borrar (drop) un


procedimiento almacenado, se
usa el comando:

drop procedure <nombreProc>;

• Un procedimiento se debe
borrar:
– antes de crear otro con el mismo
nombre.
– Cuando se cambia el código del
procedimiento.

• Ejemplo:

drop procedure prVtasXTitulo;


Procedimientos
Anidados

• Los procedimientos se pueden


anidar (tener un procedimiento
que llame a otro) hasta.

create proc…
call proc2...
call proc3...
return
Obtener Información

• Para ver el código fuente de un


procedimiento almacenado, se
puede indicar:

show create procedure <nombreProc |


nombreFunc>
Recomendaciones

• Hacer la declaración y asignación de


variables dentro de un bloque.

• Separar instrucciones largas en varias


líneas.

• Agregar comentarios para documentar


la funcionalidad.

• Crear un encabezado común para los


procedimientos que incluya por
ejemplo:
– Propósito
– Valores/datos que retorna
– Cómo usarlo
– Descripción de parámetros y variables
– Historia de las modificaciones
– Autor, fecha de modificación y creación.
Recomendaciones

• Desarrollar nombres, comentarios y


documentación estándar para todos
los procedimiento almacenado.

– Hace los procedimientos más


legibles.
– Simplifica la identificación de
procedimientos.
– Reduce la carga administrativa.

• Reutilizar código.
Recomendaciones

• Verificar que no falten argumentos e


identificar su utilidad.

• Verificar la validez de los


parámetros.

• Incluir retornos de estado para el


manejo de errores.

• Mostrar mensajes adecuados para el


usuario.
Restricciones

• El comando create procedure no se


puede combinar con ninguna otra
instrucción dentro de un lote.

• Se puede incluir casi cualquier


instrucción SQL en un procedimiento
almacenado, excepto:

– create view
– create rule
– create default
– create procedure
– create trigger
– alter
– drop

• A excepción a drop database.

• Se puede referir a tablas temporales.


Resumen Unidad 13

• Un procedimiento almacenado es un
lote de SQL que se compila y almacena
en la BD.

• Algunas instrucciones SQL no se


pueden usan en un procedimiento.

• Un procedimiento almacenado puede


usar parámetros de entrada para
incrementar la flexibilidad del
procedimiento.

• Los parámetros de entrada pueden


crearse con un valor por omisión.

• Los parámetros de salida pueden


usarse para retornar valores.

• Cada función retorna un valor.


Ejercicios

1. Crear un procedimiento
almacenado que retorne todos
los title_id, títulos y tipos de la
tabla de títulos.
2. Modificar el procedimiento
anterior para que retorne sólo los
títulos del tipo que se
especifique.
3. Mejorar este procedimiento para
proporcionar un valor por omisión
si no se le indica valor.
4. Modificarlo otra vez para retornar
el total de ventas de un tipo en
una variable y ejecutarlo.
5. Modificarlo para retornar el total
sólo si se indica el tipo.

You might also like