Está en la página 1de 28

Procedimientos almacenados

Sesion 06a
Jony Espinoza

Procedimientos almacenados
Un procedimiento almacenado es un conjunto de sentencias SQL y de control de flujo Beneficios:
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 Puede forzar reglas y defaults complejos de los negocios

Tipos de procedimientos almacenados


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 del sistema


Procedimientos suministrados por el sistema

Procedimientos extendidos
Procedimientos que hacen llamadas al sistema operativo y ejecutan tareas a ese nivel

Crear, Ejecutar y borrar procedimientos almacenados


Sintaxis simplificada para create: create: create proc procedure_name as statements return Ejemplo: Ejemplo: create proc proc_update_titles as update titles set price = price * $0.95 where total_sales < 3000 return Sintaxis simplificada para ejecutar: ejecutar: Sintaxis simplificada para drop: drop: drop proc procedure_name [exec | execute] procedure_name execute] Ejemplo: Ejemplo: drop proc proc_update_titles execute proc_update_titles

Crear procedimientos almacenados


Crear un procedimiento almacenado sencillo: create proc proc_hello as print "Hello, <your_name>" return Ver el cdigo fuente de un procedimiento: sp_helptext sp_helptext proc_hello Ejecutar el procedimiento: exec proc_hello Borrar los objetos de bases de datos: drop proc proc_hello

Variables
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 proc proc_update_under_half_titles as declare @max_sales int, @half_max real select @max_sales = max(total_sales) from titles select @half_max = @max_sales / 2 select title, total_sales from titles where total_sales < @half_max update titles set price = price * $0.95 where total_sales < @half_max return
Variable: Zona de memoria reservada por el programa que tiene un identificador y que almacena un tipo de dato.

Sentencias vlidas e invlidas


Un procedimiento almacenado puede: puede: Seleccionar y modificar datos Crear tablas temporales y permanentes Llamar otros procedimientos almacenados Referenciar objetos de bases de datos Un procedimiento almacenado no puede ejecutar: ejecutar: use database create view create default create rule create procedure create trigger

Procedimientos almacenados y permisos


Para permitir que otros usen un procedimiento almacenado, el propietario debe dar los respectivos permisos Sintaxis simplificada: simplificada: grant execute on procedure_name to user_list Ejemplo: grant execute on proc_update_titles to tjovanka, vturlough, pbrown

Parmetros de entrada
Los parmetros se usan para intercambiar datos entre los procedimientos almacenados y la aplicacin o la herramienta que llam al procedimiento almacenado: Los parmetros de entrada permiten a quien realiza la llamada pasar un valor de datos al procedimiento almacenado. Un Parmetro de entrada es una variable local para que un procedimiento almacenado pueda recibir un valor de la sentencia exec. Cuando se ejecuta un procedimiento almacenado, los parmetros de entrada pueden tener establecido su valor a una constante o usar el valor de una variable. Los parmetros de salida y los cdigos de retorno deben devolver sus valores en una variable. Los parmetros y los cdigos de retorno pueden intercambiar valores de datos con las variables de Transact-SQL o con variables de aplicacin Todos los parmetros de un procedimiento pueden recibir valores de entrada cuando el procedimiento almacenado es ejecutado por un programa que lo llama.

Definir parmetros de entrada


Ejemplo: Ejemplo: -- lists the author and his or her books create proc proc_author_info ( @lname varchar(40), varchar(40), @fname varchar(20) ) varchar(20) as 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

Use

para definir variables (parmetros)

Pasar parmetros
Dos mtodos para pasar valores a parmetros:
Paso de parmetros por posicin Paso de parmetros por nombre

Paso de parmetros por posicin


Ejemplo: exec proc_author_info "Ringer", "Albert" "Ringer", "Albert" au_lname au_fname title -------- -------- ----Ringer Albert Is Anger the Enemy? Ringer Albert 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

Paso de parmetros por nombre


Ejemplo: exec proc_author_info "Albert" @lname = "Ringer", @fname = "Albert" "Ringer", au_lname au_fname title -------- -------- ----Ringer Albert Is Anger the Enemy? Ringer 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

Valores por default


Se puede asignar un valor por default a un parmetro cuando l no se indica en la sentencia exec Ejemplo:
create proc proc_state_authors (@state char(2) = "CA") as select au_lname, au_fname, state from authors where state = @state return exec proc_state_authors au_lname -------White Green ... au_fname -------Johnson Marjorie -- No state value passed state ----CA CA

Parmetros de entrada: errores comunes


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 de 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

Parmetros de entrada: Ejemplo


