1 LENGUAJEDE PROGRAMACI NI I PROCEDIMIENTOSALMACENADOS Prof.LuisAlbertoRamrezChero I nstructor ramirez@idat.edu.pe ProgramadeComputacineI nformtica ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 2 Debesdetenerencuentaquenuestros contenidoshansidotrabajadosyrevisadoscon lafinalidaddequeseanmuyfcilesde comprender Iniciamos,adelante!!! Estimado alumno, buenda.Mepresento: Yo soy IDATINO y te ayudareenestecurso, espero me acompaes yaprendamosjuntos: En este mdulo veremos elTema: Procedimientos Almacenados ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 3 PROCEDIMIENTOSALMACENADOS (STOREPROCEDURE) Un procedimiento almacenado es un objeto perteneciente en la base de datos, que contiene un conjunto de instrucciones SQL, tanto de consulta, como de manipulacin de datos, como de control de la secuencia del programa,asociadosaunnombre,yquesonejecutadosenconjunto.Puede contener parmetros tanto de entrada como de salida (parmetros pasados por referencia), as comodevolverunvalorderetorno. Los procedimientos almacenados tambin pueden alterar la estructura de la base de datos. Por ejemplo,puedenutilizarunprocedimientoalmacenadoparaaadirunacolumnadetablaoborrar unatabla.Delamismamaneraunprocedimientoalmacenadopuedellamaraotroprocedimiento almacenado,ascomoaceptarentradasydevolvermltiplesvaloresalprocedimientollamadoen formadeparmetrosdesalida. Lasintaxisparacrearunprocedimientoalmacenadoes: Lasintaxisparalamodificacindeunprocedimientoalmacenadoes: Lasintaxisparalaeliminacindeunprocedimientoalmacenadoes: DROPPROCEDURE NOMBRE_PROCEDIMIENTO ALTERPROCEDURE NOMBRE_PROCEDIMIENTO [LISTA_DE_PARMETROS] AS SENTENCIASQL [RETURN[Valor]] CREATEPROCEDURE NOMBRE_PROCEDIMIENTO [LISTA_DE_PARMETROS] AS SENTENCIASQL [RETURN[Valor]] ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 4 Lasintaxisparaeliminarycreardenuevoelprocedimientoalmacenadoengruposeria: Para ejecutar un procedimiento almacenado, emplee la palabra clave execute y el nombre del procedimientoalmacenado,osimplementeespecifiqueelnombredelprocedimiento. Sintaxis: VentajasdeusarSP Compilacin: La primera vez que se invoca un SP, el motor lo compila y a partir de ah, se sigue usando la versin compilada del mismo, hasta que se modifique o se reinicie el servicio de SQL. Estosignificaquesetendrunmejorrendimientoquelasconsultasdirectasqueusancadenascon lasinstruccionesTSQL,quesecompilancadavezqueseinvocan. Automatizacin:sitenemosunconjunto deinstruccionesTSQL,lascualesqueremosejecutarde maneraordenada,unSPeslamejormaneradehacerlo. Administracin: cuando realizamos aplicaciones con un gran nmero de lneas de cdigo, y queremoshacercambios,soloimplicamodificarunSPynotodalaaplicacin,lo quesignificasolo cambiamos los SP en el servidor y no tenemos que actualizar la aplicacin en todos los equipos cliente. Seguridad: una parte importante es que a los usuarios de nuestra aplicacin, solo les proporcionamos los permisos para ejecutar los procedimientos almacenados y no el acceso a todoslosobjetosdelabase. Programabilidad: Los SP admiten el uso de variables y estructuras de control como IF, Bucles, Case, etc. adems del manejo de transaccin y permite controlar excepciones. Y cuando trabajamosconSPCLRpodemoshacerusodecualquierlenguaje.NETcomolosonC#yVB.NET. EXECUTENOMBRE_PROCEDIMIENTO IFEXISTS(SELECTNAMEFROMSYSOBJECTSWHERETYPE='P'ANDNAME='NOMBRE_PROCEDIMIENTO') DROPPROCEDURE NOMBRE_PROCEDIMIENTO GO CREATEPROCEDURE NOMBRE_PROCEDIMIENTO AS [LISTA_DE_PARMETROS] AS SENTENCIASQL [RETURN[Valor]] ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 5 EjerciciosPropuestos ConLaBaseDeDatosBDVENTAS 1. CrearunSPqueseencargue delistarlosaos deventadetodas lasfacturas,tenerencuenta quelosaos nosedebenderepetir Paraejecutarelprocedimientoalmacenadoes 2. CrearunSPqueseencarguedelistarelcdigo,nombre, preciodetodoslosproductosquesu precioseasuperioralprecioingresado Paraejecutarelprocedimientoalmacenadoes 3. Crear un SP que se encargue de listar el cdigo, nombre, direccin y telfono de todos los clientesquetienefactura Paraejecutarelprocedimientoalmacenadoes execute factura_cliente if exists(select name from sysobjects where name='factura_cliente' and type='p') drop procedure factura_cliente go create procedure factura_cliente as select cod_cli,nom_cli,direccion from Clientes where cod_cli in(select distinct cod_cli from Facturas) execute producto_precio7 if exists(select name from sysobjects where name='producto_precio' and type='p') drop procedure producto_precio go create procedure producto_precio @pre int as select cod_prod,descrip,precio from Producto where precio>@pre execute lista_ao if exists(select name from sysobjects where name='lista_ao' and type='p') drop procedure lista_ao go create procedure lista_ao as select distinct YEAR(fecha) ao from Facturas ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 6 4. Crear un SP que se encargue de listar el Nro de factura y las fechas(dia,mes y ao) de las facturas,paraelloseingresaraelaoyelmes Paraejecutarelprocedimientoalmacenadoes 5. Crear un SP que se encargue de listar el codigo,nombre, direccion y telefono de todos los clientesquecontengalapalabraingresada Paraejecutarelprocedimientoalmacenadoes 6. CrearunSPqueseencarguedelistarlasfacturasdependiendodelcodigodelclienteingresado, vizualizar Nro.factura,Fecha(dia,mes,ao) Paraejecutarelprocedimientoalmacenadoes execute facturas_cliente 'C0002' if exists(select name from sysobjects where name='facturas_cliente' and type='p') drop procedure facturas_cliente go create procedure facturas_cliente @cod char(5) as select num_fact,convert(char(10),fecha,103) Fecha from Facturas where cod_cli=@cod execute Busca_cliente 'sanchez' if exists(select name from sysobjects where name='Busca_cliente' and type='p') drop procedure Busca_cliente go create procedure Busca_cliente @nom varchar(255) as select cod_cli,nom_cli,direccion,telefono from Clientes where nom_cli like '%'+@nom+ '%' execute factura_ao_mes1996,5 if exists(select name from sysobjects where name='factura_ao_mes' and type='p') drop procedure factura_ao_mes go create procedure factura_ao_mes @an int,@mes int as select num_fact,convert(char(10),fecha,103) Fecha,total from Facturas where YEAR(fecha)=@an and MONTH(fecha)=@mes ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 7 7. CrearunSPqueseencarguedelistarelcdigo, nombre,ylacantidaddefacturasrealizadaspor elcliente Paraejecutarelprocedimientoalmacenadoes 8. CrearunSPqueseencarguedelistarelcodigo,nombre,ylacantidaddefacturasrealizadaspor elcliente,seingresaraunnumeroynosmostraralosnprimerosquetuvieronmayorcantidad Paraejecutarelprocedimientoalmacenadoes execute Cantidad_Facturas_cliente 3 if exists(select name from sysobjects where name='Cantidad_Facturas_cliente' and type='p') drop procedure Cantidad_Facturas_cliente go create procedure Cantidad_Facturas_cliente @n int as select top (@n) with ties c.cod_cli,nom_cli,count(num_fact) Cantidad from clientesc inner join Facturasf on c.cod_cli=f.cod_cli group by c.cod_cli,nom_cli order by 3 desc execute ranking_cliente if exists(select name from sysobjects where name='ranking_cliente' and type='p') drop procedure ranking_cliente go create procedure ranking_cliente as select c.cod_cli,nom_cli,count(num_fact) Cantidad from clientesc inner join Facturasf on c.cod_cli=f.cod_cli group by c.cod_cli,nom_cli order by 3 desc ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 8 9. CrearunSPqueseencarguedelistarelcodigo,nombre,ylacantidaddefacturasrealizadaspor elcliente,paraelloseingresaraunacantidadysolonosmostraraaquellosclientequesuperen lacantidadingresada Paraejecutarelprocedimientoalmacenadoes 10. Crear un SP que se encargue de visualizar el detalle de la factura ingresada, visualizar Nro. de factura,cdigo,nombre,precio,cantidad,Total(precio*cantidad) Paraejecutarelprocedimientoalmacenadoes execute detalle_Factura '000002' if exists(select name from sysobjects where name='detalle_Factura' and type='p') drop procedure detalle_Factura go create procedure detalle_Factura @fact char(6) as select num_fact,p.cod_prod,descrip,d.precio,cant,(d.precio*cant) Total from Productop inner join Detalled on p.cod_prod=d.cod_prod where num_fact=@fact execute Cantidad_Facturas14 if exists(select name from sysobjects where name='Cantidad_Facturas' and type='p') drop procedure Cantidad_Facturas go create procedure Cantidad_Facturas @cant int as select c.cod_cli,nom_cli,count(num_fact) Cantidad from clientesc inner join Facturasf on c.cod_cli=f.cod_cli group by c.cod_cli,nom_cli having count(num_fact)>@cant order by 3 desc ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 9 11. CrearunSPqueseencarguedevisualizareldetalledenfacturasingresadas, visualizarNro.de factura,cdigo,nombre,precio,cantidad,Total(precio*cantidad) Paraejecutarelprocedimientoalmacenadoes 12. CrearunSPqueseencarguedeGenerarelcdigodelcliente Paraejecutarelprocedimientoalmacenadoes execute generar_codigo_cliente if exists(select name from sysobjects where name='generar_codigo_cliente' and type='p') drop procedure generar_codigo_cliente go create procedure generar_codigo_cliente as Vamosadeclarar2variables declare @codmax char(5),@codnew char(5) VamosacapturarelmayorcodigodelaTablaclientes set @codmax=(select max(cod_cli) from clientes) siencasiesnulo set @codmax=isnull(@codmax,'C0000') VamosaGenerarelcodigo set @codnew='C' + right(right(@codmax,4)+10001,4) VamosalistarelnuevocodigoGenerado select @codnew as codigo execute detalle_N_Factura"'000001','000003','000005'" Vamoshabilitarelusodelascomillas set quoted_identifier off go if exists(select name from sysobjects where name='detalle_N_Factura' and type='p') drop procedure detalle_N_Factura go create procedure detalle_N_Factura @fact varchar(255) as exec("selectnum_fact,p.cod_prod,descrip,d.precio,cant,(d.precio*cant) Total fromProductopinner joinDetalled onp.cod_prod=d.cod_prod wherenum_factin("+@fact +")") ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 10 13. Crear un SP que se encargue de Generar el cdigo del cliente, resolver como parmetro de salida Paraejecutarelprocedimientoalmacenadoes 14. CrearunSPelcualseingreseelcdigodelclienteynosdevuelvacomoparmetrodesalidael nombredelcliente ysudireccin Paraejecutarelprocedimientoalmacenadoes Declare @nombre varchar(30),@direccion varchar(30) Execute busca_cliente 'C0005',@nombre Output,@direccion Output print @nombre print @direccion if exists(select name from sysobjects where name='busca_cliente' and type='p') drop procedure busca_cliente go create procedure busca_cliente @cod char(5), @nom char(30) output, @dir char(30) output as select @nom=nom_cli,@dir=direccion from clientes where cod_cli=@cod Declare @codigo varchar(5) Execute generar_codigo_cliente2@codigo Output print @codigo if exists(select name from sysobjects where name='generar_codigo_cliente2' and type='p') drop procedure generar_codigo_cliente2 go create procedure generar_codigo_cliente2 @codnew char(5) output as Vamosadeclarar2variables declare @codmax char(5) VamosacapturarelmayorcodigodelaTablaclientes set @codmax=(select max(cod_cli) from clientes) siencasiesnulo set @codmax=isnull(@codmax,'C0000') VamosaGenerarelcodigo set @codnew='C' + right(right(@codmax,4)+10001,4) ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 11 15. Crearunprocedimientoalmacenadoelcualseencarguederegistrarauncliente Paraejecutarelprocedimientoalmacenadoes 16. Crear un SP que nos muestre el cdigo, nombre, cantidad de facturas y el estado, el estado dependerdelassiguientescondiciones: Cantidad Estado <=10 Regular >10 Muybien Paraejecutarelprocedimientoalmacenadoes execute estado_venta if exists(select name from sysobjects where name='estado_venta' and type='p') drop procedure estado_venta go create procedure estado_venta as select c.cod_cli,nom_cli,COUNT(num_fact) Cantidad, case when COUNT(num_fact)<=10 then 'Regular' else 'MuyBien' end as condicion from Clientesc inner join facturasf on c.cod_cli=f.cod_cli group by c.cod_cli,nom_cli execute registra_cliente 'C0018','LuisRamirez','Av.Losclaveles','98862343','21985304' if exists(select name from sysobjects where name='registra_cliente' and type='p') drop procedure registra_cliente go create procedure registra_cliente @cod char(5), @nom varchar(30), @dir varchar(30), @tel varchar(8), @ruc varchar(8) as insert into clientes(cod_cli,nom_cli,direccion,telefono,ruc,fecha_ing,FgEli) values(@cod,@nom,@dir,@tel,@ruc,getdate(),0) ::I DAT::ProgramadeComputacineI nformtica Docente:Ram rezChero,Lui sAl berto 12 17. Visualizar el cdigo, nombre, edad de todos los empleados, adems se agregara una columna adicionalindicandosisiguientemensajeYaloscumplioTodavanoloscumple Paraejecutarelprocedimientoalmacenadoes Coneltiempo,lavidafcileslaquesehace Msdifcildellevar execute Listado_Empleado if exists(select name from sysobjects where name='Listado_Empleado' and type='p') drop procedure Listado_Empleado go create procedure Listado_Empleado as select nombre,CONVERT(char(10),fecha_naci,103) Fecha,case when ((month(fecha_naci)>month(GETDATE())) or (month(fecha_naci)=month(GETDATE()) and day(fecha_naci)>day(GETDATE()))) then 'Noloscumple' else 'yaloscumplio' end as condicion from Empleado