10 gestión de errores de pl _ sql - manejo de exceptions
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