10 gestión de errores de pl _ sql - manejo de exceptions

Upload: jvreferencia

Post on 07-Mar-2016

259 views

Category:

Documents


0 download

TRANSCRIPT

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 1/16

    Anterior Siguiente

    SaltarCabeceras

    GuadeReferenciayPL/SQLdelusuario10gRelease1(10.1)NmerodeparteB1080701 Hogar Listadelibros Contenido ndice ndicemaestro Realimentacin

    VerPDF

    10ManejodeerroresPL/SQLNohaynadamsexcitantequeserdisparadosinresultado.WinstonChurchill

    loserroresdetiempodeejecucinsedebenaerroresdediseo,erroresdecodificacin,fallosdehardware,ymuchasotrasfuentes.Aunquenosepuedeanticipartodoslosposibleserrores,sepuedeplanificarparamanejarciertostiposdeerroressignificativosensuprogramaPL/SQL.

    Conmuchoslenguajesdeprogramacin,amenosquedeshabilitelacomprobacindeerrores,unerrordetiempodeejecucincomoeldesbordamientodepilaodivisinporcerosedetieneelprocesamientonormalydevuelveelcontrolalsistemaoperativo.ConPL/SQL,unmecanismollamadoelmanejodeexcepcioneslepermite"apruebadebalas"elprogramademodoquepuedacontinuaroperandoenpresenciadeerrores.

    Estecaptulocontienelossiguientestemas:

    VisingeneraldePL/SQLentiempodeejecucinControldeerrores

    VentajasdePLExcepciones/SQL

    ResumendelasexcepcionespredefinidasPL/SQL

    DefinirsupropioPL/SQLExcepciones

    CmosecranPLExcepciones/SQL

    CmoPLExcepciones/SQLdepropagacinde

    ReraisingaPL/SQLException

    ManejodeexcepcioneslevantadasPL/SQL

    ConsejosparaelmanejodeerroresPL/SQL

    VistageneraldealarmasPL/SQLtiempodecompilacin

    VisingeneraldePL/SQLentiempodeejecucinControldeerroresEnPL/SQL,unacondicindeerrorsedenominaexcepcin.Lasexcepcionespuedenserdefinidosinternamente(porelsistemadetiempodeejecucin)odefinidosporelusuario.Losejemplosdeexcepcionesdefinidasinternamenteincluyenladivisinporceroysinmemoria.Algunasexcepcionesinternascomunestienennombrespredefinidos,comoZERO_DIVIDEySTORAGE_ERROR.Lasotrasexcepcionesinternassepuedendarnombres.

    SepuededefinirexcepcionesdesucuentaenlapartedeclarativadecualquierbloquePL/SQL,subprogramaopaquete.Porejemplo,esposibledefinirunaexcepcinconnombreinsufficient_fundsacuentasbancariasendescubiertobandera.Adiferenciadeexcepcionesinternas,lasexcepcionesdefinidasporelusuariodebendarnombres.

    Cuandoseproduceunerror,esunaexcepcinlevant.Esdecir,lonormalinterrumpelaejecucinyelcontrolsetransfierealapartedecontroldeexcepcionesdesubloquePL/SQLosubprograma.Excepcionesinternassoncriadosdemaneraimplcita(automticamente)porelsistemadetiempodeejecucin.ExcepcionesdefinidasporelusuariodebenserplanteadasexplcitamenteporRAISEdeclaraciones,quetambinpuedenelevarexcepcionespredefinidas.

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 2/16

    Paracontrolarlasexcepcionesplanteadas,seescriberutinasseparadasllamadascontroladoresdeexcepciones.Despusseejecuta

    uncontroladordeexcepciones,elbloqueactualdejadeejecucinyelbloquequelocontienesereanudaconlasiguienteinstruccin.Sinohayunbloquequelocontiene,elcontrolvuelvealaentornodeacogida.

    Elsiguienteejemplocalculaunarelacinpreciogananciasdeunaempresa.Silaempresatieneceroingresos,laoperacindedivisinlanzalaexcepcinpredefinidaZERO_DIVIDE,laejecucindelbloqueseinterrumpe,yelcontrolsetransfierealoscontroladoresdeexcepciones.elopcionalOTROScontroladordecapturatodaslasexcepcionesqueelbloquenoespecificaelnombre.

    AJUSTEENserveroutput;

    DECLARENMEROSTOCK_PRICE:=9.73;net_earningsNMERO:=0;pe_ratioNMERO;EMPEZARClculopodracausarerrordedivisinporcero.pe_ratio:=STOCK_PRICE/net_earnings;dbms_output.put_line'(Precio/beneficioratio='||pe_ratio);

    EXCEPCINloscontroladoresdeexcepcionescomienzan

    Slounodeloscuandolosbloquesseejecuta.

    CUANDOENTONCESZERO_DIVIDE'divisinporcero'mangosdeerrordbms_output.put_line('Compaadebehabertenidoceroganancias.');pe_ratio=null;

    CUANDOOTROSENTONCESmanejatodoslosdemserroresdbms_output.put_line('Algnotrotipodeerrorsehaproducido.');pe_ratio=null;

    FINAL;Manejadoresdeexcepcionesyfinaldelasecuenciaaqu/

    Elltimoejemploilustraelmanejodeexcepciones.Conunpocomejorcomprobacindeerrores,podramoshaberevitadolaexcepcindeltodo,mediantelasustitucindeunvalornuloalarespuestasieldenominadorescero:

    DECLARENMEROSTOCK_PRICE:=9.73;net_earningsNMERO:=0;pe_ratioNMERO;EMPEZARpe_ratio=net_earningsdecasos0cuandounvalornuloSTOCK_PRICE/net_earningsdemsfinal;FINAL;/

    NormasparaevitarloserroresymanejodePL/SQLyexcepciones

    Debidoaquelafiabilidadescrucialparalosprogramasdebasesdedatos,utilicelacomprobacintantodeerroresycontroldeexcepcionesparaasegurarquesuprogramapuedemanejartodaslasposibilidades:

    Agregarcontroladoresdeexcepcionescadavezquehayalgunaposibilidaddequeseproduzcaunerror.Loserroressonespecialmenteprobabledurantelosclculosaritmticos,lamanipulacindecadenas,ylasoperacionesdebasededatos.Loserrorestambinpuedenocurrirenotrasocasiones,porejemplo,siunfallodehardwareconelalmacenamientoolamemoriadediscoprovocaunproblemaquenotienenadaqueverconsucdigoperoelcdigotodavatienequetomarmedidascorrectivas.

    Aadiruncdigodecomprobacindeerroressiempresepuedepredecirquepodraproducirseunerrorsielcdigoobtienelosdatosdeentradaincorrecta.Esperarqueenalgnmomento,sucdigoserpasadoparmetrosincorrectosonulos,quelasconsultasvolvernningunafilaomsfilasdelosqueesperaba.

    Hagasusprogramaslosuficientementerobustocomoparatrabajarinclusosilabasededatosnoestenelestadoqueespera.Porejemplo,talvezunatablaseconsultahabrcolumnasaadidooeliminado,osustiposcambiado.Puedeevitarestosproblemasmedianteladeclaracindevariablesindividualescon%TIPOfasedeclasificacin,yladeclaracinderegistrosparamantenerresultadosdelaconsultacon%ROWTYPEcalificadores.

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 3/16

    paramantenerresultadosdelaconsultacon%ROWTYPEcalificadores.

    Controlarlasexcepcionesnombradassiemprequeseaposible,enlugardeutilizarcuandootrosenloscontroladoresdeexcepciones.Aprenderlosnombresylascausasdelasexcepcionespredefinidas.SisusoperacionesdebasesdedatospuedencausarerroresORAparticulares,nombresasociadosconestoserroresparaquepuedaescribircontroladoresparaellos.(Ustedaprendercmohaceresomsadelanteenestecaptulo).

    Probarelcdigocondiferentescombinacionesdemalosdatosparaverqusurgenerrorespotenciales.

    Escribirinformacindedepuracinensuscontroladoresdeexcepciones.Esposiblealmacenardichainformacinenunatablaseparada.Siesas,hacerlohaciendounallamadaaunprocedimientodeclaradaconlaPRAGMAAUTONOMOUS_TRANSACTION,porloquepuedecomprometersuinformacindedepuracin,inclusosivuelveeltrabajoqueelprocedimientoprincipalestabahaciendo.

    Considerecuidadosamentesicadacontroladordeexcepcionesdebeconfirmarlatransaccin,rodarhaciaatrs,odejarquecontine.Recuerde,noimportaqutangraveeselerror,quequieredejarlabasededatosenunestadocoherenteyevitarelalmacenamientodelosdatosdaados.

    VentajasdePLExcepciones/SQLElusodeexcepcionesparaeltratamientodeerrorestienevariasventajas.

    Conexcepciones,sepuedemanejardeformafiablelosposibleserroresdemuchosestadosconunsolocontroladordeexcepciones:

    EMPEZARSELECT...SELECT...procedure_that_performs_select();...EXCEPCINCUANDOENTONCESNO_DATA_FOUNDatrapatodo"nosehanencontradodatos"errores

    Enlugardelacomprobacindeunerrorencadapuntoquepodraocurrir,slotienequeaadiruncontroladordeexcepcionesasubloquePL/SQL.Silaexcepcinseaumentnuncaenesebloque(ocualquiersubbloque),puedeestarsegurodequesermanejado.

    Aveces,elerrornoesinmediatamenteevidente,ynosepudodetectarhastamstardecuandoserealizanclculosapartirdedatosmalos.Unavezms,unnicocontroladordeexcepcionespuedenatrapartodosloserroresdedivisinporcero,malossubndicesdematriz,yassucesivamente.

    Sinecesitacomprobarsihayerroresenunpuntoespecfico,puedeincluirunnicoestadoogrupodeestadosdentrodesupropiobloqueBEGINENDconsupropiocontroladordeexcepciones.Puedehacerqueelcontrolsealomsgeneralotanprecisacomodesee.

    Elaislamientodelasrutinasdecontroldeerroreshacequeelrestodelprogramaseamsfcildeleeryentender.

    ResumendelasexcepcionespredefinidasPL/SQLUnaexcepcininternaseelevadeformaautomticasielprogramaPL/SQLinfringeunaregladeOracleoexcedeunlmitedependientedelsistema.PL/SQLpermitepredefiniralgunoserroresdeOraclecomunescomoexcepciones.Porejemplo,PL/SQLplantealaexcepcinpredefinidaNO_DATA_FOUNDsiunSELECTENinstruccindevuelveningunafila.

    PuedeusarelpragmaEXCEPTION_INITparaasociarnombresdeexcepcinconotroscdigosdeerrordeOraclequepuedeanticipar.ParacontrolarloserroresinesperadosdeOracle,puedeutilizarlaOTROSmanejador.Dentrodeestecontrolador,puedellamaralasfuncionesdeSQLCODEySQLERRMparadevolverelcdigodeerrordeOracleyeltextodelmensaje.Unavezqueconozcaelcdigodeerror,sepuedeutilizarconelpragmaEXCEPTION_INITyescribiruncontroladorespecficamenteparaeseerror.

    PL/SQLdeclaraexcepcionespredefinidasanivelmundialenelpaqueteSTANDARD.Ustednolosnecesitadeclares.Puedeescribircontroladoresdeexcepcionespredefinidasutilizandolosnombresdelalistasiguiente:

    Excepcin OracleError SQLCODEValorACCESS_INTO_NULL ORA06530 6530

    CASE_NOT_FOUND ORA06592 6592

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 4/16

    CASE_NOT_FOUND ORA06592 6592

    COLLECTION_IS_NULL ORA06531 6531

    CURSOR_ALREADY_OPEN ORA06511 6511DUP_VAL_ON_INDEX ORA00001 1

    INVALID_CURSOR ORA01001 1001

    NMEROINVALIDO ORA01722 1722

    LOGIN_DENIED ORA01017 1017

    DATOSNOENCONTRADOS ORA01403 +100

    NOT_LOGGED_ON ORA01012 1012

    Program_Error ORA06501 6501

    ROWTYPE_MISMATCH ORA06504 6504

    SELF_IS_NULL ORA30625 30625

    STORAGE_ERROR ORA06500 6500

    SUBSCRIPT_BEYOND_COUNT ORA06533 6533

    SUBSCRIPT_OUTSIDE_LIMIT ORA06532 6532

    SYS_INVALID_ROWID ORA01410 1410

    TIMEOUT_ON_RESOURCE ORA00051 51

    TOO_MANY_ROWS ORA01422 1422

    VALUE_ERROR ORA06502 6502

    ZERO_DIVIDE ORA01476 1476

    Unabrevedescripcindelasexcepcionespredefinidassiguen:

    Excepcin Segeneracuando...ACCESS_INTO_NULL Unprogramaintentaasignarvaloresalosatributosdeunobjetonoinicializado.CASE_NOT_FOUND NingunadelasopcionesenelCUANDOclusulasdeunCASEdeclaracinesseleccionado,ynohayELSE

    clusula.COLLECTION_IS_NULL UnprogramaintentaaplicarmtodosderecopilacindedistintosEXISTEaunatablaanidadasin

    inicializaroVARRAY,oelprogramaintentaasignarvaloresaloselementosdeunatablaanidadasininicializaroVARRAY.

    CURSOR_ALREADY_OPEN Unprogramaintentaabriruncursoryaestabierto.Uncursordebeestarcerradaantesdequepuedavolveraabrirse.UncursorPARAbucleseabreautomticamenteelcursoralqueserefiere,porloquesuprogramanopuedeabriresecursordentrodelbucle.

    DUP_VAL_ON_INDEX Unprogramaintentaalmacenarvaloresduplicadosenunacolumnadebasededatosqueestlimitadaporunndicenico.

    INVALID_CURSOR Unprogramaintentaunaoperacindecursorquenoestpermitido,comoelcierredeuncursorsinabrir.

    NMEROINVALIDO EnunasentenciaSQL,laconversindeunacadenadecaracteresenunaseriefallaporquelacadenanorepresentaunnmerovlido.(Enlasdeclaracionesdeprocedimiento,VALUE_ERRORseeleva.)EstaexcepcintambinseplanteacuandoelLMITEexpresinclauseenunamayorFETCHdeclaracinnoevalaaunnmeropositivo.

    LOGIN_DENIED UnprogramaintentainiciarsesinenOracleconunnombredeusuarioocontraseanovlidos.DATOSNOENCONTRADOS UnSELECTENinstruccindevuelveningunafila,osuprogramahacereferenciaaunelementode

    borradodeunatablaanidadaounelementonoinicializadoenunatabladendiceby.

    DebidoaqueestaexcepcinesutilizadointernamenteporalgunasfuncionesSQLparaindicarquehayanterminado,ustednodebeconfiarenestaexcepcinapropagarsesiseelevadentrodeunafuncinquesellamacomopartedeunaconsulta.

    NOT_LOGGED_ON UnprogramaemiteunallamadadebasededatossinestarconectadoaOracle.Program_Error PL/SQLtieneunproblemainterno.ROWTYPE_MISMATCH LavariabledecursoranfitrinyvariabledecursorPL/SQLqueparticipanenunamisinderetorno

    tienentiposincompatibles.Porejemplo,cuandounavariabledecursordeacogidaabiertasepasaaunsubprogramaalmacenado,lostiposderetornodelosparmetrosrealesyformalesdebensercompatibles.

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 5/16

    SELF_IS_NULL UnprogramaintentallamaraunMIEMBROmtodo,perolainstanciadeltipodeobjetonoseha

    inicializado.LosparmetrosincorporadosenSELFsealaalobjeto,yessiempreelprimerparmetropasadoaunMIEMBROmtodo.

    STORAGE_ERROR PL/SQLsequedasinmemoriaolamemoriasehacorrompido.SUBSCRIPT_BEYOND_COUNT UnprogramadereferenciaaunatablaoelementoVARRAYanidadautilizandounnmerodendice

    mayorqueelnmerodeelementosdelacoleccin.SUBSCRIPT_OUTSIDE_LIMIT UnprogramadereferenciaaunatablaoelementoVARRAYanidadautilizandounnmerodendice

    (1porejemplo)queestfueradelrangolegal.SYS_INVALID_ROWID Laconversindeunacadenadecaracteresenunarowiduniversalesfallaporquelacadenade

    caracteresnorepresentaunrowidvlida.TIMEOUT_ON_RESOURCE UntiempodeesperaseproducemientrasqueOracleestesperandoporunrecurso.TOO_MANY_ROWS UnSELECTENinstruccindevuelvemsdeunafila.VALUE_ERROR Seproduceunaoperacinaritmtica,deconversin,detruncamientooerrordetamaoen

    restricciones.Porejemplo,cuandoelprogramaseleccionaunvalordecolumnaenunavariabledecaracteres,sielvaloresmayorquelalongituddelavariabledeclarada,PL/SQLseanulalaasignacinyelevaVALUE_ERROR.Enlosestadosdeprocedimiento,VALUE_ERRORseelevasilaconversindeunacadenadecaracteresenunnmerofalla.(EnlassentenciasSQL,INVALID_NUMBERseeleva.)

    ZERO_DIVIDE Unprogramaintentadividirunnmeroporcero.

    DefinirsupropioPL/SQLExcepcionesPL/SQLpermitedefinirexcepcionesdesupropio.Adiferenciadeexcepcionespredefinidas,lasexcepcionesdefinidasporelusuariodebenserdeclaradosydebenplantearseexplcitamenteporRAISEdeclaraciones.

    DeclarandoPLExcepciones/SQL

    LasexcepcionespuedenserdeclaradassloenlapartedeclarativadeunbloquePL/SQL,subprogramaopaquete.Sedeclaraunaexcepcinmediantelaintroduccindesunombre,seguidodelapalabraclaveEXCEPCIN.Enelsiguienteejemplo,sedeclaraunaexcepcinllamadapast_due:

    DECLAREEXCEPCINpast_due;

    Deexcepcinylasdeclaracionesdevariablessonsimilares.Perorecuerde,unaexcepcinesunacondicindeerror,nounelementodedatos.Adiferenciadelasvariables,lasexcepcionesnopuedenaparecerenlasinstruccionesdeasignacinosentenciasSQL.Sinembargo,seaplicanlasmismasreglasdembitodevariablesyexcepciones.

    LasreglasdembitoparaPLExcepciones/SQL

    Nosepuededeclararunaexcepcindosvecesenelmismobloque.Puede,sinembargo,declararlamismaexcepcinendosbloquesdiferentes.

    Excepcionesdeclaradasenunbloqueseconsiderancomolocalesenesebloqueyglobalatodossussubbloques.Debidoaqueunbloquepuedehacerreferenciasloaexcepcioneslocalesoglobales,bloquesdecerramientonopuedenhacerreferenciaexcepcionesdeclaradasenunsubbloque.

    Siredeclareunaexcepcinglobalenunsubbloque,ladeclaracinlocalprevalece.Elsubbloquenopuedehacerreferencia,unaexcepcin,amenosquelaexcepcinsedeclaraenunbloqueetiquetadoycalificarsunombreconlaetiquetadelbloque:

    block_label.exception_name

    Elsiguienteejemploilustralasreglasdealcance:

    DECLAREEXCEPCINpast_due;acct_numNMERO;EMPEZAR

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 6/16

    EMPEZARDECLAREsubbloquecomienzaEXCEPCINpast_due;Estadeclaracinprevalece

    acct_numNMERO;FECHADUE_DATE:=SYSDATE1;todays_dateFECHA:=SYSDATE;EMPEZARSIDUE_DATE

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 7/16

    Unaaplicacinpuedellamarraise_application_errorslodesdeunsubprogramaalmacenadoejecutar(omtodo).Cuandosele

    llama,raise_application_errorterminaelsubprogramaydevuelveunnmerodeerrordefinidoporelusuarioymensajealaaplicacin.ElnmerodeerroryelmensajepuedenseratrapadoscomocualquiererrordeOracle.

    Enelejemplosiguiente,sellamaaraise_application_errorsiunacondicindeerrordesueleccinsucede(enestecaso,sielesquemaactualespropietariademenosde1000tablas):

    DECLAREnum_tablesNMERO;EMPEZARSELECTCOUNT(*)ENnum_tablesDEUSER_TABLES;SIENTONCES

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 8/16

    terminarelprocesamiento.PuedecolocarSUBIRdeclaracionesparaunaexcepcinquesedaencualquierlugardentrodelalcancedeestaexcepcin.Enelsiguienteejemplo,alertarasubloquePL/SQLparaunaexcepcindefinidaporelusuariollamado

    OUT_OF_STOCK:

    DECLAREEXCEPCINOUT_OF_STOCK;number_on_handNMERO:=0;EMPEZARSInumber_on_hand

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 9/16

    Figura102reglasdepropagacin:Ejemplo2

    Descripcindelailustracinlnpls010.gif

    Figura103reglasdepropagacin:Ejemplo3

    Descripcindelailustracinlnpls011.gif

    Unaexcepcinpuedepropagarsemsalldesumbitodeaplicacin,esdecir,msalldelbloqueenelquesedeclar.Consideremoselsiguienteejemplo:

    EMPEZARDECLAREsubbloquecomienzaEXCEPCINpast_due;FECHADUE_DATE:=Tronco(SYSDATE)1;todays_dateFECHA:=Tronco(SYSDATE);EMPEZARSIDUE_DATE

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 10/16

    Debidoaqueelbloquequedeclaralaexcepcinpast_duetieneningncontroladorparal,laexcepcinsepropagaalbloquequelocontiene.PeroelbloquequelocontienenosepuedehacerreferenciaalnombrePAST_DUE,porqueelmbitodondesedeclaryanoexiste.Unavezquesepierdeelnombredelaexcepcin,sloOTROScontroladorpuededetectarlaexcepcin.Sinohayuncontroladorparaunaexcepcindefinidaporelusuario,laaplicacinquellamaobtieneesteerror:

    ORA06510:PL/SQL:excepcinnocontroladadefinidaporelusuario

    ReraisingaPL/SQLExceptionAveces,deseavolverasubirunaexcepcin,esdecir,manejarlasituacinanivellocal,acontinuacin,pasaraunbloquequelocontiene.Porejemplo,esposiblequedeseedeshacerunatransaccinenelbloqueactual,acontinuacin,registrarelerrorenunbloquequelocontiene.

    Paravolverasubirunaexcepcin,utilizarunSUBIRdeclaracinsinunnombredeexcepcin,quesepermitesloenuncontroladordeexcepciones:

    DECLAREEXCEPCINsalary_too_high;NMEROcurrent_salary:=20,000;NMEROMAX_SALARY:=10000;NMEROerroneous_salary;EMPEZARCOMIENZOsubbloquecomienzaSIcurrent_salary>MAX_SALARYENTONCESAUMENTARsalary_too_high;AumentarlaexcepcinTERMINARASI;EXCEPCINCUANDOENTONCESsalary_too_highPrimerpasoenelmanejodelerrordbms_output.put_line('salario'||||erroneous_salary'Estfueraderango.');dbms_output.put_line("salariomximoes'||||MAX_SALARY'.');AUMENTO;VolverasubirlaexcepcinactualFINAL;extremossubbloqueEXCEPCINCUANDOENTONCESsalary_too_highGestionarelerrormsafondoerroneous_salary:=current_salary;current_salary:=MAX_SALARY;dbms_output.put_line('Revisinsalarialdel'||||erroneous_salary'A'||current_salary||)'.';FINAL;/

    ManejodeexcepcioneslevantadasPL/SQLCuandoseproduceunaexcepcin,laejecucinnormaldesuPL/SQLbloqueosubprogramasedetieneyelcontrolsetransfierealapartedecontroldeexcepciones,quetieneelformatodelasiguientemanera:

    EXCEPCINCUANDOENTONCESexception_name1manejadorsequence_of_statements1CUANDOENTONCESexception_name2otrocontroladorsequence_of_statements2...CUANDOOTROSENTONCEScontroladoropcionalsequence_of_statements3FINAL;

    Paracapturarlasexcepcionesplanteadas,seescribecontroladoresdeexcepciones.CadacontroladorconsisteenunaCUANDOclusula,queespecificaunaexcepcin,seguidodeunasecuenciadesentenciasqueseejecutancuandoseplanteaquelaexcepcin.Estasdeclaracionesdeejecucincompletadelbloqueosubprogramaelcontrolnovuelveallugardondeseproducelaexcepcin.Enotraspalabras,nosepuedereanudarelprocesodondelodej.

    ElopcionalOTROSgestordeexcepciones,quesiempreeselltimocontroladorenunbloqueosubprograma,actacomoelcontroladorparatodaslasexcepcionesnoexpresamentemencionadas.Porlotanto,unbloqueosubprogramapuedetenerslounaOTROSmanejador.

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 11/16

    Comomuestraelsiguienteejemplo,elusodelaOTROScontroladorgarantizaqueningunaexcepcinirnocontrolada:

    EXCEPCINCUANDOENTONCESGestionarelerrorCUANDOENTONCESGestionarelerrorCUANDOOTROSENTONCESManejartodoslosdemserroresFINAL;

    Sideseaquedosomsexcepcionesparaejecutarlamismasecuenciadeinstrucciones,unalistadelosnombresdeexcepcinenelCUANDOclusula,separndolosporlapalabraclaveO,delasiguientemanera:

    EXCEPCINCUANDOover_limitOunder_limitOENTONCESVALUE_ERRORGestionarelerror

    Siseobtienenningunadelasexcepcionesenlalista,seejecutalasecuenciaasociadadelosestados.LaspalabrasclaveOTROSnopuedenaparecerenlalistadenombresdeexcepcindebeaparecerporsmismo.Puedetenercualquiernmerodecontroladoresdeexcepciones,ycadacontroladorpuedeasociarunalistadeexcepcionesconunasecuenciadeinstrucciones.Sinembargo,unnombredeexcepcinpuedeaparecerslounavezenlapartedecontroldeexcepcionesdeunbloquePL/SQLosubprograma.

    LasreglasdealcancehabitualesparalasvariablesPL/SQLseaplican,porloquesepuedehacerreferenciaavariableslocalesyglobalesenuncontroladordeexcepciones.Sinembargo,cuandoseproduceunaexcepcindentrodeuncursorPARAbucle,elcursorsecierraimplcitamenteantesdequeseinvoqueelcontrolador.Porlotanto,losvaloresdelosatributosdecursorexplcitossonnodisponiblesenelcontrolador.

    Manejodeexcepcionesplanteadasenlasdeclaraciones

    Lasexcepcionespuedensercriadosenlasdeclaracionesdelasexpresionesdeinicializacindefectuosos.Porejemplo,lasiguientedeclaracinsuscitaunaexcepcinporquelaconstantecredit_limitnopuedealmacenarunnmeromayorque999:

    DECLAREcredit_limitnmeroconstante(3):=5000;PlanteaunaexcepcinEMPEZARNULO;EXCEPCINCUANDOOTROSENTONCESNosepuededetectarlaexcepcin.Estecontroladornosellamanunca.dbms_output.put_line('''tmanejarunaexcepcinenunadeclaracin.');FINAL;/

    Losmanipuladoresenelbloqueactualnopuededetectarlaexcepcinplanteadaunaexcepcinporquesecrienunadeclaracinpropagainmediatamentealbloquequelocontiene.

    Manejodeexcepcionesplanteadasenlosmanipuladores

    Cuandoseproduceunaexcepcindentrodeuncontroladordeexcepciones,elmismocontroladornopuededetectarlaexcepcin.Unaexcepcinplanteadadentrodeunmanejadorpropagainmediatamentealbloquequelocontiene,loquesebuscaencontraruncontroladorparaestenuevoexcepcin.Apartirdeah,laexcepcinsepropaganormalmente.Porejemplo:

    EXCEPCINCUANDOENTONCESINVALID_NUMBERINSERTINTO...podraplantearDUP_VAL_ON_INDEXCUANDODUP_VAL_ON_INDEXENTONCES...nopuededetectarlaexcepcinFINAL;

    Laramificacinhaciaodesdeuncontroladordeexcepciones

    UnGOTOdeclaracinpuedepasardeuncontroladordeexcepcionesenunbloquequelocontiene.

    UnGOTOdeclaracinnopuedepasarauncontroladordeexcepciones,odesdeuncontroladordeexcepcionesenelbloqueactual.

    RecuperandoelCdigodeerrorymensajedeerror:SQLCODEySQLERRM

    Traducidoal: espaol Mostrartextooriginal Opciones

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 12/16

    RecuperandoelCdigodeerrorymensajedeerror:SQLCODEySQLERRM

    Enuncontroladordeexcepciones,puedeutilizarlafuncinincorporadadeSQLCODEySQLERRMparasaberquseprodujoelerroryhacerllegarelmensajedeerrorasociado.Paralasexcepcionesinternas,SQLCODEdevuelveelnmerodelerrordeOracle.ElnmeroqueSQLCODEretornosesnegativoamenosqueelerrordeOracleesnohaydatosqueseencuentran,encuyocasoSQLCODEdevuelve100.SQLERRMdevuelveelmensajedeerrorcorrespondiente.ElmensajecomienzaconelcdigodeerrorOracle.

    Paralasexcepcionesdefinidasporelusuario,SQLCODEdevuelve1ySQLERRMdevuelveelmensaje:excepcindefinidaporelusuario.

    menosquehayautilizadoelpragmaEXCEPTION_INITparaasociarelnombredelaexcepcinconunnmerodeerrordeOracle,encuyocasoSQLCODEdevuelveesenmerodeerrorySQLERRMdevuelveelmensajedeerrorcorrespondiente.LalongitudmximadeunmensajedeerrordeOracleesde512caracteres,incluyendoelcdigodeerror,mensajesanidados,ylosinsertosdemensajestalescomonombresdetablaycolumna.

    Sinoeslaexcepcinhasidoplanteada,SQLCODEdevuelveceroySQLERRMdevuelveelmensaje:ORA0000:,completarconxitolanormalidad.

    PuedepasarunnmerodeerrordeSQLERRM,encuyocasoSQLERRMdevuelveelmensajeasociadoaesenmerodeerror.AsegresedequepasenmerosdeerrornegativosparaSQLERRM.

    ElpasodeunnmeropositivoparaSQLERRMsiempredevuelveelmensajedeexcepcindefinidaporelusuarioamenosquepase100,encuyocasoSQLERRMdevuelveelmensajeNoseencontrarondatos.PasarunceroaSQLERRMsiempredevuelveelmensajedelonormal,lafinalizacinconxito.

    NosepuedeutilizarSQLCODEoSQLERRMdirectamenteenunainstruccinSQL.Ensulugar,debeasignarsusvaloresalasvariableslocales,acontinuacin,utilizarlasvariablesenlainstruccinSQL,comosemuestraenelsiguienteejemplo:

    DECLAREerr_msgVARCHAR2(100);EMPEZAR/*ObtenerunpardemensajesdeerrordeOracle.*/PARAerr_numENBUCLE1..3err_msg:=SUBSTR(SQLERRM(err_num),1100);dbms_output.put_line("Nmerodeerror='||err_num);dbms_output.put_line('mensajedeerror='||err_msg);LOOPEND;FINAL;/

    LafuncindecadenaSUBSTRaseguraqueunVALUE_ERRORexcepcin(portruncamiento)noseproducecuandoseasignaelvalordeSQLERRMaERR_MSG.LasfuncionesdeSQLCODEySQLERRMsonespecialmentetilesenelOTROSgestordeexcepcionesporquetedicenquesehayaformuladoexcepcininterna.

    Nota:CuandoseutilizapragmaRESTRICT_REFERENCESparaafirmarlapurezadeunafuncinalmacenada,nosepuedeespecificarlasrestriccionesWNPSyRNPSsilafuncinsellamaaSQLCODEoSQLERRM.

    Lacapturadeexcepcionesnocontroladas

    Recuerde,sinopuedeencontraruncontroladorparaunaexcepcinplanteada,PL/SQLdevuelveunaerrordeexcepcinnocontroladaalmedioambientedeacogida,loquedeterminaelresultado.Porejemplo,enelentornodeOraclePrecompiladores,cualquiercambiodebasededatosrealizadasporunainstruccinSQLfalladoobloquePL/SQLsedeshacen.

    Lasexcepcionesnocontroladastambinpuedenafectarsubprogramas.Sisaledeunsubprogramaconxito,PL/SQLasignavaloresaOUTparmetros.Sinembargo,sisaleconunaexcepcinnocontrolada,PL/SQLnoasignavaloresaOUTparmetros(amenosqueseanNOCOPYparmetros).Adems,siunsubprogramaalmacenadofallaconunaexcepcinnocontrolada,PL/SQLnonohacerretrocedereltrabajodebasededatosrealizadoporelsubprograma.

    PuedeevitarlasexcepcionesnocontroladascodificandounaOTROSmanipuladorenelnivelmsaltodetodoslosprogramasPL/SQL.

    ConsejosparaelmanejodeerroresPL/SQLEnestaseccin,seaprendetrestcnicasqueaumentanlaflexibilidad.

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 13/16

    Continuandodespusseproduceunaexcepcin

    Uncontroladordeexcepcioneslepermiterecuperarsedeunerrorfataldeotromodoantesdesalirdeunbloque.Perocuandoelcontroladorsecompleta,elbloquesetermina.Nosepuedevolveralbloqueactualdesdeuncontroladordeexcepciones.Enelsiguienteejemplo,sielSELECTENafirmacinplanteaZERO_DIVIDE,nosepuedereanudarconelINSERTdeclaracin:

    DECLAREpe_ratioNMERO(3,1);EMPEZARCANCELACINdeestadsticasDONDEsmbolo="XYZ";preciosSELECT/NVL(ganancias,0)ENpe_ratiodelasexistenciasDONDEsmbolo="XYZ";INSERTINTOEstadsticas(smbolo,relacin)VALUES('XYZ',pe_ratio);EXCEPCINCUANDOENTONCESZERO_DIVIDENULO;FINAL;/

    Todavasepuedemanejarunaexcepcinparauncomunicado,acontinuacin,contineconelsiguientecomunicado.Colocarladeclaracinensupropiasubbloqueconsuspropiosmanejadoresdeexcepciones.Siseproduceunerrorenelsubbloque,uncontroladorlocalpuededetectarlaexcepcin.Cuandoterminaelsubbloque,elbloquequelocontienesigueejecutndoseenelpuntodondeterminalasubbloque.Consideremoselsiguienteejemplo:

    DECLAREpe_ratioNMERO(3,1);EMPEZARCANCELACINdeestadsticasDONDEsmbolo="XYZ";COMIENZOsubbloquecomienzapreciosSELECT/NVL(ganancias,0)ENpe_ratiodelasexistenciasDONDEsmbolo="XYZ";EXCEPCINCUANDOENTONCESZERO_DIVIDEpe_ratio:=0;FINAL;extremossubbloqueINSERTINTOEstadsticas(smbolo,relacin)VALUES('XYZ',pe_ratio);EXCEPCINCUANDOOTROSENTONCESNULO;FINAL;/

    Enesteejemplo,sielSELECTENdeclaracinplanteaunaZERO_DIVIDEdeexcepciones,lalocal,locogeyseponepe_ratioacero.Laejecucindelgestorsehacompletado,porloqueelsubbloquetermina,ylaejecucincontinaconlaINSERTcomunicado.

    TambinpuederealizarunasecuenciadeoperacionesdeDML,dondealgunospuedenfallar,yprocesarlasexcepcionesslodespusdequetodalaoperacinsehacompletado,comosedescribeenelapartado"ManejoFORALLexcepcionesconlosBULK_EXCEPTIONS%atributo".

    unatransaccindereintentar

    Despusseproduceunaexcepcin,enlugardeabandonarsutransaccin,esposiblequedeseevolveraintentarlo.Latcnicaes:

    1.Encajonarlatransaccinenunsubbloque.

    2.Coloqueelsubbloquedentrodeunbuclequeserepitelaoperacin.

    3.Antesdeiniciarlaoperacin,marcarunpuntodesalvaguarda.Silaoperacintienexito,secomprometen,acontinuacin,salirdelbucle.Silaoperacinfalla,elcontrolsetransfierealcontroladordeexcepciones,elquerodardenuevoalpuntoderescatededeshacertodosloscambios,acontinuacin,tratardesolucionarelproblema.

    Enelsiguienteejemplo,elINSERTdeclaracinpodraprovocarunaexcepcinacausadeunvalorduplicadoenunacolumnanica.Enesecaso,cambiamoselvalorquetienequesernicoycontinuarconlasiguienteiteracindelbucle.Sielinsertotienexito,salimosdelbucleinmediatamente.Conestatcnica,sedebeutilizarunaPARAoWHILEbucleparalimitarelnmerodeintentos.

    DECLAREnombrarVARCHAR2(20);ans1VARCHAR2(3);ANS2VARCHAR2(3);ans3VARCHAR2(3);

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 14/16

    ans3VARCHAR2(3);NMEROsufijo:=1;

    EMPEZARFORiIN1..10LOOPTrato10vecesCOMENZARsubbloquecomienzastart_transactionpuntodeguardado;Marqueunjefe/*Eliminafilasdeunatabladeresultadosdelaencuesta.*/CANCELACINderesultadosDONDEanswer1="NO";/*Aadirelnombreylasrespuestasdeunencuestado.*/INSERTINTOVALORESresultados(nombre,ans1,ANS2,ans3);PlanteaunaDUP_VAL_ON_INDEXsidosencuestadostienenelmismonombreCOMETER;SALIDA;EXCEPCINCUANDOENTONCESDUP_VAL_ON_INDEXROLLBACKTOstart_transaction;deshacercambiossufijo:=sufijo+1;TratardesolucionarunproblemaNombre:nombre=||TO_CHAR(sufijo);FINAL;extremossubbloqueLOOPEND;FINAL;/

    Elusodevariablesdelocalizadorparaidentificarlugaresdeexcepcin

    Utilizandounodegestindeexcepcionesparaunasecuenciadeinstrucciones,talescomoINSERT,DELETE,oACTUALIZACINdeclaraciones,puedeenmascararlasentenciaquecausunerror.Siloquenecesitasaberquafirmacinno,sepuedeutilizarunavariablelocalizadora:

    DECLAREpropmente;nombrarVARCHAR2(100);EMPEZARsent:=1;Designa1instruccinSELECTSELECTINTOnombre_tablanombreuser_tablesDEDONDEnombre_tablaLIKE'%ABC';sent:=2;DesignasegundainstruccinSELECTSELECTINTOnombre_tablanombreuser_tablesDEDONDEnombre_tablaLIKE'XYZ%';EXCEPCINCUANDOENTONCESNO_DATA_FOUNDdbms_output.put_line('Nombredelatablanoseencuentraenconsulta'||prop);FINAL;/

    VistageneraldealarmasPL/SQLtiempodecompilacinParahacersusprogramasmsrobustosyevitarproblemasentiempodeejecucin,puedeactivarlacomprobacindeciertascondicionesdeadvertencia.Estascondicionesnosonlosuficientementegravescomoparaproducirunerroryleimpidenlacompilacindeunsubprograma.Podransealaralgoenelsubprogramaqueproduceunresultadonodefinidoopodracrearunproblemaderendimiento.

    ParatrabajarconmensajesdeadvertenciaPL/SQL,seutilizaelPLSQL_WARNINGSparmetrodeinicializacin,elDBMS_WARNINGpaquete,ylos/DBA/usuarioALL_PLSQL_OBJECT_SETTINGSvistas.

    PL/SQLdeadvertenciaCategoras

    mensajesdeadvertenciaPL/SQLsedividenencategoras,porloquesepuedesuprimirogruposdevisualizacindeadvertenciassimilaresdurantelacompilacin.Lascategorasson:

    Grave:Mensajesparalascondicionesquepuedenprovocaruncomportamientoinesperadooresultadoserrneos,talescomoproblemasdesolapamientoconparmetros.

    Rendimiento:Mensajesparalascondicionesquepuedencausarproblemasderendimiento,talescomopasarunVARCHAR2valoraunNMEROcolumnaenunINSERTcomunicado.

    Informativo:Mensajesparacondicionesquenotienenunefectosobreelrendimientoolacorreccin,peroquepuedequedeseecambiarparahacerelcdigomsfcildemantener,comoporejemploelcdigomuertoquenopuedeserejecutado.

    LapalabraclaveTodoesunaformaabreviadadereferirseatodoslosmensajesdeadvertencia.

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 15/16

    LapalabraclaveTodoesunaformaabreviadadereferirseatodoslosmensajesdeadvertencia.

    Tambinpuedetratarmensajesparticularescomoerroresenlugardeadvertencias.Porejemplo,sisesabequeelmensajedeadvertenciaPLW05003representaungraveproblemaensucdigo,incluyendo'ERROR:05003'enelPLSQL_WARNINGSajustehacequelacondicindedisparounmensajedeerror(PLS_05003)enlugardeunmensajedeadvertencia.Unmensajedeerrorhacequelacompilacinfalle.

    ElcontroldePLMensajesdeadvertencia/SQL

    ParapermitirlaedicindebasededatosdemensajesdeadvertenciadurantelacompilacinPL/SQL,seestableceelparmetrodeinicializacinPLSQL_WARNINGS.Puedeactivarydesactivarcategorascompletasdeadvertencias(ALL,GRAVES,INFORMATIVO,RENDIMIENTO),activarydesactivarlosnmerosdemensajesespecficos,yhacerquelabasededatosatratarciertosavisoscomoerroresdecompilacinparaqueesascondicionesdebensercorregidas.

    Esteparmetrosepuedeestableceraniveldesistemaoelniveldesesin.TambinpuedeconfigurarloparaqueunasolacompilacinincluyndolocomopartedelaALTERPROCEDUREcomunicado.Esposibleactivartodaslasadvertenciasduranteeldesarrollo,apaguetodaslasadvertenciascuandoeldesplieguedeproduccin,oencenderalgunasadvertenciascuandosetrabajaenunsubprogramaparticularcuandoustedestpreocupadoconalgnaspecto,comoelcdigooelrendimientoinnecesaria.

    AlteracionesenelsistemaSETPLSQL_WARNINGS='Habilitar:ALL';Paraladepuracinduranteeldesarrollo.ALTERSESSIONSETPLSQL_WARNINGS='Habilitar:RENDIMIENTO';Centrarseenunaspecto.ALTERPROCEDUREholaCOMPILEPLSQL_WARNINGS='ENABLE:RENDIMIENTO';Vuelvaacompilarconlacomprobacinadicional.'DISABLE:ALL'ALTERSESSIONSET=PLSQL_WARNINGS;Paradesactivartodaslasadvertencias.Queremossaberacercadelasadvertencias'graves',noquierenorhablarde"rendimiento"advertenciasyquierenPLW06002advertenciasparaproducirloserroresquefrenenlacompilacin.ALTERSESSIONSETPLSQL_WARNINGS='Habilitar:Grave','DISABLE:RENDIMIENTO','ERROR:06002';

    LosmensajesdeadvertenciapuedenseremitidosdurantelacompilacindesubprogramasPL/SQLbloquesannimosnoproducenningunaadvertencia.

    LosajustesparaelPLSQL_WARNINGSparmetrosealmacenanjuntoconcadasubprogramacompilado.SivuelveacompilarelsubprogramaconunaCREAROSUSTITUIRdeclaracin,seutilizanlosvaloresactualesdelasesin.SivuelveacompilarelsubprogramaconunALTER...COMPILEcomunicado,laconfiguracindelasesinactualpodraserutilizado,olaconfiguracinoriginalquesealmacenaconelsubprograma,dependiendodesiseincluyenlosAJUSTESDEREUTILIZACINclusulaenelcomunicado.

    Paraverlosavisosgeneradosdurantelacompilacin,seutilizaelSQL*PlusVERERRORESordenoconsultalaUSER_ERRORSvistadeldiccionariodedatos.PL/SQLtodoslosmensajesdeadvertenciautilizanelprefijodelasMEL.

    UtilizandoelpaqueteDBMS_WARNING

    SiustedestescribiendounentornodedesarrolloquecompilaPLsubprogramas/SQL,puedecontrolarlosmensajesdeadvertenciaPL/SQLllamandosubprogramasenelDBMS_WARNINGpaquete.Tambinpuedeutilizarestepaquetealcompilarunaaplicacincompleja,compuestadevariassecuenciasdecomandosSQL*Plusanidada,dondelasdiferentesopcionesdeadvertenciaseaplicanalosdiferentessubprogramas.PuedeguardarelestadoactualdelaPLSQL_WARNINGSparmetroconunallamadaalpaquete,cambiarelparmetroparacompilarunconjuntoparticulardesubprogramas,acontinuacin,restaurarelvalororiginaldelparmetro.

    Porejemplo,aquesunprocedimientoconcdigoinnecesarioquepodraserquitada.Podrarepresentarunerror,opodraserocultadointencionalmenteporunindicadordedepuracin,porloquepodraonopodradesearunmensajedeadvertenciaparaello.

    CREAROSUSTITUIRdead_codePROCEDIMIENTOCOMOnmerox:=10;EMPEZARsix=10,entoncesx:=20;msx:=100;Cdigomuerto(nuncaalcanzado)terminarasi;FINdead_code;/Pordefecto,elprocedimientoanteriorcompilasinerroresniadvertencias.

    Ahorapermitirquetodoslosmensajesdeadvertencia,sloparaestasesin.LLAMEDBMS_WARNING.SET_WARNING_SETTING_STRING("ACTIVAR:ALL','sesin');

  • 11/2/2016 10GestindeerroresdePL/SQL

    https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm 16/16

    Anterior Siguiente

    Compruebeelajustedealertaactual.seleccionedbms_warning.get_warning_setting_string()deladoble;

    Cuandovolvamosacompilarelprocedimiento,vamosaverunaadvertenciasobreelcdigomuerto.ALTERPROCEDIMIENTOdead_codeCOMPILE;

    Vasetambin:ALTERPROCEDIMIENTO,DBMS_WARNINGpaqueteenelPL/SQLpaquetesytiposdereferencia,losmensajesPLWlosmensajesdeerrordebasededatosOracle

    Copyright1996,OracleCorporation2003Todoslosderechosreservados. Hogar Listade

    librosContenido ndice ndice

    maestroRealimentacin