GBD06_Contenidos

26
Construcción de guiones. Con el trabajo desarrollado por Alejandra, Talleres Faber dispone de una base de datos que integra toda la información necesaria para la gestión del taller. Atrás han quedado los archivos de facturas en papel, las fichas manuales con los datos de nuestros clientes, los listados para consultar los recambios y sus precios, etc. El trabajo se ha simplificado enormemente, el acceso a la información es rápido y los socios están muy satisfechos con su trabajo. Pero Alejandra sabe que aún le puede sacar más partido a la base de datos si incorpora al lenguaje SQL algunas características que, en general, están disponibles en cualquier lenguaje de programación y que permiten a los usuarios autorizados escribir bloques de sentencias SQL, y guardarlos en el servidor como otro objeto de la base de datos para utilizarlos cuando lo necesiten. ¿Es eso posible con SQL? Si, la mayoría de los SGBD permiten que los usuarios creen sus propios procedimientos y funciones mediante una extensión del lenguaje SQL. ¿Cómo podría Alejandra aplicar esto en el taller? La creación de un procedimiento guardado podría servir, por ejemplo, para recoger todas las sentencias que tenemos que realizar cada vez que un nuevo cliente nos trae su vehículo para que solucionemos una avería. Si podemos hacer esto de forma automática sin más que activar el procedimiento nos ahorraremos trabajo y posibles errores, ¿no crees? Los socios de TalleresFaber piensan que si es posible. Caso práctico

description

gestion base de datos