CREATE PROCEDURE proc_insert_sale (@stor_idchar(4)= NULL, @ord_num varchar(20)= NULL, @date datetime= NULL ) as if (@date is NULL) -- If no date is passed, use the current date. begin select @date = getdate() end begin transaction INSERT sales (stor_id, ord_num, date) -- insert sales order VALUES (@stor_id, @ord_num, @date) (@ if @@error <> 0 begin rollback transaction raiserror 24001 "Transaction failed" return end commit transaction return

Parmetros de entrada
Crear un procedimiento almacenado que tenga un parmetro de entrada:
create proc proc_hello_param (@name varchar(30)) (@ as print "Hello %1!", @name return

Ejecutar el procedimiento con y sin un valor para el parmetro de entrada. Una sentencia fallar:
exec proc_hello_param exec proc_hello_param Jony Espinoza

Crear un procedimiento almacenado que tiene un valor por default para un parmetro de entrada:
create proc proc_hello_def Quien seas) (@name varchar(30) = Quien quiera que seas) as print "Hello %1!", @name return

Parmetros de entrada
Ejecutar el procedimiento con y sin un valor para el parmetro de entrada:
exec proc_hello_def exec proc_hello_def Jony Espinoza

Cul procedimiento almacenado parece ser ms amigable? Borrar los objetos de bases de datos creados:
drop proc proc_hello_param, proc_hello_def

Retorno de valores: output


Un Parmetro de retorno es una variable local para que un procedimiento almacenado pueda enviar un valor value a la Sentencia exec Los parmetros de salida permiten al procedimiento almacenado devolver un valor de datos o variable de cursor a quien realiz la llamada. Cada procedimiento almacenado devuelve un cdigo de retorno de tipo entero a quien realiza la llamada. Si el procedimiento almacenado no establece explcitamente un valor para el cdigo de retorno, ste es 0. RETURN Sale incondicionalmente de una consulta o procedimiento. RETURN es inmediata y completa, y se puede utilizar en cualquier punto para salir de un procedimiento, lote o bloque de instrucciones. Las instrucciones que siguen a RETURN no se ejecutan.

Crear parmetros que retornan valores


Ejemplo: create proc proc_new_price (@title_id char(6), @new_price money output) as select @new_price = price from titles where title_id = @title_id select @new_price = @new_price * $1.15 return

Usar parmetros que retornan valores


Ejemplo: declare @my_title char(6), @my_price money char(6), 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

Lmite de anidamiento para procedimientos


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

Crear procedimientos con recompile


Ejemplo: Ejemplo: create proc proc_list_California_authors (@early_name varchar(80), @late_name varchar(80)) with recompile as select au_id, au_lname, au_fname from authors where au_lname between @early_name and @late_name and state = "CA" order by au_lname return

Ejecucin de procedimientos with recompile


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] procedure_name with recompile Ejemplo:
execute proc_update_titles with recompile

sp_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 table_name Ejemplo:
sp_recompile authors

Finalizar transacciones
Puede finalizar las transacciones con la instruccin COMMIT o la instruccin ROLLBACK. COMMIT Si una transaccin es correcta, confrmela. La instruccin COMMIT garantiza que todas las modificaciones de la transaccin se convierten en una parte permanente de la base de datos. La instruccin COMMIT tambin libera recursos que utiliza la transaccin como, por ejemplo, los bloqueos. ROLLBACK Si se produce un error en una transaccin o el usuario decide cancelar la transaccin, deshaga la transaccin. La instruccin ROLLBACK deshace todas las modificaciones realizadas en la transaccin al devolver los datos al estado en que estaban al inicio de la transaccin. La instruccin ROLLBACK tambin libera los recursos que mantiene la transaccin.

select * from Proveedor

CREATE PROCEDURE BuscarProveedorPais @Pais varchar(40) AS SELECT Nombre, Ciudad, Telefono, Codigo_Postal FROM Proveedor WHERE Pais = @Pais If @@RowCount = 0 Begin PRINT 'No existe proveedores en este Pas' RETURN -1 /*Devolver cdigo de estado */ End RETURN 0

exec BuscarProveedorPais 'Japn'

CREATE PROC BuscarEmpleado @CodEmp int = 0 -- Valor inicial ser CERO AS IF Exists ( SELECT cod_empleado FROM empleado WHERE cod_empleado = @CodEmp) Begin SELECT [Apellidos y Nombres] = Apellidos + ', ' + Nombres , Telefono = Tfno_Particular, Edad = Year(GetDate()) - Year(Fecha_Nacimiento) , Obs = CASE WHEN Year(GetDate()) - Year(Fecha_Nacimiento)<40 THEN 'Empleado Joven' WHEN Year(GetDate()) - Year(Fecha_Nacimiento)<50 THEN 'Empleado Adulto' ELSE 'Empleado a punto de Jubilarse' END FROM Empleado WHERE cod_empleado = @CodEmp End ELSE Begin PRINT 'No existe el empleado con el codigo indicado..:'+Str(@CodEmp) RETURN -1 /*Devolver codigo de estado */ End RETURN 0 EXEC BuscarEmpleado 15

También podría gustarte