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