Transcript of GBD06_Contenidos

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 1/26

    Construccindeguiones.

    Con el trabajo desarrollado porAlejandra, Talleres Faber dispone de una base de datos que integra toda la informacinnecesariaparalagestindeltaller.Atrshanquedadolosarchivosdefacturasenpapel,lasfichasmanualesconlosdatosdenuestrosclientes,loslistadosparaconsultarlosrecambiosysusprecios,etc.Eltrabajosehasimplificadoenormemente,elaccesoalainformacinesrpidoylossociosestnmuysatisfechosconsutrabajo.

    Pero Alejandra sabe que an le puede sacar ms partido a la base de datos si incorpora al lenguaje SQL algunascaractersticas que, en general, estn disponibles en cualquier lenguaje de programacin y que permiten a los usuariosautorizados escribir bloques de sentencias SQL, y guardarlos en el servidor como otro objeto de la base de datos parautilizarloscuandolonecesiten.

    Es eso posible con SQL? Si, la mayora de los SGBD permiten que los usuarios creen sus propios procedimientos yfuncionesmedianteunaextensindellenguajeSQL.

    CmopodraAlejandra aplicar esto en el taller?La creacin de un procedimiento guardado podra servir, por ejemplo, para recoger todas las sentencias quetenemosquerealizarcadavezqueunnuevoclientenostraesuvehculoparaquesolucionemosunaavera.Sipodemoshacerestodeformaautomticasinmsqueactivarelprocedimientonosahorraremostrabajoyposibleserrores,nocrees?LossociosdeTalleresFaberpiensanquesiesposible.

    Casoprctico

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 2/26

    Introduccin.Lenguajedeprogramacin.

    Alejandra se plantea la necesidad de aadir funcionalidades nuevas a su aplicacin. Para eso va a tener que pasar de un lenguaje deconsultas a un lenguaje de procedimientos. Cree que disear sus propios guiones de sentencias y hacer que se ejecuten cuando lonecesite,levaapermitirmejorarenelcontrolymantenimientodelosdatos.Paradarestepaso,tienequeempezarporinvestigarcmosepuedencrearesasrutinasosubprogramasconMySQL.

    HastaahorahemosvistoqueelSQLesun lenguajequepermiteconsultar, aadir,modificar y eliminardatosen las tablasde labasededatos, pero existen otrasfuncionespropiasdeunlenguajedeprogramacinquenohemosvistohastaahora.

    Algunosdelosprocesosquellevamosacabohabitualmente,comoeselcasodelregistrodeunareparacin,implicanqueseejecutenvariassentencias,unasdetrsdeotras.Seramuyinteresantequeesteconjuntodesentenciasestuvieranrecogidasenuna rutina,yquesepudieranguardaryejecutarcuandolonecesitemos,sinnecesidaddeenviarlasconsultasdeunaenuna.Tampocopodemos,hastaahora,establecercondicionesparaquesellevenacaboonounasdeterminadasaccionesohacerqueestasserepitan.Siqueremosquesemuestreunlistadoparahacerunacompraalosproveedores,cadavezqueelstockdelosrecambiosbajepordebajodeunacantidadqueconsideramoscomoelstockmnimo,yqueesteprocesoseejecuteautomticamente,necesitaramosestablecercondiciones,algoquenohemosvistoconSQL.

    Cuando tengamos que realizar operaciones que impliquen la ejecucin condicional, as como operaciones repetitivas necesitaremos un lenguaje de programacin deprocedimientoscomoC,Perl,Php,VisualBasic,etc.PodemosinsertarsentenciasSQLdentrodeestoslenguajesqueactuarancomo" Lenguajeanfitrin".Estemtodoesmuycomnperonoelnico.

    Conlaaparicindelas basesdedatosdistribuidasylasbasesdedatosorientadasaobjetossenecesitaqueesecdigosepuedaguardarenlabasededatosyseacompartidopor lasaplicacionesqueaccedana losdatos,porqueassemejoraelmantenimientoyelcontrol lgico.PorestemotivoactualmentelamayoradelosSGBDhanincluidoextensionesdeprogramacinqueincluyen:

    Estructurasdecontrolcomo:IFTHENELSEyDOWHILE.Declaracindevariablesydesignacindentrodelosprocedimientos.Manejodeerrores.

    ElSQLdeprocedimientospermiteutilizarcdigodeprocedimientosysentenciasSQLqueseguardandentrodelabasededatosyseejecutancuandoelusuariolosinvoca.Elusuariopuedecrear:

    Procedimientosguardados.Funciones.

    Triggers.

    Veremosenlossiguientesapartadosqusonyparaqusirven.

    Enestaunidadvamosacrearprocedimientosy funciones,utilizando estructurasalternativasy estructurasrepetitivasdentrodeguionesescritosenSQL.Laposibilidad de incrustar lenguajeSQL dentro de un lenguaje de programacin como es el casoMySQL conPHP, esmuy utilizada en la creacin de pginasWebdinmicas.EnelmdulodeAplicacionesWebseestudiaestaalternativa.

    Casoprctico

    Reflexiona

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 3/26

    Estructurasfuncionales.

    Alejandrasedisponeaestudiarlasnuevasposibilidadesqueseabrenalanalizarcmopuedecrearsuspropiosprocedimientosyfunciones,ademsdealmacenarlosenTalleresFaberyasociartriggersalastablas.

    Conelrestodelosempleadosdeltallerqueaccedenalabasededatosestudiaquprocesossecomponendevariassentenciasyse utilizan frecuentemente, para poder crear estas estructuras como procedimientos almacenados por ejemplo registrar unanueva reparacin, o algunas operaciones habituales con las que sera interesante crear funciones y simplemente utilizarlas ennuestras consultas, como podra ocurrir con el clculo del coste de lamano de obra empleada en una reparacin. Tambin quealgunasoperacionesserealicenautomticamentecreandodisparadoresotriggers,casodecomprobar laexistenciaderecambiosenelalmacn.Paraversiestoesposible,estudiaremoslasestructurasfuncionalesquemanejanuestroSGBD.

    Empezamospordefiniralgunosconceptos:

    Mdulos:Sedenominanasa laspartesenquesepuededividirunprogramapara reducirsucomplejidad,queson independientesde laaplicacinensyde las restantespartesdelprograma,aunquetienenconexionesconotrosmdulos.Tambinselesdenominarutinaso subrutinas.Enbasesdedatoslasrutinaspuedenserprocedimientos,funcionesotriggers.

    Procedimientos:SetratadeunconjuntodeinstruccionesSQLqueseguardanenelservidoryseejecutancuandoeseprocedimientoesllamado.Funciones:Sonsubrutinasquedevuelvenunvalor.Triggers:Esunprocedimientoqueseejecutaautomticamentecuandosecumpleunadeterminadacondicin.Los triggers pueden utilizarse para sentencias INSERT,UPDATE yDELETE. Se utilizan para prevenir errores y mejorar la administracin de la base de datos sinnecesidaddequeelusuarioejecutelasentenciaSQL,yaqueseejecutaautomticamenteenfuncindequesecumplaunadeterminadacondicin.

    Engeneral lasfuncionesylosprocedimientosnosonmuydiferentes.Ambosestnconstituidosporunconjuntodesentenciaslgicamenteagrupadaspararealizarunatareaespecfica.Setratadeunbloquedecdigoquesealmacenaentablasdelsistemadelabasededatos.

    Lasventajasquepresentaelusoderutinasalmacenadosson:

    Sepuedenestablecerautorizacionesvariadasdeejecucinpara losusuariossobre losprocedimientosy funcionesquesedeseen,con loquesepuedegestionar laseguridad.Esposibledisponerdelibrerasdeprocedimientosyfuncionesalmacenadasenelservidor,quepuedenserinvocadasdesdeotroslenguajesdeprogramacinoserreutilizadosparaconstruirotrasrutinas.Mejoranelrendimiento,yaqueestnalmacenadosenlabasededatos.Sesimplificanlastareascotidianas.Sontilescuandoqueremosrealizarunamismaoperacinqueafecteavariasbasesdedatosytablasdeunmismoservidor.Unprocedimientoalmacenadoenel servidor ayudaamantener laconsistenciay la integridad de los datos, ya que evita que stos puedan ser corrompidos por elaccesodeprogramasdefectuosos.Permitenlavalidacindedatos,yseintegranenlaestructuradelabasededatos.Cuandofuncionanconestepropsitosedenominantriggers.Sondinmicosyaqueadmiten parmetrosquesepasanantesdesuejecucinypuedanrealizardiferentestareasdependiendodeesosparmetrosquesehayanpasado.

    La diferencia ms importante entre los procedimientos y las funciones es que una funcin, al final de su ejecucin, devuelve un valor sin embargo, en losprocedimientosestonoesposible,aunquesquepodemosdefinirmltiplesparmetrosdesalida.Estoltimotambinesposibleenlasfunciones.

    Relacionalossiguientesconceptosconeltrminoadecuado:

    EjercicioderelacionarTrminos. Relacin. Conteptos.

    Procedimiento. 1.Conjuntodeinstruccionesqueseejecutanautomticamentecuandosecumpleunacondicin.

    Funcin. 2.Conjuntodeinstruccionesqueseejecutancuandosoninvocados.

    Trigger. 3.Conjuntodeinstruccionesquecuandoseejecutandevuelvenunvalor.

    Enviar

    Casoprctico

    Autoevaluacin

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 4/26

    Herramientasgrficasparaprocedimientosyfunciones.Enalgunasdelasherramientasgrficasquevenimosutilizandohastaahorapodemosencontrarrecursosparacrear,modificary/oeliminarprocedimientosyfunciones.

    Analizaremosloseditoresqueintegrandosdelasherramientasmencionadas:

    MySQLWorkbench.MySQLQueryBrowser.PhpMyAdmin.

    Presentacindeherramientasgrficasparaprocedimientosyfunciones.

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 5/26

    Variablesdeusuario.

    Paradisearprocedimientos,funcionesotriggers,Alejandratienequeempezarporrevisarloselementosqueestasrutinaspuedenincluir. En unidades anteriores ha tratado los tipos de datos que empleaMySQL y algunos aspectos relativos a la estructura dellenguaje, como: tratamiento de palabras reservadas, valores literales, escritura de comentarios, nombres de objetos, etc. Esnecesariotenerpresentetodosestostemas,peroahoratienequedetenerseenalgunoselementosqueformanpartedelaestructuradel lenguaje,quenohatratadohastaahora: lasvariablesylasestructurasdecontrol.Enesteapartado,vamosaseguirlaenelestudiodelasreglasquehayquecumplirparadefiniryutilizarvariablesenunguin.

    Variablesdeusuario.

    Unavariabledeusuariopermitealmacenarunvaloryreferirnosalmstarde.Tambinpuedenpasarsedeunasentenciaaotra.Lasvariables'deusuario'nopuedenservistasporotrosusuariosydesaparecencuandolaconexinsecierra.Paracrearunavariabledeusuario:

    SET@NombreVariable1=Expresin[,@NombreVariable2=Expresin]

    Podemosutilizarcomooperadordeasignacintantoelsigno=comoelsigno:=cuandolasdefinimosconSET.Silavariablerecibesuvalordeotrassentenciaseloperadordebeser:=paradiferenciarlodeloperadordecomparacin.

    Parautilizarunavariabledeusuario:

    Podemosutilizarlasvariablesdeusuarioencualquiersitiodondesepuedanusarexpresiones,siempreycuandonoseanecesarioqueseaunvalorliteral.Porejemplo,laclusulaLIMITenunaSELECTtienequecontenerunvalorliteralquereflejeelnmerodefilasdevueltasporlaconsulta.Nosedebeasignarunvaloraunavariabledeusuarioenunapartedeunasentenciayusarlaenotrapartedelamismasentencia.Porejemplo:nosedebeasignarunvaloraunavariableenSELECTyhacerreferenciaaellaenHAVING,GROUPBYuORDERBY.Puededarresultadosinesperados.Sihacemosreferenciaaunavariablesininicializarconningnvalor,suvaloresNULLydetipocadena.

    Queremos obtener un listado con dos columnas: Marcas de vehculos y el nmero de vehculos de cadamarca que nos ha visitado. El listado estarordenadoporelnmerodevehculos.Culdelassiguientesconsultasnosmuestraellistadocorrecto?

    SELECTMarca,@NUMERO:=count(Matricula)AS'Numerodevehculospormarca'FROMVEHICULOSGROUPBYmarcaORDERBY@NUMERO;

    SELECT Marca, @NUMERO:=count(Matricula) AS 'Numero de vehculos por marca' FROM VEHICULOS GROUP BY marca ORDER BY 'Numero devehculospormarca';

    SELECTMarca,@NUMERO:=count(Matricula)AS'Numerodevehculospormarca'FROMVEHICULOSGROUPBYmarcaORDERBYcount(Matricula);

    SELECTMarca,@NUMERO:=count(Matricula)AS'Numerodevehculospormarca'FROMVEHICULOSGROUPBYmarcaORDERBYMarca;

    Aunque ya hemos tratado en unidades anteriores el resto de elementos que forman parte de la estructura del lenguaje SQL en MySQL, es aconsejable que losrecuerdescomopasoprevioalaescrituradeprocedimientosyfunciones.

    Para recordar las reglas sobre cmo escribir: literales,nombresdeobjetos de la base de datos,comentarios, variables de usuario y tratamiento depalabrasreservadas,puedesaccederalmanualdeMySQLenelsiguienteenlace:

    ReglasparaescribirsentenciasenSQL.

    Casoprctico

    Autoevaluacin

    Parasaberms

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 6/26

    Procedimientos.

    Alejandraconsideramuy interesantepoderalmacenarenelservidordeTalleresFaberalgunosbloquesde instruccionesquese repitenfrecuentemente.Ella creequeesto vaa resultar, enprimer lugar,ms rpidoporquenohabrqueenviar las consultasdeunaenunaalservidor,yensegundolugarmsseguro.Sielcdigoescorrecto,notendrqueestarpendientedeposibleserrores.

    Porotraparte,todaslaspersonasqueaccedenalabasededatosconautorizacinpodrnejecutarestosprocedimientos,aunquesetratedetareascomplejas.

    Pareceinteresantenocrees?

    LosprocedimientossonrutinasosubprogramascompuestosporunconjuntonombradodesentenciasSQLagrupados lgicamentepararealizaruna tareaespecfica,queseguardanenlabasededatosyqueseejecutancomounaunidadcuandosoninvocadosporsunombre.

    Analizaremosenprimerlugar,lasventajasdeutilizarprocedimientos:

    Mejoranelrendimientoenlacomunicacinentreelclienteyelservidor.Dadoqueunprocedimientoconstadevariasinstrucciones,desdeelclienteMySQLnohayqueenviar todas esas instrucciones una a una, sino simplemente se enva la llamada al procedimiento. Por tanto, con los procedimientos se agiliza el envo deinstruccionesdesdelosclientesalservidor,norecibiendostetantaspeticionesdetareas.Comocontrapartida,elservidortieneunamayorcargadetrabajoal tenerquebuscarydecodificarlosprocedimientosalmacenadoscuandosoninvocadosdesdelosclientes.Cuandolasaplicacionesclientetrabajancondiferenteslenguajesyplataformas,losprocedimientossonmuytiles.Proporcionanmayorseguridad endos sentidos: por unaparte, lasaplicaciones y losusuariosnoaccedendirectamentea las tablas, sinoque slopuedenejecutaralgunosprocedimientosynotendrnqueconstruiresosprocesossobrelabasedelassentenciasquelosforman,conelposibleriesgodealteracionesnodeseadasdelos datos por operaciones indebidamente realizadas y por otra parte, se pueden establecer autorizaciones de ejecucin diferentes, para los usuarios sobre losprocedimientosyfuncionesquesedeseen.ResumirunprocesoconvariasinstruccionesSQLcomplejas.SeejecutamsrpidocomounprocedimientoalmacenadoquesisetratadeunprogramainstaladoenelclientequeenvayrecibeconsultasSQLalservidor.

    EnMySQLlosprocedimientossealmacenanenlatablaproc.EstatablasecreadurantelainstalacinoactualizacindeMySQL.

    ConrelacinalosprocedimientossealalaafirmacinINCORRECTA:

    Reduceneltrficodesolicitudesdelclientealservidor.

    Controlanlasoperacionesquelosclientespuedenrealizar.

    Agilizanlacargadetrabajodelservidor.

    Simplificanprocesoscomplejos.

    Casoprctico

    Autoevaluacin

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 7/26

    CreacindeprocedimientosI.Paracrearprocedimientosseutilizalasintaxis:CREATEPROCEDURENombreProcedimiento([parmetro1[,parmetro2,..]])[caractersticas]BEGIN

    CuerpoDelProcedimiento

    END

    Losparmetrospuedenser:[IN|OUT|INOUT]NombreParmetroTipo

    IN:elprocedimientorecibeelparmetroynolomodifica.Lousaparaconsultaryutilizarsuvalor.OUT:elprocedimientonicamentepuedeescribirenelparmetro,nopuedeconsultarlo.INOUT:elprocedimientorecibeelparmetroypuedeconsultarloymodificarlo.

    LosparmetrosOUToINOUTseusancuandosedeseaqueunprocedimientonosdevuelvavaloresendeterminadasvariables.

    Esobligatorioescribirunalistadeparmetros,aunqueseaunalistavaca,reflejadacon().PordefectocadaparmetroesdetipoIN.Siqueremosespecificarotrotiposeescribedelantedelnombredelparmetro.

    Tipo:EselTipodedatosdevuelto,puedesercualquiertipodedatosvlidodeMySQL.

    Lascaractersticas:

    LANGUAGESQL

    |[NOT]DETERMINISTIC|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}|SQLSECURITY{DEFINER|INVOKER}|COMMENT'CadenaComentario'

    Encaractersticassepuedenespecificarvariosvalores.LANGUAGESQLsignificaqueelcuerpodelprocedimientoestescritoenSQL.PordefectosetieneesacaractersticaparapreverlaposibleconstruccindeprocedimientosalmacenadosconotroslenguajescomoJava.

    DETERMINISTIC/NOTDETERMINISTICUnafuncinseconsideradeterministasisiempreproduceelmismoresultadopara losmismosparmetrosdeentrada,ynodeterministasinoesas.PordefectoesNOTDETERMINISTIC.

    LacaractersticaSQLSEQURITY sirveespecificar si el procedimientoes llamado,usando lospermisosdelusuarioque lo cre (DEFINER, queeselvalorpordefecto),ousandolospermisosdelusuarioqueesthaciendolallamada(INVOKER).

    LaclusulaCOMMENTseusaparaescribirelcomentarioqueaparecercuandoseejecuteunasentenciaparaverelcontenidodeunprocedimientoodeunafuncincon:

    SHOWCREATEPROCEDUREoSHOWCREATEFUNCTION

    CuerpoDelProcedimiento:Casi todas las sentenciasSQL vlidas.El cuerpo del procedimiento empieza con la sentenciaBEGIN y termina con lasentenciaENDyconstadevariasinstrucciones.Cadaunaterminaconpuntoycoma().

    DELIMITEREnMySQLlassentenciasseejecutandespusdeescribirelpuntoycoma().Parapoderescribirelprocedimientocompletoevitandoqueseejecutealencontrarelsmbolo()tenemosqueasignarlafuncindedelimitadoraotrocarcter,comoporejemplolabarra(|),comoveremosenelsiguienteejemplo.Alfinalizarasignaremosalpuntoycomasufuncinhabitual.

    ObtenerunlistadodetodoslosclientesyotrodetodoslosvehculosdeTalleresFaber.(Labasededatosdeberestarabierta).

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 8/26

    CreacindeprocedimientosII.Pordefecto,alcrearunprocedimientoquedaalmacenadoenelservidoryseasociaalabasededatosactual.Sisequiereasociaraunabasededatosespecficaseescribeelnombredelabasededatosantesdelprocedimiento:

    NombreBaseDatos.NombreProcedimiento

    Los procedimientos pueden ser llamados por cualquier usuario con autorizacin para ello y por el usuario que los cre. Al ejecutar unprocedimiento,elservidorejecutaautomticamenteunasentenciaUSEBaseDatos.

    Cuandosecreaunprocedimiento,elservidorMySQLnosdevolver indicacionessobre loserroresquepueda tenerelprocedimiento.Cuando lasintaxisescorrecta,elservidoralmacenaelprocedimiento.

    Paraejecutarunprocedimiento,unavezalmacenado,usaremoslasentencia:

    CALLNombreBaseDatos.NombreProcedimiento(parmetros_pasados);

    Enelejemploanteriorejecutaremos:CALLListados();Paraalmacenarlosresultadosdeunaconsultadirectamenteenvariablesusamoslasentencia:

    SELECTNombreColumnas[,]INTONombreVariables[,]

    Deestamaneradejamos los valoresdevueltosen las variables indicadasen lugar demostrarlosenpantalla.Parahacer esto la consulta debedevolverunasolafilaporquenosepuedeasignaraunavariableunalistadecontenidos.

    Cuandounprocedimientoutilizaunparmetrodesalidaparallamaralprocedimiento,esnecesariopasarunavariablequecargueeldatodevueltoporelprocedimiento.Paradefinirunavariabledesdelalneadecomandos,queserunavariabletemporaldesistema,lavariabledebetenerelnombreprecedidodelcarcter@yseusalasentencia:

    SET@NombreVariable=Valor;

    Ejemplos:SET@Edad=23;SET@Fecha='20110316';SET@Nombre='Alejandra';

    Tambinsepuedecrearunavariabledesistemaespecificndolacomoparmetroenlallamadaaunprocedimiento,tantosiyasetenacreadalaanteriorvariable@Numcomosisecreaenlapropiallamadaalprocedimiento:

    CALLNombreProcedimiento(@Num);

    Unavezcargadaesevalor@Numsepuedeusarencualquiersentenciacomoporejemplo:SELECT@Num;

    Crearunprocedimientoquerecibacomoparmetrodeentradalamatrculadeunvehculoynosmuestrelascaractersticasdelvehculo,ycomoparmetrodesalidaelnmerodereparacionesquehasufridoesevehculo.

    Obtenerunlistadodelosvehculosqueigualenosuperenelnmerodereparacionesanterior.

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 9/26

    Declaracindevariableslocalesaunprocedimiento.DeclaracindevariablesconDECLARE:

    Dentrodecadaprocedimientosepuedendefinir variables locales,esdecir,quesloexistenmientrasseejecutaelprocedimientoydespussedestruyen.LasvariableslocalesnicamentesonvisiblesdentrodelbloqueBEGINENDdondeestndeclaradas,ydebenestaralcomienzodeestebloque,antesdecualquiersentencia.

    Paradeclararvariableslocalesseutilizalasintaxis:

    DECLARENombreVariable[,]Tipo[DEFAULTValor]

    ParaproporcionarunvalorinicialalavariabledeclaradaseutilizaDEFAULT.Elvalorinicialpuedeserunaconstanteounaexpresin.EncasodenoemplearDEFAULTelvalorpordefectoesNULL.Encuantoaltipo,puedeutilizarsecualquiertipovlidoenMySQL.

    ParacadavariablequesedeclaraesnecesarioutilizarunasentenciaDECLAREdistinta.

    SentenciaSET

    Paraasignarunvaloracualquiervariable(local,globalopasadacomoparmetro)seutilizalasentenciaSET.LasvariablesqueseasignanconSETpuedendeclararsedentrodeunarutinaocomo variablesglobalesdeservidor.

    Paramodificarelvalordeunavariableodeunparmetroutilizandounaasignacindebeutilizarselasentencia:

    SETNombreVariable1=Expresin1[,NombreVariable2=Expresin2];

    EnExpresinpuedehaberunaconstante,unafuncin,unavariable,unaoperacinentreellasoinclusounasentenciaSELECTquedevuelvaunsoloresultado.

    Realizarunprocedimientoquelisteelvehculoolosvehculosquemsreparacioneshansufridoduranteelmesqueseindique:

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 10/26

    Funciones.

    AunqueelusodeprocedimientosalmacenadoshasupuestoparaAlejandra laposibilidaddeejecutarconunasolallamadaunaseriedesentencias, con las ventajas que hemos visto. Los procedimientos no permiten algo que Alejandra considera muy til: poder serllamados dentro de una sentencia SQL. Para poder llamar a un conjunto de instrucciones dentro de una sentencia SQL necesitarutilizarfunciones,queademsdevuelvensiempreunvalor.

    EnunidadesanterioresAlejandrahaincorporadofuncionespropiasdeSQLparaobtenerlosresultadosrequeridosenlasconsultasqueharealizadoenTalleresFaber.Podrcrearellasuspropiasfunciones?

    Funciones:conjuntodeinstruccionesSQLquedespusdeejecutarsedevuelvenunvalor.

    Laformadecrearunafuncinessimilaraladecreacindeunprocedimiento.Lasfunciones,unavezcreadas,quedanalmacenadasenelservidorypuedenserinvocadasencualquiermomentoporcualquierclienteMySQL.

    Aunquelasfuncionescompartenmuchascaractersticasconrespectoalosprocedimientos,presentantambinalgunasdiferencias:

    LasfuncionesdevuelvensiempreundatoatravsdeunasentenciaRETURN.Eldatosecorrespondeconuntipodedatosdeclaradoparalafuncin.LasfuncionesnopuedentrabajarconparmetrosOUToINOUTnicamenteconparmetrosdeentradaIN,poresonoseespecificaeltipo.En las funciones no se pueden usar sentencias que devuelvan filas de resultados (SELECT,SHOW,DESC). Se pueden usar sentenciasSELECT que devuelvan una filasiemprequelosdatosdevueltossecarguenenvariables,parasentenciasquedevuelvanvariasfilastrataremosloscursores.Lasfuncionessonllamadasaejecucin,aligualquelasfuncionesinternasdeMySQL,escribiendosunombreylalistadeparmetrospasadosalafuncinencerradosentreparntesis.PortantonousaunasentenciadellamadacomolasentenciaCALLenelcasodelosprocedimientos.LasfuncionespodrnserllamadasdesdecualquiersentenciaSQLcomoSELECT,UPDATE,INSERT,DELETE.Losprocedimientosnuncapuedenserllamadosaejecucindentrodeotrasentencia.Lasfuncionessellamanusando:NombreFuncin(parmetros).

    LasfuncionesdefinidasporelusuarioestndisponiblesenversionesanterioresdeMySQL.Actualmentesesoportanjuntoconlosprocedimientosalmacenados.Enel futuroserposibleunmarcoparaprocedimientosalmacenadosexternosenlenguajesdistintosaSQL,porejemploPHP.

    Lasfuncionessealmacenanenlatablafunc:

    Escribeunafuncinquerecibeunacadenadecaracteresydevuelveunmensajedesaludo.

    Conlafuncinanterior,saludaalosclientesdeTalleresFaber.

    Casoprctico

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 11/26

    Creacindefunciones.Vamosadescribirdetalladamentelasintaxisparacrearfunciones:

    CREATEFUNCTIONNombreFuncion([Parametro1[,Parametro2,..]])RETURNSTipo}[caractersticas]BEGIN

    CuerpoDeLaFuncion

    END

    Comohemosdichoenelpuntoanteriorconrelacinalosparmetros,noesnecesarioespecificareltipoporquenotrabajanconparmetrosOUToINOUT.

    LaclusulaRETURNSesobligatoriaeindicaeltipoderetornoquenosvaadevolver lafuncin.EnelcuerpodelafuncindebeincluirseuncomandoRETURNvaloroexpresin,debiendoserexpresindelmismotipoquelafuncin.GeneralmentelasentenciaRETURNparadevolverunresultadoeslaltimadelcuerpodelafuncin.

    Tipo:ElTipodedatosdevueltopuedesercualquiertipodedatosvlidodeMySQL.

    Lascaractersticas:

    LANGUAGESQL|[NOT]DETERMINISTIC|{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}|SQLSECURITY{DEFINER|INVOKER}|COMMENT'CadenaComentario'

    Ladescripcindelascaractersticasquepuedeincorporarunafuncinessimilaralaquehemosvistoparalosprocedimientos.

    CuerpoDeLaRutina:ContieneelcdigoejecutabledelafuncinentrelassentenciasBEGINyEND.

    Escribeunafuncinquerecibaunafechaydevuelvaelaocorrespondienteaesafecha.(cmosiesafuncinnoexistiera).Lospasosaseguirson:

    Convertirlafechaenunacadenadecaracteres(funcinCONVERT).Extraerloscuatrocaracterescorrespondientesalao(funcinLEFT).Convertiresacadenaenunnmeroenterosinsigno(funcinCONVERT).

    Probarlafuncinobteniendoelaocorrespondienteatufechadenacimiento.Probarlafuncinconelvalorquetendrdentrodeunao.

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 12/26

    Funcionesdelibrerasbsicasdisponibles.

    AunqueAlejandrahavistocomocrearsuspropiosprocedimientosyfunciones,paramuchasdelasnecesidadesquelevanasurgirenlaexplotacindeTalleresFaber,estonovasernecesarioyaqueMySQLincorporanumerosasfunciones,yesmuyprobablequesilasconoce,puedautilizarlasdirectamenteenlassentenciasSQL.

    CadaSGBDpuede incorporar funcionespropias,peroexisteungrupode funcionesqueescomna lamayora.SeguiremosaAlejandraenelestudiodetodasellas.Sisabemosconqufuncionescontamospodremosrecurriraellascuandosenosplanteelanecesidad.

    TodoSGBDpermiteque losusuarioscreensuspropiasfuncionesyprocedimientos.Adems,cualquierSGDBincluyeunconjuntodefuncionesenladistribucin.Seanfuncionesdeladistribucinofuncionesdesarrolladasporelusuario,puedenusarseensentenciasSQLparaqueestassentenciastratenlosresultadosquedevuelvenlasfunciones.

    MySQL incluyeunnumerosoconjuntode funciones.Enestaunidadseexpone lasintaxisdeutilizacindecada funcinyseagrupan las funcionesporel tipodedatosquemanipulanoporeltipodeprocesoquellevanacabo.

    Normalmentelas funcionesoperancon lascolumnasdeunatabla,seutilizanen lasexpresionesque indican losdatosquesemuestranenunaconsulta,en lascondicionesWHERE,enlasexpresionesSETparaobtenerlosdatosconlosquesemodificaunacolumna,enlosvaloresqueseinsertanmedianteINSERT,etc.

    Lasfuncionesseclasificanen:

    Funcionesmatemticas.Funcionesdecadenasdecaracteres.Funcionesdefechayhora.Funcionesdecontroldeflujo.FuncionesdebsquedasobrendicesFULLTEXT.Funcionesdeconversin.Funcionesdeagregado.Otrasfunciones.

    PuedesconsultarunresumendelasfuncionesdisponiblesenMySQLenenelsiguienteenlace.Obviamentenosetratadeaprenderlasdememoria,sinodesaberqueexistenparautilizarlascuandosenecesiten.

    ResumendelasfuncionesdisponiblesenMySQL(0.49MB)

    SinecesitasconsultarelsignificadodealgunafuncinyveralgnejemplodesuaplicacinacudealmanualdeMySQLenlossiguientesenlaces:

    Funcionesmatemticas.

    Funcionesparacadenasdecaracteres.

    Funcionesdefechayhora.

    Funcionesdecontroldeflujo.

    FuncionesdebsquedasobrendicesFULLTEXT.

    Funcionesdeconversin.

    Funcionesdeagregado.

    Otrasfunciones.

    Casoprctico

    Debesconocer

    Parasaberms

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 13/26

    Modificaryborrarprocedimientosyfunciones.ParacambiarlascaractersticasdeunprocedimientoodeunafuncinseutilizalasentenciaALTER,cuyasintaxises:

    ALTER{PROCEDURE|FUNCTION}Nombre[Caractersticas]

    Caractersticas:{CONTAINSSQL|NOSQL|READSSQLDATA|MODIFIESSQLDATA}|SQLSECURITY{DEFINER|INVOKER}|COMMENT'Cadena'

    Paraborrarunprocedimientoounafuncinalmacenadautilizamoslasentencia:DROP{PROCEDURE|FUNCTION}[IFEXISTS]Nombre

    UtilizamoslaclusulaIFEXISTSparaevitarquesielprocedimientoolafuncinyaexisten,lasentenciadevuelvaunerror.

    Otrassentenciastiles:

    SHOWCREATE{PROCEDURE|FUNCTION}Nombre

    Devuelvelacadenaexactaquecorrespondealacreacindelarutina.SHOW{PROCEDURE|FUNCTION}STATUS[LIKE'patrn']Nombre>

    Devuelvealgunascaractersticasdelprocedimientoodelafuncincomoelnombredelabasededatos,eltipoderutina:procedimientoofuncin,elcreador,fechadecreacinymodificacin,etc.

    Sinoseincluyeunpatrn,lainformacinsemuestraparatodoslosprocedimientosyfunciones.

    1. Disearunafuncinquecalculelosdasquepasaunvehculoeneltallerdereparaciones.Comprobarquelafuncinnoexista.2. ProbarlafuncinenunaconsultaSELECTparaelvehculodematrcula1313DEF.3. Mostrarlasentenciaquedescribelascaractersticasdeautor,fecha,etc.detodaslasfuncionesqueempiecenpord.

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 14/26

    Estructurasdecontrol:lasentenciaIF.

    Amedidaquevaavanzandoenlautilizacindelosprocedimientosydelasfunciones,aAlejandraselevanabriendonuevasperspectivas.Muchas de las sentencias que antes tena que repetir peridicamente, las tiene ahora almacenadas como procedimientos que puedeejecutarcomounanicasentenciaalgunasoperacionescomplejasqueantes tenaqueejecutarenunaconsultaahoraestn recogidascomo una funcin propia. Como suele ocurrir, una vez que ha empezado a dominar estos nuevos recursos se le van ocurriendo otrasaplicacionesparasubasededatos.Ysipudieraelegirlasentenciaqueseejecutaenfuncindeunacondicinodelvalordeundato?Nosepodra repetirunprocesounnmerodeterminadodeveceshastaquesealcanceunacondicin?Alejandraestechandoenfalta dostipos de estructuras que no hemos visto hasta ahora y que van a abrir nuevas posibilidades a sus procedimientos y funciones: lasestructurasdecontrol.

    EnelSQLdeMySQLdisponemosdevariasestructurasosentenciasdecontroldeflujo.Estassentenciassirvenparacodificarestructurasdedecisinyrepetitivasenunafuncinoenunprocedimiento.

    LassentenciasdecontroldeflujodisponiblesenMySQLson:

    IFCASELOOPWHILEITERATELEAVE

    EnotrosSGBDseutilizatambinlasentenciaFORqueencasodeMySQLnoseadmite.

    EstasestructuraspuedencontenerunasolasentenciaounbloquedeellasusandoloscomandosBEGINEND.Unasestructuraspuedenestaranidadasdentrodeotras.

    DECISIONESSIMPLES:LasentenciaIF

    IFCondicin1THENSentencias1

    [ELSEIFCondicin2THENSentencias2][ELSESentencias_Else]

    ENDIF;

    Si laCondicin1IFsecumple,seejecutan lassentenciascorrespondientes (Sentencias1).Sinoesverdadera,seevala laCondicin2ysiesverdaderaseejecutanlassentenciasasociadas(Sentencias2),yassucesivamentecontodoslosELSEIF.

    Siningunade lascondicionesesverdadera,encasodequehayaELSE, seejecutan lassentenciasasociadasaELSE (Sentencias3), sinohayELSEnoseejecutaningunasentencia.

    Realizarunafuncinquedevuelvaelnombredeldadelasemanacorrespondientealafechaindicada.

    Casoprctico

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 15/26

    LasentenciaCASE.La sentencia CASE se utiliza para establecer opciones mltiples a partir de una expresin. La sintaxis de esta sentencia presenta dosvariantes:

    CASEExpresin

    WHENValor1THENSentencias1[WHENValor2THENSentencias2][WHENValorNTHENSentenciasN]

    [ELSESentencias_Else]

    ENDCASE;

    Seevalalaexpresinyseejecutanlassentenciascorrespondientesalprimervalorigualalvalordelaexpresin.

    Siningnvaloresigual,seejecutanlassentenciasquehaydentrodeELSE,casodequehubieraELSE.

    RealizarlafuncinqueobtieneeldadelasemanacorrespondienteaunafechaconlasentenciaCASE.

    OtrasintaxisvlidaparaCASECASE

    WHENCondicin1THENSentencias1[WHENCondicin2THENSentencias2][WHENCondicinNTHENSentenciasN][ELSESentencias_Else]

    ENDCASE;

    Siunacondicinseevalacomoverdadera,seejecutanlassentenciascorrespondientes.Sinosecumpleningunacondicin,seejecutanlassentenciasdelaclusulaELSEencasodequelahaya.

    Realizar una funcin que devuelve la calificacin (texto) correspondiente a una calificacin numrica con decimales. Debentratarseerrores.

    No hay que confundir las estructuras IF o CASE para procedimientos almacenados que acabamos de ver, con las funciones IF() o CASE() ya que se trata defuncionesdecontroldeflujoyenelcasodeCASEsusintaxisestambindiferente.

    Ejercicioresuelto

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 16/26

    SentenciasLOOP,LEAVE,ITERATEyREPEAT.LasentenciaLOOP

    [Etiqueta_Inicio:]LOOPSentenciasENDLOOP[Etiqueta_Fin];

    Permiterealizarunbuclerepetitivoquenotieneningunacondicindesalida.ParasalirdeunbucleLOOPesnecesarioincluirunasentenciadesalidaforzada:LEAVE.

    LasentenciaLEAVE

    LEAVEEtiqueta

    Estecomandoseutilizaparaabandonarcualquiercontroldeflujoetiquetado.PuedeusarseconBEGINENDoconbucles.

    LasentenciaITERATE

    ITERATEEtiqueta

    SlopuedeusarsedentrodeLOOP,REPEATyWHILE.Estasentenciaprovocaunsaltoparareiniciarsedenuevoelbucledesdelaprimerasentencia.Paraello,esnecesarioqueelbuclecorrespondienteestmarcadoconunaetiqueta.

    EjemplodeutilizacindelassentenciasLEAVEeITERATEdentrodeunbucleLOOP.

    LasentenciaREPEAT[Etiqueta_Inicio:]REPEAT

    Sentencias;

    UNTILCondicinENDREPEAT[Etiqueta_Fin];

    Permiterepresentarunaestructurarepetitivadeltiporepetirhasta.EnestaestructuraseempiezaejecutandolassentenciasqueestndentrodeREPEAT.AlfinalseevalasisecumpleonolacondicinindicadaenUNTIL.Si lacondicinsecumple,sesaledelbucle,encasocontrariosevuelvealcomienzoyserepiteunanuevaiteracin.Lassentenciascontinanrepitindosehastaquelacondicinescierta.

    RealizarunafuncinquerecibeunacadenaAdetextoyunaletraparadevolverunacadenaquesustituyeconcaracteressubrayadostodoslosdeAexceptolosquesonigualesalaletrapasada.

    Ejercicioresuelto

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 17/26

    LasentenciaWHILE.LasentenciaWHILE[Etiqueta_Inicio:]WHILECondicinDO

    Sentencias

    ENDWHILE[Etiqueta_Fin];

    PermiterepresentarunaestructurarepetitivadeltipoMientrasEnestebuclelacondicinseevalaaliniciarelbucle,silacondicinsecumple,seejecutanlassentenciasqueestndentrodelbucleycuandosellegaalaltimasevuelveaevaluarlacondicindeWHILE,repitindoseesteprocesodenuevosilacondicinsecumple.Lasalidadelbucleseproducecuandolacondicinesfalsa.

    Realizarunprocedimientoquecargaenuna tabla,FECHAS, conunasolacolumnaFde tipoDATE, las fechasen laquenosehan realizado reparacionesdesdelafechapasadahastalafechaactual.

    CrearunprocedimientoqueaadaunalneaenlatablaIncluyenparaaadirunnuevorecambioenunareparacin,yqueposteriormenteactualiceelstockderecambiosdisponible.Comprobarantesdeaadirlafilaquehayaunidadessuficientesenstockdeeserecambio.

    Comprobarelprocedimientoconlossiguientesdatos:IdRecambio='BJ_111_666',IdReparacion=2,Unidades=1

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 18/26

    ManipuladoresdeerrorI.

    Alejandra ha observado que, al ejecutar procedimientos o funciones stosse interrumpenporquehaocurridoalgnerror, del cualMySQL slo devuelve uncdigo.EnmuchoscasosaAlejandraleinteresaqueelprocedimientocontinesuejecucinoqueselleveacabounaaccindeterminada,poresosedisponeahoraarepasarcmomanipularloserroresenMySQL,ylasposibilidadesqueofreceparacambiarlarespuestadelservidoranteunerrorenunarutinaalmacenada.

    Cuando se ejecuta una sentenciaSQL, el servidor devuelve uncdigode error (numrico) relativo a esa sentencia. Por ejemplo, se devuelve cdigo de error, cuando seejecutaunasentenciaquetratadeinsertarunafilaconunvalorqueyaexisteenlacolumnaqueesclaveprimaria.

    Silasentencianohageneradoningnerror,entoncesdevuelve0comocdigodeerror.Siunasentenciaformapartedeunprocedimientoofuncinygeneraunerror,entoncesseterminaautomticamentelaejecucindelprocedimientoofuncin.

    Esto,generalmente,esungraveproblemayaqueesnormalque,aunqueunasentenciadeunarutinaproduzcaerror,sedeseeprocesarlassiguientessentenciasdelarutina.Para solucionar este problema, MySQL permite usar manipuladores de errores o handlers que sirven para indicar como debe responder el servidor MyQL, enprocedimientosyfunciones,asituacionesdeerror.

    DECLARARCONDICIONESDEMANIPULACIN

    Paratrabajarconmanipuladoresdeerrorhayquedeclararestosmanipuladores,eindicarsobrequesentenciaosentenciasactuarn.Aldeclararunmanipuladorpuedehabersedeclaradoantes lacondicinante laqueresponderelmanipulador,dndoleunnombreaesacondicin.Paradeclararcondicionesdemanipulacindeexcepcioneshayqueusarlasintaxis:

    DECLARENombreCondicinCONDITIONFOR{SQLSTATEValorEstado|CdigoErrorMySQL};

    Porejemplo,siinsertamosunafilaenunatablayesafilanosepuedeinsertarporqueelvalordelaclaveprimariayaexiste,MySQLdevuelveunaindicacindeerrorcuyovalorde estado (SQLSTATE) es '23000' y cuyo cdigo de errorMySQL es 1062 (los valores de estado devueltos para las sentencias ejecutadas son cadenas de caracteresmientrasqueloscdigosdeerrorsonenteros).

    Paracrearunacondicindemanipulacindeexcepcionessobreesasituacindeerror,declaramoselmanipuladordelaforma:

    DECLAREClaveRepeCONDITIONFORSQLSTATE23000;

    DECLARARMANIPULADORESDEEXCEPCIN:Paradeclararunmanipuladordeexcepcinhayqueusarlasintaxis:

    DECLARETipoManipuladorHANDLERFORValorCondicion[,...]sentencia;TipoManipulador:

    CONTINUE|EXIT

    ValorCondicion:

    SQLSTATEValorEstado|NombreCondicion|SQLWARNING|NOTFOUND|SQLEXCEPTION|CdigoErrorMySQL

    Siseproducecualquieradelascondicionesdeerrordeclaradasenelmanipulador,seejecutarlasentenciaespecificadaparaelmanipulador.

    Un manipulador de tipo CONTINUE hace que prosiga la ejecucin de la siguiente sentencia a aquella donde se hay producido un error controlado por el manipulador. UnmanipuladordetipoEXIThacequesetermineelbloqueenelqueseencuentralasentenciaquehaproducidoelerrorcontroladoporelmanipuladory,portanto,terminelarutinaenlaqueseencuentra.

    SQLWARNINGseusaparareferenciaratodoslosvaloresdeestadoquecomienzanpor01.NOTFOUNDseusaparareferenciaratodosvaloresdeestadoquecomienzanpor02.SQLEXCEPTIONseusaparareferenciaratodoslosvaloresdeestadoquenosoncontroladosporSQLWARNINGyporNOTFOUND.

    Casoprctico

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 19/26

    ManipuladoresdeerrorII.Veamosunejemploparaentendermejorcomofuncionanlosmanipuladoresdeerror.

    Dadoelsiguienteprocedimiento:

    DELIMITER|CREATEPROCEDUREManipuladores()BEGIN

    BEGIN

    INSERTINTOVEHICULOS(Matricula,Marca,Modelo)VALUES('1234BMY','audi','A6');SELECT*FROMCLIENTES;SELECTCOUNT(*)FROMCLIENTES;

    END;SELECT*FROMREPARACIONES;

    END|DELIMITER;Suponiendoquehacemoslallamadaalprocedimientoylamatrculaainsertaryaexisteenlatabla,noseejecutarningunadelassentenciasquesiguenalasentenciaINSERTquedaerror.

    CALLManipuladores()ERROR1062(23000):Duplicateentry'1234BMY'forkey1

    Sabiendoqueunerrordeinsercinporclaveduplicadadaelvalordeestado23000yelcdigodeerror1062,modificaramoselprocedimientoanteriorparaquecontrolaseeseerrordeunaformasimilaralasiguiente:

    DELIMITER|CREATEPROCEDUREManipuladores()BEGIN

    DECLARECONTINUEHANDLERFORSQLSTATE'23000'SELECT'Sehaproducidounerror';BEGININSERTINTOVEHICULOS(Matricula,Marca,Modelo)VALUES('2233ABC','Ford','Mondeo');SELECT*FROMCLIENTES;SELECTCOUNT(*)FROMCLIENTES;END;SELECT*FROMREPARACIONES;

    END|DELIMITER;Ahora,alejecutarelprocedimiento,seejecutalasentenciaasociadaalmanipuladorcuandoseproduceelerror,esdecir,seescribeelmensajesehaproducidounerrorysecontinua (tipoCONTINUE) con la sentencia que hay a continuacin de la sentencia INSERT que produjo error. Si el manipulador fuese tipo EXIT se ejecutara la sentenciaasociadaalmanipulador,peronolassiguientesyseiraalfinaldelprocedimiento.

    Ladeclaracindelmanipuladorpodramoshaberlahechousandoelcdigodeerrorynoelvalordeestadodelasentencia.Ensulugarpodramoshaberpuesto:

    DECLAREEXITHANDLERFOR1062SELECT'Sehaproducidounerror';

    OinclusopodamoshaberdefinidopreviamenteunacondicindeerrorllamadaRespuesta,paradespusdeclararunmanipuladorparaesacondicindeerror:

    DECLARERespuestaCONDITIONFOR1062;DECLARECONTINUEHANDLERFORRespuestaSELECT'Sehaproducidounerror';

    EnelsiguienteenlacetienestodosloscdigosdeerrorquenospuededevolverMySQL:

    CdigosdeerrordeMySQL.

    Una formasencilladecancelar lasentenciaquedesencadenaun triggerasociadoauneventode tipoBEFORE yevitarqueseejecute, es incluir enel triggerunainstruccinqueproduzcaunerror.Estoprovocaqueeleventoquelodispar(INSERT,UPDATEoDELETE)noseejecuteporqueeltriggerseejecutaantesyencadenaunerrorsobreelevento.

    Ejemplo:INSERTINTOIncluyenVALUES('Estasentenciaprovocaunerror').

    Partiendodelejercicioresueltodelapartado4.2,aadeunHandlerqueevitequelasconsultasseejecutencuandolamatrculaqueserecibanoexistaenTalleresFaber:

    Parasaberms

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 20/26

    ManejodecursoresI.

    AlejandraestconsiguiendosacarmuchopartidoalasfuncionesyprocedimientosquetienealmacenadosenlabasededatosnosloparasuspropiasconsultassinoquelepermitenocultaralrestodeusuariosdeTalleresFaberoperacionescomplejasymanejarlasaccionesquedebenllevarseacabocuandoseproducealgnerror.

    Peroanpuedeevitaralgunas limitaciones importantes, comoporejemploqueel resultadode lasconsultas tratadasensus funcionesyprocedimientos tengaquedevolver una nica fila. No podra utilizarse algn elemento que le permita tratar varias filas? Efectivamente, se trata de los cursores y a continuacinaprendersausarlosentusprocedimientosyfunciones.

    Uncursoresunaconsultadeclaradaqueprovocaqueelservidor,cuandoserealizalaoperacindeabrircursor,cargueenmemorialosresultadosdelaconsultaenunatablainterna.Teniendoabiertoelcursor,esposible,medianteunasentenciaFETCH, leerunaauna las filascorrespondientesalcursory,por tanto,correspondientesa laconsultadefinida.Loscursoresdebendeclararsedespusdelasvariableslocales.

    DECLARARUNCURSOR:Sedeclaranmedianteunasentencia:

    DECLARENombreCursorCURSORFORSELECT;

    En la sentenciaSELECT de declaracin del cursor puede haber cualquier clusula utilizada dentro de unaSELECT, excepto la clusulaINTO. En un procedimiento o en unafuncinpodemosdefinirtantoscursorescomonecesitemos.

    Enel siguienteejemplo se creaunprocedimiento queobtieneenuna variableS la sumade losPrecios correspondientesa los 3Recambiosms carosobtenidosenunaconsulta:

    DELIMITER$$DROPPROCEDUREIFEXISTS`SumaPrecios`$$CREATEPROCEDURE`SumaPrecios`(OUTSINT)BEGIN

    DECLAREkINT;DECLAREcur_1CURSORFORSELECTPrecioReferenciaFROMRECAMBIOSORDERBYPrecioReferenciaDESC;OPENcur_1;SETS=0;FETCHcur_1INTOk;SETS=S+k;FETCHcur_1INTOk;SETS=S+k;FETCHcur_1INTOk;SETS=S+k;

    END$$DELIMITER;

    ABRIRUNCURSOR:Paraabrirelcursoro,loqueeslomismo,hacerquelosresultadosdelaconsultaasociadaalcursorquedencargadosenmemoria,seusalasentencia:

    OPENNombreCursor;

    Laprimeravezqueseleasobreelcursorseleerlaprimerafiladelaconsulta,lasegundavezseleerslolasegundafilayassucesivamente.Siquisiramosvolveraleerdesdelaprimera,tendramosquecerrarelcursoryabrirlonuevamente.

    ASIGNARFILASAUNCURSOR:Paraleerlafilaactualmentedisponibleenelcursor,sedebeusarlasintaxis:

    FETCHNombreCursorINTOvar1[,var2]...;

    Estasentenciaasigna losvaloresdevueltosde la filaqueseest leyendosobre lasvariables indicadas trasINTO.Debehaberunavariablepor cadavalorquedevuelveelcursor(porcadavalorseleccionadoenlaSELECT).Uncursorsecomportacomounpunteroqueinicialmenteapuntaalosdatosdelaprimerafilay,cuandoselee,elpunteroseincrementaparaapuntaralasiguientefilayassucesivamentehastaqueelpunterollegaalfinaltomandoelvalornulo.

    Casoprctico

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 21/26

    ManejodecursoresII.CERRARUNCURSOR:Todocursorabiertodebesercerrado.Noesnecesariohaberconsultadotodaslasfilascontroladasporelcursorparacerrarelcursor,sepuedecerrarencualquiermomento.Sinosecierra,secerraralfinaldelcomandoenelquesehadeclarado.

    Lasintaxisparacerraruncursores:

    CLOSENombreCursor;

    Acontinuacinsemuestraunejemplodeunafuncinqueobtieneusandocursoreslasumadeloskilmetrosdelosautomvilesenreparacindelamarcaquesepaseaesafuncin.

    SilamarcanoexistesecontrolaelerrordevueltoporunaSELECTnula('02000')asignandounvalor0alavariableExiste.Estohacequecuandosellegueanopoderleerunafilaconlacondicindadatambinsepuedasalirdelbucle.

    CREATEFUNCTIONSumaKmMarca(mchar(15))RETURNSINTBEGIN

    DECLAREExisteINTDEFAULT1;DECLARETot,kINT;DECLARE Cur_1 CURSOR FOR SELECT Km FROM VEHICULOS INNER JOIN REPARACIONES ON VEHICULOS.Matricula=REPARACIONES.Matricula WHEREMarca=m;DECLARECONTINUEHANDLERFORSQLSTATE'02000'SETExiste=0;SETTot=0;OPENCur_1;FETCHCur_1INTOk;WHILEExiste=1DOSETTot=Tot+k;FETCHCur_1INTOk;ENDWHILE;CLOSECur_1;RETURNTot;

    END

    CrearunafuncinquerecibaunaCiudadynosdevuelvaenunafilalosnombresdelosclientesdeesaciudadseparadosporcomas,utilizandocursores.

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 22/26

    TriggersI.

    Aunquemuchos procesos rutinarios que se llevan a cabo en TalleresFaber se han simplificado, todava en muchos casos es necesario que las personasrecuerdenquedebenrealizardeterminadasoperaciones.Eselcaso,porejemplo,delregistrode ladisminucinde lasunidadesenStockdeunrecambiocuandoseincorporaaunareparacin.

    Para evitar despistes durante el registro de operaciones en TalleresFaber, Alejandra considera que la solucin sera que algunas rutinas se ejecutaranautomticamente, es decir que cada vez que se incorpora un recambio a la reparacin de un vehculo la cantidad en stock de ese recambio disminuyeraautomticamentesinnecesidaddequeMarta, laencargadaderecambiostengaquehaceresamodificacino lanzarelprocedimientoque larealiza.EshoradequeconozcamosconAlejandralautilidaddelostriggers.

    Untriggerodisparadoresunarutinaasociadaconunatablaqueseactivaoejecutaautomticamentecuandoseproducealgneventosobrelatabla.

    Esnecesariotenerencuenta:

    Untriggersiempreseinvocaantesodespusdequeunafilaseselecciona,insertaoactualiza.Untriggersiempreestasociadoconunatabladelabasededatos.Cadabasededatospuedeono,tenerunoomstriggers.Untriggerseejecutacomopartedelatransaccinqueloactiv.

    Lostriggerspuedenutilizarsepara:

    Implementarrestriccionesdefinidaseneldiseodelabasededatos.Automatizaraccionescrticassuministrandoavisosysugerenciascuandohayaquerepararalgunaaccin.Actualizarlosvaloresdeunatabla,insertarregistrosenunatablaollamaraotrosprocedimientosalmacenados.

    CREACINDEUNTRIGGERLasintaxisdecreacindeuntriggereslasiguiente:

    CREATETRIGGERNombreTriggerDisparoEvento

    ONNombreTablaFOREACHROWSentencia

    ElNombreTablaespecificalatablaquemotivaeldisparodeltriggercuandoseproducealgneventosobrelatabla.Nosepuedeasociaruntriggerconunavistaoconunatabla de tipoTEMPORARY.Disparo especifica el momento en el que se disparar el trigger, puede ser BEFORE o AFTER indicando antes o despus, respectivamente, deejecutarselasentenciaqueproduzcaeldisparodeltrigger.EleventoindicalaaccinsobrelatablaqueprovocareldisparodeltriggerypuedeserINSERT,UPDATE,oDELETE.Porejemplo,untriggerBEFOREparasentenciasINSERTpuedeusarseparacomprobarsilosvaloresquevanaserinsertadossonvlidosantealgunaregla.

    FOREACHROWindicaqueeltriggerselanzaporcadafilaafectadaporelevento.

    Sentenciaindicalasentenciaosentenciasqueseejecutancuandoselanzaaejecucineltrigger,esdecir,laaccinrealizadaporeltrigger.

    Nuncapuedehaberdostriggersomsparaunamismatabla,querespondanalmismoeventoyenelmismomomentodedisparo.Nopuedenincluirsesentenciasdecontroldetransaccin,talescomoCOMMITyROLLBACKenelcdigodeuntrigger.

    Siqueremosqueseejecutenvariassentencias,tenemosqueagruparlasdentrodeunbloqueBEGIN...END.Dadoquelostriggerssonrutinas,podemosusarparaellos lasmismassentenciasqueenlosprocedimientosyenlasfunciones.

    Parahacerreferenciaenuntriggera lascolumnasde la tablaquedisparael trigger,nopodemosusarnormalmenteelnombredeesacolumna.Parahacerreferenciaaesascolumnas necesitamos los especificadores OLD y NEW que indican el valor de la columna antes de la modificacin que se trata de hacer y despus de la modificacinrespectivamente.

    PorejemploelvalordelacolumnanombrequesehainsertadoconunINSERTquehadisparadountrigger,serepresentacomoNEW.Nombre.

    Casoprctico

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 23/26

    TriggersII.ELIMINACINDEUNTRIGGERLasintaxisparaeliminaruntriggereslasiguiente:

    DROPTRIGGERNombreTabla.NombreTrigger

    VERLOSTRIGGERSDEUNABASEDEDATOSSHOWTRIGGERS

    Ejemplo:Realizaruntriggerqueantesdeinsertarunanuevafilaenlatablafacturasmodifiqueelestadodelareparacindelvehculo(REPARADO=1)ylafechadesalidadelatablaREPARACIONESsustituyndolaporlafechaactualdeemisindelafacturaencasodequenosehubieramodificadoanteriormente.

    DELIMITER$$DROPTRIGGERIFEXISTS`TalleresFaber`.`ActualizarReparacion`$$CREATETRIGGER`TalleresFaber`.`ActualizarReparacion`BEFOREINSERTONFACTURASFOREACHROWBEGINDECLAREFechaSDATE;DECLARERepINT(1)default0;SELECTREPARADO,FechaSalidaINTORep,FechaSFROMREPARACIONESWHEREIdReparacion=New.Idreparacion;IFREP=0ORFechaSISNULLTHENUPDATEREPARACIONESSETREPARADO=1,FechaSalida=curdate()WHEREIdReparacion=New.IdReparacion;ENDIF;END$$DELIMITER;

    Realiza un trigger que cuando modifiquemos la tabla REPARACIONES, si el valor de la columna REPARADO es 1 aada la factura correspondienteinsertandounafilaenlatablaFACTURAS.

    NOTA:Paraejecutarestetriggerdeberseliminarpreviamenteelanteriorparaevitarqueseactivenmutuamente.

    Ejercicioresuelto

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 24/26

    Anexo.Licenciasderecursos.

    LicenciasderecursosutilizadosenlaUnidaddeTrabajo.Recurso(1) Datosdelrecurso(1) Recurso(2) Datosdelrecurso(2)

    Autora:LuisPrezMuoz.

    Licencia:CCbyncnd.

    Procedencia:http://picasaweb.google.com/lh/view?q=reunion+de+trabajo&psc=G&filter=1&imglic=creative_commons#4996236915343753234

    Autora:Ex_libris_gul.

    Licencia:CCbyncsa.

    Procedencia: Montaje sobre:http://www.flickr.com/photos/ex_libris_gul/219622134/sizes/m/in/photostream/

    Autora:JorgeFelipeGonzlez.

    Licencia:CCbyncsa.

    Procedencia:Montajesobre:http://www.flickr.com/photos/jork85/1446872526/

    Autora:Joebeone.

    Licencia:CCby.

    Procedencia:Montajesobre:http://www.everystockphoto.com/photo.php?imageId=2744567&s=1#top

    Autora:SimonWillison.

    Licencia:CCbync.

    Procedencia:Montajesobre:http://www.flickr.com/photos/simon/109338862

    Autora:Viagallery.com

    Licencia:CCby.

    Procedencia:http://www.flickr.com/photos/viagallery/3179536624

    Autora:Pst.

    Licencia:GPL.

    Procedencia: Elaboracin propias. Captura de pantalla del programaPhpMyAdmin.

    Autora:Thmagans.

    Licencia:CCBYSA.

    Procedencia: Montaje sobre:http://commons.wikimedia.org/wiki/File:Logo_Rencontres_Cin%C3%A9matographiques_In%26Out.jpg

    Autora:MajnCline.

    Licencia:PD.

    Procedencia:Montajesobre:http://www.openclipart.org/detail/29050

    Autora:LeoReynolds.

    Licencia:CCbyncsa.

    Procedencia:Montajesobrehttp://www.flickr.com/photos/lwr/5302364417

    Autora:DerekRamsey.

    Licencia:CCby.

    Procedencia:Montajesobre:http://commons.wikimedia.org/wiki/File:Christmas_Fern_Polystichum_acrostichoides_Curl_Closeup_2000xpx.jpg

    Autora:Maiscio.

    Licencia:CCbyncsa.

    Procedencia:http://maiscio.blogspot.com/2010/10/filmingarchidonne.html

    Autora:Pst.

    Licencia:GPL.

    Procedencia: Elaboracin propia. Captura de pantalla del programaPhpMyAdmin.

    Autora:Vestman.

    Licencia:CCby.

    Procedencia:http://www.flickr.com/photos/61417318@N00/4908148942

    Autora:Pitr.

    Licencia:PD.

    Procedencia:Montajesobre:http://www.openclipart.org/detail/121

    Autora:bjornmeansbear.

    Licencia:CCbysa.

    Procedencia:http://www.flickr.com/photos/bjornmeansbear/4646140669

    Autora:DawnEndico.

    Licencia:CCbysa.

    Procedencia:http://www.flickr.com/photos/candiedwomanire/1651870l

    Autora:Bardomm.

    Licencia:CCbyncsa.

    Procedencia:http://www.flickr.com/photos/bardomm/1470585937

    Autora:JorgeFelipeGonzlez.

    Licencia:CCbyncsa.

    Procedencia:Montajesobre:http://www.flickr.com/photos/jork85/1776778995/

    Autora:Mattes.

    Licencia:PD.

    Procedencia:http://commons.wikimedia.org/wiki/File:VTBSstructure.JPG

    Autora:Wangi.

    Licencia:PD.

    Procedencia:http://commons.wikimedia.org/wiki/File:Southampton_Airport_Control_Tower.jpg

    Autora:CountingPine.

    Licencia:CCby.

    Procedencia:Montajesobre:http://commons.wikimedia.org/wiki/File:IfThenElsediagram.svg

    Autora:splorp.

    Licencia:CCbyncnd.

    Procedencia:http://www.flickr.com/photos/13522901@N00/2247117731/

    Autora:AndrewFitzsimon.

    Licencia:PD.

    Procedencia:Montajesobre:http://www.openclipart.org/detail/25500

    Autora:PatrickHoesly.

    Licencia:CCby.

    Procedencia:http://www.flickr.com/photos/zooboing/5404719822/

    Autora:MartinHeigan.

    Licencia:CCbyncnd.

    Procedencia:http://antimatter3d.com/Freelance_HDRI_Services.html

    Autora:JumanjiSolar. Autora:Busysignals.

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 25/26

    Licencia:Ccbyncsa.

    Procedencia:http://www.flickr.com/photos/jumanjisolar/5309418648/

    Licencia:Ccbyncsa.

    Procedencia:http://www.flickr.com/photos/crazyglue/5536313

    Autora:PatrickHoesly.

    Licencia:Ccby.

    Procedencia:http://www.flickr.com/photos/zooboing/4702785333/

    Autora:LeoReyolds.

    Licencia:CCbyncsa.

    Procedencia:Montajesobre:http://www.flickr.com/photos/lwr/2097598118

    Autora:JustinMarty.

    Licencia:Ccby.

    Procedencia:http://www.flickr.com/photos/jmarty/1804061993/

    Autora:MarcelocK.

    Licencia:Ccbyncnd.

    Procedencia:http://www.flickr.com/photos/marcelock/329351011

    Autora:PabloCharlon.

    Licencia:Ccbyncnd.

    Procedencia:http://www.flickr.com/photos/pcharlon/2787851968

    Autora:CurtisGregoryPerry.

    Licencia:Ccbyncnd.

    Procedencia:http://www.flickr.com/photos/curtisperry/106677105

  • 19/4/2015 GBD06_Contenidos

    http://adistancia.educantabria.es/aula/pluginfile.php/25911/mod_resource/content/1/GBD06/GBD06_Web/index.html 26/26