Está en la página 1de 32

MG.

Luis Boy Chavil

Un procedimiento almacenado es un conjunto de sentencias SQL y de control de flujo Beneficios de los procedimientos almacenados:
Simplifican la ejecucin de tareas repetitivas Corren ms rpido que las mismas instrucciones ejecutadas en forma interactiva Reducen el trfico a travs de la red Pueden capturar errores antes que ellos puedan entrar a la base de datos Establece consistencia porque ejecuta las tareas de la misma forma Permite el desarrollo modular de aplicaciones Ayuda a proveer seguridad

Procedimientos almacenados definidos por el usuario

Son procedimientos definidos por el usuario que se deben llamar explcitamente

Triggers

Son procedimientos definidos por el usuario que se ejecutan automticamente cuando se modifica un dato en una tabla Procedimientos suministrados por el sistema
Procedimientos que hacen llamadas al sistema operativo y ejecutan tareas a ese nivel

Procedimientos del sistema Procedimientos extendidos

Un procedimiento almacenado se ejecuta ms rpido que un batch porque: El procedimiento almacenado ya ha sido analizado Ya se han resuelto las referencias a los objetos referenciados en el procedimiento almacenado No se necesita construir el rbol de bsqueda, l usa el que se hace en el momento de compilarlo No se necesita crear un plan de bsqueda, porque ya el procedimiento tiene uno

Sintaxis simplificada para create:


create procedure Nombre_Procedimiento AS sentencias return

Ejemplo:
create procedure ActualizarTitulos AS UPDATE titles SET price = price * $0.95 where total_sales < 3000 return

Sintaxis simplificada para drop:


drop procedure NombreProcedimiento

Ejemplo:

drop procedure proc_update_titles

Sintaxis simplificada:

[exec | execute] NombreProcedimiento

Ejemplo:
execute proc_update_titles

Los procedimientos almacenados pueden crear y usar variables locales


Las variables slo existen mientras exista el procedimiento Las variables no las puede usar otro proceso

Ejemplo:
create procedure ActualizarPromedioTitulos AS declare @MaxVentas int, @PromMax real select @ MaxVentas = max(total_sales) from titles select @PromMax = @MaxVentas / 2 select title, total_sales from titles where total_sales < @PromMax update titles set price = price * $0.95 where total_sales < @PromMax return

Un procedimiento almacenado puede:


Seleccionar y modificar datos Crear tablas temporales y permanentes Llamar a otros procedimientos almacenados Referenciar objetos de bases de datos use database create view create default create rule create procedure create trigger

Un procedimiento almacenado no puede ejecutar:


Para permitir que otros usen un procedimiento almacenado, el propietario debe dar los respectivos permisos Sintaxis simplificada: grant execute on NombreProcedimiento to ListaUsuarios Ejemplo:
grant execute on ActualizarPromedioTitulos to lboy, tjovanna, vturbo

Crear un procedimiento almacenado sencillo:


create procedure SP_Hola AS print Hola, <Tu Nombre>" return

Ver el cdigo fuente de un procedimiento:


sp_helptext SP_Hola

Ejecutar el procedimiento:
execute SP_Hola

Borrar los objetos de bases de datos:


drop procedure SP_Hola

Un parmetro de entrada es una variable local para el procedimiento almacenado que puede recibir un valor desde la sentencia: exec procedure

Sintaxis simplificada:
create procedure NombreProcedimiento (parameter_name datatype default_value [, parameter_name datatype default_value...] ) AS Sentencias return

Ejemplo:
create procedure InfoAutor (@lname varchar(40), @fname varchar(20)) AS -- Lista de los Libros del Autor select au_lname, au_fname, title from authors, titles, titleauthor where au_fname = @fname and au_lname = @lname and authors.au_id = titleauthor.au_id and titles.title_id = titleauthor.title_id return

Dos mtodos para pasar valores a parmetros:


Paso de parmetros por posicin Paso de parmetros por nombre

Sintaxis para paso por posicin: [exec | execute] procedure_name value [, value...] Ejemplo:
exec AutorInfo "Ringer", "Albert"

au_lname --------------Ringer Ringer

au_fname --------------Albert Albert

title ----Is Anger the Enemy? Life Without Fear

Los parmetros se deben pasar en el mismo orden en que ellos aparecen en la sentencia create procedure Como este mtodo es ms propenso a errores, se aconseja el paso por nombre

Sintaxis para paso por nombre:


[exec | execute] procedure procedure_name parameter_name = value [, parameter_name = value ]

Ejemplo:
exec AuthorInfo @lname = "Ringer", @fname = "Albert" au_lname --------------Ringer Ringer au_fname title ------------------Albert Is Anger the Enemy? Albert Life Without Fear

Los nombres de los parmetros en la sentencia exec deben concordar con los nombres de los parmetros usados en la sentencia create procedure Los parmetros pueden pasar en cualquier orden

Se puede asignar un valor por default a un parmetro cuando l no se indica en la sentencia execute Ejemplo:

create procedure EstadoAutores (@state char(2) = "CA") AS select au_lname, au_fname, state from authors where state = @state return
execute EstadoAutores au_lname ----------White Green ... au_fname -----------Johnson Marjorie state ----CA CA

Los valores que se pasan no tienen el mismo tipo de datos que los parmetros definidos En la misma sentencia, se pasa un parmetro por posicin despus de haber pasado un parmetro por nombre
Aunque no es recomendado, es posible mezclar los dos mtodos para pasar valores, sin embargo, despus de pasar un valor a un parmetro por nombre, todos los restantes deben pasar por nombre

Olvido de uno o ms parmetros


El olvido de uno o ms valores para los parmetros, hace que se usen los valores por default

Los valores para los parmetros se pasan en un orden errado

create procedure InsertarVenta (@stor_idchar(4)= NULL, @ord_num varchar(20)= NULL, @date datetime= NULL) AS /* Si no se pasa la fecha, use la Fecha Actual */ if (@date is NULL) begin select @date = getdate() end begin transaction /* Insertar Ventas */ insert sales (stor_id, ord_num, date) values (@stor_id, @ord_num, @date) if @@error <> 0 begin rollback transaction raiserror 24001 "Transaccin fallada " return end commit transaction return

Crear un procedimiento almacenado que tenga un parmetro de entrada:


create procedure SP_Hola (@Nombre varchar(30)) AS print Hola %1!", @Nombre return

Ejecutar el procedimiento con y sin un valor para el parmetro de entrada. Una sentencia fallar:
exec SP_Hola exec SP_Hola "<Su Nombre>"

Crear un procedimiento almacenado que tiene un valor por default para un parmetro de entrada:

create procedure Hola (@Nombre varchar(30) = Quien quiera que seas") AS print Hola %1!", @Nombre return

Ejecutar el procedimiento con y sin un valor para el parmetro de entrada:


exec Hola exec Hola "<Su Nombre>"

Cul procedimiento almacenado parece ser ms amigable?


Borrar los objetos de bases de datos creados:
drop procedure SP_Hola, Hola

El retorno de un Parmetro es una variable local a un procedimiento almacenado que puede enviar un valor a la sentencia exec procedure

Sintaxis simplificada: create procedure NombreProcedimiento (parameter_name datatype output [, parameter_name datatype output...] ) AS Sentencias return Ejemplo:

create SP_NuevoPrecio (@title_id char(6), @NuevoPrecio money output) AS select @NuevoPrecio = price from titles where title_id = @title_id select @NuevoPrecio = @NuevoPrecio * $1.15 return

Sintaxis simplificada: [exec | execute] NombreProcedimiento variable output Ejemplo:


declare @my_title char(6), @my_price money select @my_title = "PC8888" exec proc_new_price @my_title, @my_price output
---------23.00

Los valores que retornan los parmetros se pasan automticamente al conjunto respuesta El retorno de valores se pueden pasar por nombre o por posicin
Se recomienda el paso por nombre

Los procedimientos almacenados pueden llamar otros procedimientos almacenados


El mximo nivel de anidamiento es 16 La variable @@nestlevel contiene el nivel de anidamiento actual

Si se excede el nivel mximo:


Se abortan los procedimientos pendientes El servidor retorna un error

Un plan de bsqueda es un conjunto ordenado de etapas que se requieren para acceder los datos, incluyendo informacin sobre:
Si usar o no un ndice El ndice a usar El orden en el cual las tablas se deben encadenar

Los planes de bsqueda son creados por el optimizador de bsquedas


El optimizador de bsquedas usa informacin acerca de los objetos de base de datos para producir el plan

Los planes de bsqueda creados para los procedimientos, se reutilizan


Cuando se ejecuta un procedimiento almacenado, el servidor chequea el cach del procedimiento para un plan no usado Si hay un plan de bsqueda no utilizado, el servidor lo usa Si no hay un plan de bsqueda no utilizado, el servidor genera uno nuevo del rbol de bsqueda en sysprocedures

El plan de bsqueda creado para la ejecucin de un procedimiento almacenado puede que no sea el plan de bsqueda ptimo para la siguiente ejecucin del procedimiento almacenado
Las dos ejecuciones pueden usar parmetros de entrada muy diferentes Se pueden haber aadido nuevos ndices entre las dos ejecuciones El tamao de las tablas accedidas pueden haber cambiado significativamente entre las dos ejecuciones

Hay tres formas para forzar al servidor a generar un nuevo plan de bsqueda
Usar with recompile en el procedimiento Usar with recompile cuando se ejecute el procedimiento Usar sp_recompile

En un procedimiento, usar la opcin with recompile para forzar al servidor a crear un nuevo plan de bsqueda cada vez que se ejecute el procedimiento Sintaxis simplificada: create procedure NombreProcedimiento with recompile AS
return

Sentencias

Ejemplo:
create procedure SP_lista_AutoresCalifornia (@Nombre varchar(80), @Apellidos varchar(80)) with recompile AS select au_id, au_lname, au_fname from authors where au_lname between @Nombre and @Apellidos and state = "CA" order by au_lname return

Cuando se ejecute un procedimiento almacenado, usar la opcin with recompile para forzar al servidor a crear un nuevo plan de bsqueda para esa ejecucin del procedimiento Esta opcin se puede usar cuando se ejecuta cualquier procedimiento almacenado Sintaxis simplificada: [exec | execute] NombreProcedimiento with recompile Ejemplo:
execute ActualizarTitulos with recompile

sp_recompile hace que cada procedimiento almacenado (y trigger) que utilice la tabla indicada se recompile la siguiente vez que l se ejecute Sintaxis: sp_recompile NombreTabla Ejemplo:
sp_recompile authors

También podría gustarte