You are on page 1of 16

11/2/2016

10GestindeerroresdePL/SQL

SaltarCabeceras
GuadeReferenciayPL/SQLdelusuario
10gRelease1(10.1)
NmerodeparteB1080701

Hogar

Listade
libros

Contenido ndice

ndice
maestro

Realimentacin

VerPDF
Anterior Siguiente

10ManejodeerroresPL/SQL
Nohaynadamsexcitantequeserdisparadosinresultado.WinstonChurchill
loserroresdetiempodeejecucinsedebenaerroresdediseo,erroresdecodificacin,fallosdehardware,ymuchasotrasfuentes.
Aunquenosepuedeanticipartodoslosposibleserrores,sepuedeplanificarparamanejarciertostiposdeerroressignificativosen
suprogramaPL/SQL.
Conmuchoslenguajesdeprogramacin,amenosquedeshabilitelacomprobacindeerrores,unerrordetiempodeejecucin
comoeldesbordamientodepilaodivisinporcerosedetieneelprocesamientonormalydevuelveelcontrolalsistemaoperativo.
ConPL/SQL,unmecanismollamadoelmanejodeexcepcioneslepermite"apruebadebalas"elprogramademodoquepueda
continuaroperandoenpresenciadeerrores.
Estecaptulocontienelossiguientestemas:
VisingeneraldePL/SQLentiempodeejecucinControldeerrores
VentajasdePLExcepciones/SQL
ResumendelasexcepcionespredefinidasPL/SQL
DefinirsupropioPL/SQLExcepciones
CmosecranPLExcepciones/SQL
CmoPLExcepciones/SQLdepropagacinde
ReraisingaPL/SQLException
ManejodeexcepcioneslevantadasPL/SQL
ConsejosparaelmanejodeerroresPL/SQL
VistageneraldealarmasPL/SQLtiempodecompilacin

VisingeneraldePL/SQLentiempodeejecucinControldeerrores
EnPL/SQL,unacondicindeerrorsedenominaexcepcin.Lasexcepcionespuedenserdefinidosinternamente(porelsistema
detiempodeejecucin)odefinidosporelusuario.Losejemplosdeexcepcionesdefinidasinternamenteincluyenladivisinpor
ceroysinmemoria.Algunasexcepcionesinternascomunestienennombrespredefinidos,comoZERO_DIVIDEySTORAGE_ERROR.
Lasotrasexcepcionesinternassepuedendarnombres.
SepuededefinirexcepcionesdesucuentaenlapartedeclarativadecualquierbloquePL/SQL,subprogramaopaquete.Por
ejemplo,esposibledefinirunaexcepcinconnombreinsufficient_fundsacuentasbancariasendescubiertobandera.A
diferenciadeexcepcionesinternas,lasexcepcionesdefinidasporelusuariodebendarnombres.
Cuandoseproduceunerror,esunaexcepcinlevant.Esdecir,lonormalinterrumpelaejecucinyelcontrolsetransfiereala
partedecontroldeexcepcionesdesubloquePL/SQLosubprograma.Excepcionesinternassoncriadosdemaneraimplcita
(automticamente)porelsistemadetiempodeejecucin.Excepcionesdefinidasporelusuariodebenserplanteadasexplcitamente
porRAISEdeclaraciones,quetambinpuedenelevarexcepcionespredefinidas.
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm

1/16

11/2/2016

10GestindeerroresdePL/SQL

Paracontrolarlasexcepcionesplanteadas,seescriberutinasseparadasllamadascontroladoresdeexcepciones.Despusseejecuta
uncontroladordeexcepciones,elbloqueactualdejadeejecucinyelbloquequelocontienesereanudaconlasiguiente
instruccin.Sinohayunbloquequelocontiene,elcontrolvuelvealaentornodeacogida.
Elsiguienteejemplocalculaunarelacinpreciogananciasdeunaempresa.Silaempresatieneceroingresos,laoperacinde
divisinlanzalaexcepcinpredefinidaZERO_DIVIDE,laejecucindelbloqueseinterrumpe,yelcontrolsetransfierealos
controladoresdeexcepciones.elopcionalOTROScontroladordecapturatodaslasexcepcionesqueelbloquenoespecificaelnombre.
AJUSTEENserveroutput;
DECLARE
NMEROSTOCK_PRICE:=9.73;
net_earningsNMERO:=0;
pe_ratioNMERO;
EMPEZAR
Clculopodracausarerrordedivisinporcero.
pe_ratio:=STOCK_PRICE/net_earnings;
dbms_output.put_line'(Precio/beneficioratio='||pe_ratio);
EXCEPCINloscontroladoresdeexcepcionescomienzan
Slounodeloscuandolosbloquesseejecuta.
CUANDOENTONCESZERO_DIVIDE'divisinporcero'mangosdeerror
dbms_output.put_line('Compaadebehabertenidoceroganancias.');
pe_ratio=null;
CUANDOOTROSENTONCESmanejatodoslosdemserrores
dbms_output.put_line('Algnotrotipodeerrorsehaproducido.');
pe_ratio=null;
FINAL;Manejadoresdeexcepcionesyfinaldelasecuenciaaqu
/

Elltimoejemploilustraelmanejodeexcepciones.Conunpocomejorcomprobacindeerrores,podramoshaberevitadola
excepcindeltodo,mediantelasustitucindeunvalornuloalarespuestasieldenominadorescero:
DECLARE
NMEROSTOCK_PRICE:=9.73;
net_earningsNMERO:=0;
pe_ratioNMERO;
EMPEZAR
pe_ratio=
net_earningsdecasos
0cuandounvalornulo
STOCK_PRICE/net_earningsdems
final;
FINAL;
/

NormasparaevitarloserroresymanejodePL/SQLyexcepciones
Debidoaquelafiabilidadescrucialparalosprogramasdebasesdedatos,utilicelacomprobacintantodeerroresycontrolde
excepcionesparaasegurarquesuprogramapuedemanejartodaslasposibilidades:
Agregarcontroladoresdeexcepcionescadavezquehayalgunaposibilidaddequeseproduzcaunerror.Loserroresson
especialmenteprobabledurantelosclculosaritmticos,lamanipulacindecadenas,ylasoperacionesdebasededatos.Los
errorestambinpuedenocurrirenotrasocasiones,porejemplo,siunfallodehardwareconelalmacenamientoolamemoria
dediscoprovocaunproblemaquenotienenadaqueverconsucdigoperoelcdigotodavatienequetomarmedidas
correctivas.
Aadiruncdigodecomprobacindeerroressiempresepuedepredecirquepodraproducirseunerrorsielcdigoobtiene
losdatosdeentradaincorrecta.Esperarqueenalgnmomento,sucdigoserpasadoparmetrosincorrectosonulos,que
lasconsultasvolvernningunafilaomsfilasdelosqueesperaba.
Hagasusprogramaslosuficientementerobustocomoparatrabajarinclusosilabasededatosnoestenelestadoqueespera.
Porejemplo,talvezunatablaseconsultahabrcolumnasaadidooeliminado,osustiposcambiado.Puedeevitarestos
problemasmedianteladeclaracindevariablesindividualescon%TIPOfasedeclasificacin,yladeclaracinderegistros
paramantenerresultadosdelaconsultacon%ROWTYPEcalificadores.

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

2/16

11/2/2016

10GestindeerroresdePL/SQL

paramantenerresultadosdelaconsultacon%ROWTYPEcalificadores.

Controlarlasexcepcionesnombradassiemprequeseaposible,enlugardeutilizarcuandootrosenloscontroladoresde
excepciones.Aprenderlosnombresylascausasdelasexcepcionespredefinidas.Sisusoperacionesdebasesdedatos
puedencausarerroresORAparticulares,nombresasociadosconestoserroresparaquepuedaescribircontroladorespara
ellos.(Ustedaprendercmohaceresomsadelanteenestecaptulo).
Probarelcdigocondiferentescombinacionesdemalosdatosparaverqusurgenerrorespotenciales.
Escribirinformacindedepuracinensuscontroladoresdeexcepciones.Esposiblealmacenardichainformacinenuna
tablaseparada.Siesas,hacerlohaciendounallamadaaunprocedimientodeclaradaconlaPRAGMAAUTONOMOUS_TRANSACTION
,porloquepuedecomprometersuinformacindedepuracin,inclusosivuelveeltrabajoqueelprocedimientoprincipal
estabahaciendo.
Considerecuidadosamentesicadacontroladordeexcepcionesdebeconfirmarlatransaccin,rodarhaciaatrs,odejarque
contine.Recuerde,noimportaqutangraveeselerror,quequieredejarlabasededatosenunestadocoherenteyevitarel
almacenamientodelosdatosdaados.

VentajasdePLExcepciones/SQL
Elusodeexcepcionesparaeltratamientodeerrorestienevariasventajas.
Conexcepciones,sepuedemanejardeformafiablelosposibleserroresdemuchosestadosconunsolocontroladordeexcepciones:
EMPEZAR
SELECT...
SELECT...
procedure_that_performs_select();
...
EXCEPCIN
CUANDOENTONCESNO_DATA_FOUNDatrapatodo"nosehanencontradodatos"errores

Enlugardelacomprobacindeunerrorencadapuntoquepodraocurrir,slotienequeaadiruncontroladordeexcepcionesasu
bloquePL/SQL.Silaexcepcinseaumentnuncaenesebloque(ocualquiersubbloque),puedeestarsegurodequeser
manejado.
Aveces,elerrornoesinmediatamenteevidente,ynosepudodetectarhastamstardecuandoserealizanclculosapartirdedatos
malos.Unavezms,unnicocontroladordeexcepcionespuedenatrapartodosloserroresdedivisinporcero,malossubndices
dematriz,yassucesivamente.
Sinecesitacomprobarsihayerroresenunpuntoespecfico,puedeincluirunnicoestadoogrupodeestadosdentrodesupropio
bloqueBEGINENDconsupropiocontroladordeexcepciones.Puedehacerqueelcontrolsealomsgeneralotanprecisacomo
desee.
Elaislamientodelasrutinasdecontroldeerroreshacequeelrestodelprogramaseamsfcildeleeryentender.

ResumendelasexcepcionespredefinidasPL/SQL
UnaexcepcininternaseelevadeformaautomticasielprogramaPL/SQLinfringeunaregladeOracleoexcedeunlmite
dependientedelsistema.PL/SQLpermitepredefiniralgunoserroresdeOraclecomunescomoexcepciones.Porejemplo,PL/
SQLplantealaexcepcinpredefinidaNO_DATA_FOUNDsiunSELECTENinstruccindevuelveningunafila.
PuedeusarelpragmaEXCEPTION_INITparaasociarnombresdeexcepcinconotroscdigosdeerrordeOraclequepuedeanticipar.
ParacontrolarloserroresinesperadosdeOracle,puedeutilizarlaOTROSmanejador.Dentrodeestecontrolador,puedellamaralas
funcionesdeSQLCODEySQLERRMparadevolverelcdigodeerrordeOracleyeltextodelmensaje.Unavezqueconozcaelcdigo
deerror,sepuedeutilizarconelpragmaEXCEPTION_INITyescribiruncontroladorespecficamenteparaeseerror.
PL/SQLdeclaraexcepcionespredefinidasanivelmundialenelpaqueteSTANDARD.Ustednolosnecesitadeclares.Puedeescribir
controladoresdeexcepcionespredefinidasutilizandolosnombresdelalistasiguiente:
Excepcin

OracleError

SQLCODEValor

ACCESS_INTO_NULL

ORA06530

6530

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

6592

3/16

11/2/2016
CASE_NOT_FOUND

10GestindeerroresdePL/SQL
ORA06592

6592

COLLECTION_IS_NULL

ORA06531

6531

CURSOR_ALREADY_OPEN

ORA06511

6511

DUP_VAL_ON_INDEX

ORA00001

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.
NingunadelasopcionesenelCUANDOclusulasdeunCASEdeclaracinesseleccionado,ynohayELSE
clusula.
UnprogramaintentaaplicarmtodosderecopilacindedistintosEXISTEaunatablaanidadasin
inicializaroVARRAY,oelprogramaintentaasignarvaloresaloselementosdeunatablaanidadasin
inicializaroVARRAY.
Unprogramaintentaabriruncursoryaestabierto.Uncursordebeestarcerradaantesdequepueda
volveraabrirse.UncursorPARAbucleseabreautomticamenteelcursoralqueserefiere,porloquesu
programanopuedeabriresecursordentrodelbucle.
Unprogramaintentaalmacenarvaloresduplicadosenunacolumnadebasededatosqueestlimitada
porunndicenico.
Unprogramaintentaunaoperacindecursorquenoestpermitido,comoelcierredeuncursorsin
abrir.

CASE_NOT_FOUND
COLLECTION_IS_NULL

CURSOR_ALREADY_OPEN

DUP_VAL_ON_INDEX
INVALID_CURSOR
NMEROINVALIDO

EnunasentenciaSQL,laconversindeunacadenadecaracteresenunaseriefallaporquelacadenano
representaunnmerovlido.(Enlasdeclaracionesdeprocedimiento,VALUE_ERRORseeleva.)Esta
excepcintambinseplanteacuandoelLMITEexpresinclauseenunamayorFETCHdeclaracinno
evalaaunnmeropositivo.

LOGIN_DENIED

UnprogramaintentainiciarsesinenOracleconunnombredeusuarioocontraseanovlidos.

DATOSNOENCONTRADOS

UnSELECTENinstruccindevuelveningunafila,osuprogramahacereferenciaaunelementode
borradodeunatablaanidadaounelementonoinicializadoenunatabladendiceby.
DebidoaqueestaexcepcinesutilizadointernamenteporalgunasfuncionesSQLparaindicarque
hayanterminado,ustednodebeconfiarenestaexcepcinapropagarsesiseelevadentrodeuna
funcinquesellamacomopartedeunaconsulta.

NOT_LOGGED_ON

UnprogramaemiteunallamadadebasededatossinestarconectadoaOracle.

Program_Error

PL/SQLtieneunproblemainterno.

ROWTYPE_MISMATCH

LavariabledecursoranfitrinyvariabledecursorPL/SQLqueparticipanenunamisinderetorno
tienentiposincompatibles.Porejemplo,cuandounavariabledecursordeacogidaabiertasepasaaun
subprogramaalmacenado,lostiposderetornodelosparmetrosrealesyformalesdebenser
compatibles.

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

4/16

11/2/2016

SELF_IS_NULL

10GestindeerroresdePL/SQL

UnprogramaintentallamaraunMIEMBROmtodo,perolainstanciadeltipodeobjetonoseha

inicializado.LosparmetrosincorporadosenSELFsealaalobjeto,yessiempreelprimerparmetro
pasadoaunMIEMBROmtodo.
STORAGE_ERROR
PL/SQLsequedasinmemoriaolamemoriasehacorrompido.
SUBSCRIPT_BEYOND_COUNT UnprogramadereferenciaaunatablaoelementoVARRAYanidadautilizandounnmerodendice
mayorqueelnmerodeelementosdelacoleccin.
SUBSCRIPT_OUTSIDE_LIMIT

UnprogramadereferenciaaunatablaoelementoVARRAYanidadautilizandounnmerodendice
(1porejemplo)queestfueradelrangolegal.

SYS_INVALID_ROWID

Laconversindeunacadenadecaracteresenunarowiduniversalesfallaporquelacadenade
caracteresnorepresentaunrowidvlida.

TIMEOUT_ON_RESOURCE

UntiempodeesperaseproducemientrasqueOracleestesperandoporunrecurso.
UnSELECTENinstruccindevuelvemsdeunafila.

TOO_MANY_ROWS
VALUE_ERROR

ZERO_DIVIDE

Seproduceunaoperacinaritmtica,deconversin,detruncamientooerrordetamaoen
restricciones.Porejemplo,cuandoelprogramaseleccionaunvalordecolumnaenunavariablede
caracteres,sielvaloresmayorquelalongituddelavariabledeclarada,PL/SQLseanulalaasignacin
yelevaVALUE_ERROR.Enlosestadosdeprocedimiento,VALUE_ERRORseelevasilaconversindeuna
cadenadecaracteresenunnmerofalla.(EnlassentenciasSQL,INVALID_NUMBERseeleva.)
Unprogramaintentadividirunnmeroporcero.

DefinirsupropioPL/SQLExcepciones
PL/SQLpermitedefinirexcepcionesdesupropio.Adiferenciadeexcepcionespredefinidas,lasexcepcionesdefinidasporel
usuariodebenserdeclaradosydebenplantearseexplcitamenteporRAISEdeclaraciones.

DeclarandoPLExcepciones/SQL
LasexcepcionespuedenserdeclaradassloenlapartedeclarativadeunbloquePL/SQL,subprogramaopaquete.Sedeclarauna
excepcinmediantelaintroduccindesunombre,seguidodelapalabraclaveEXCEPCIN.Enelsiguienteejemplo,sedeclarauna
excepcinllamadapast_due:
DECLARE
EXCEPCINpast_due;

Deexcepcinylasdeclaracionesdevariablessonsimilares.Perorecuerde,unaexcepcinesunacondicindeerror,noun
elementodedatos.Adiferenciadelasvariables,lasexcepcionesnopuedenaparecerenlasinstruccionesdeasignacino
sentenciasSQL.Sinembargo,seaplicanlasmismasreglasdembitodevariablesyexcepciones.

LasreglasdembitoparaPLExcepciones/SQL
Nosepuededeclararunaexcepcindosvecesenelmismobloque.Puede,sinembargo,declararlamismaexcepcinendos
bloquesdiferentes.
Excepcionesdeclaradasenunbloqueseconsiderancomolocalesenesebloqueyglobalatodossussubbloques.Debidoaqueun
bloquepuedehacerreferenciasloaexcepcioneslocalesoglobales,bloquesdecerramientonopuedenhacerreferencia
excepcionesdeclaradasenunsubbloque.
Siredeclareunaexcepcinglobalenunsubbloque,ladeclaracinlocalprevalece.Elsubbloquenopuedehacerreferencia,una
excepcin,amenosquelaexcepcinsedeclaraenunbloqueetiquetadoycalificarsunombreconlaetiquetadelbloque:
block_label.exception_name

Elsiguienteejemploilustralasreglasdealcance:
DECLARE
EXCEPCINpast_due;
acct_numNMERO;
EMPEZAR
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm

5/16

11/2/2016
10GestindeerroresdePL/SQL
EMPEZAR
DECLAREsubbloquecomienza
EXCEPCINpast_due;Estadeclaracinprevalece

acct_numNMERO;
FECHADUE_DATE:=SYSDATE1;
todays_dateFECHA:=SYSDATE;
EMPEZAR
SIDUE_DATE<todays_dateENTONCES
AUMENTARpast_due;Estonosemaneja
TERMINARASI;
FINAL;extremossubbloque
EXCEPCIN
CUANDOENTONCESpast_dueexcepcinnocontrolaplanteadas
dbms_output.put_line('ElmanejodeexcepcionesPAST_DUE.');
CUANDOOTROSENTONCES
dbms_output.put_line('NosepudoreconocerPAST_DUE_EXCEPTIONenestembito.');
FINAL;
/

Elbloquequelocontienenomanejalaexcepcinplanteadaporqueladeclaracindepast_dueenelsubbloqueprevalece.Apesar
dequecompartenelmismonombre,losdospast_dueexcepcionessondiferentes,aligualquelosdosacct_numvariablesque
compartenelmismonombreperosonvariablesdiferentes.Porlotanto,laSUBIRdeclaracinyelCUANDOclusulaserefierena
diferentesexcepciones.Paraqueelbloquequelocontienecontrolalaexcepcinplanteada,deberetirarsudeclaracindelasub
bloqueodefinirunaOTROSmanejador.

AsociarunaexcepcinPL/SQLconunnmerodePragmaEXCEPTION_INIT
Paramanejarcondicionesdeerror(normalmenteORAmensajes)quenotienennombrepredefinido,sedebeutilizarelOTROS
controladoroelpragmaEXCEPTION_INIT.UNPragmaesunadirectivadecompilacinqueseprocesaentiempodecompilacin,
noentiempodeejecucin.
EnPL/SQL,elpragmaEXCEPTION_INITledicealcompiladorparaasociarunnombredeexcepcinconunnmerodeerrorde
Oracle.Esopermitehacerreferenciaacualquierexcepcininternaporsunombreyescribiruncontroladorespecficoparaello.
Cuandoveaunapiladeerrores,ounasecuenciademensajesdeerror,eldearribaeselquemslepuedenatraparymanipular.
CodificarelpragmaEXCEPTION_INITenlapartedeclarativadeunbloquePL/SQL,subprogramaopaqueteutilizandolasintaxis
PRAGMAEXCEPTION_INIT(exception_name,Oracle_error_number);

dondeexception_nameeselnombredeunadeexcepcionespreviamentedeclaradoyelnmeroesunvalornegativocorrespondea
unaORAnmerodeerror.Elpragmadebeaparecerenalgnlugardespusdeladeclaracindeexcepcinenlamismaseccin
declarativa,comosemuestraenelsiguienteejemplo:
DECLARE
EXCEPCINdeadlock_detected;
PRAGMAEXCEPTION_INIT(deadlock_detected,60);
EMPEZAR
nulo;AlgunasdelasfuncionesquecausaunerrorORA00060
EXCEPCIN
CUANDOENTONCESdeadlock_detected
nulo;Gestionarelerror
FINAL;
/

Ladefinicindesuspropiosmensajesdeerror:ProcedimientoRAISE_APPLICATION_ERROR
ElprocedimientoRAISE_APPLICATION_ERRORlepermiteemitirdefinidosporelusuarioORAmensajesdeerrordesubprogramas
almacenados.Deestamanera,sepuedeinformardeerroresensuaplicacinyevitarvolverexcepcionesnocontroladas.
ParallamaraRAISE_APPLICATION_ERROR,utilicelasintaxis
raise_application_error(error_number,elmensaje[,{true|false}]);

dondeerror_numberesunenteronegativoenelrango2000020999..ymensajeesunacadenadecaracteresdehasta2048bytes
delongitud.SieltercerparmetroopcionalesTRUE,elerrorsecolocaenlapiladeerroresanteriores.SielparmetroesFALSO(por
defecto),elerrorsustituyeatodosloserroresanteriores.RAISE_APPLICATION_ERRORformapartedelpaquetedeDBMS_STANDARD,yal
igualqueconelpaqueteSTANDARD,noesnecesarioparacalificarlasreferenciasaella.
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm

6/16

11/2/2016

10GestindeerroresdePL/SQL

Unaaplicacinpuedellamarraise_application_errorslodesdeunsubprogramaalmacenadoejecutar(omtodo).Cuandosele
llama,raise_application_errorterminaelsubprogramaydevuelveunnmerodeerrordefinidoporelusuarioymensajeala
aplicacin.ElnmerodeerroryelmensajepuedenseratrapadoscomocualquiererrordeOracle.
Enelejemplosiguiente,sellamaaraise_application_errorsiunacondicindeerrordesueleccinsucede(enestecaso,siel
esquemaactualespropietariademenosde1000tablas):
DECLARE
num_tablesNMERO;
EMPEZAR
SELECTCOUNT(*)ENnum_tablesDEUSER_TABLES;
SIENTONCES<1000num_tables
/*Emitirsupropiocdigodeerror(ORA20101)consupropiomensajedeerror.*/
raise_application_error(20.101,la"esperaalmenos1000tablas');
MS
NULO;Hacerelrestodelproceso(paraelcasodenoerror).
TERMINARASI;
FINAL;
/

LaaplicacindellamadaparacrearunaexcepcinPL/SQL,quesepuedeprocesarmedianteelinformedeerroresfunciones
SQLCODEySQLERRMenunaOTROSmanejador.Adems,sepuedeusarelpragmaEXCEPTION_INITparaasignarnmerosdeerror
especficosdevueltosporraise_application_erroraexcepcindesupropia,comoelsiguienteejemploPro*Cmuestra:
EXECSQLEXECUTE
/*EjecutarelbloqueembebidoPL/SQLusodeacogida
lasvariablesmy_emp_idymy_amount,queeran
valoresasignadosenelentornodeacogida.*/
DECLARE
EXCEPCINnull_salary;
/*NmerodeerrordevueltoporMaparaise_application_error
aexcepcindefinidaporelusuario.*/
PRAGMAEXCEPTION_INIT(null_salary,20.101);
EMPEZAR
raise_salary(:my_emp_id,:my_amount);
EXCEPCIN
CUANDOENTONCESnull_salary
Insertarenlosvaloresemp_audit(:my_emp_id,...);
FINAL;
ENDEXEC;

Estatcnicapermitelaaplicacindellamadaparamanejarcondicionesdeerrorenloscontroladoresdeexcepcionesespecficas.

RedeclarandolosExcepcionespredefinidas
Recuerde,PL/SQLdeclaraexcepcionesanivelmundialenelpaquetepredefinidoSTANDARD,porloquenolosnecesitadeclarara
smismo.Redeclarandolosexcepcionespredefinidasespropensoaerroresdebidoaquesudeclaracinlocalanulaladeclaracin
global.Porejemplo,sisedeclaraunaexcepcinllamadaINVALID_NUMBERyPL/SQLlanzalaexcepcinpredefinida
INVALID_NUMBERinternamente,unmanejadorescritoparaINVALID_NUMBERnodetectarlaexcepcininterna.Entalescasos,debe
utilizarlanotacindepuntosparaespecificarlaexcepcinpredefinida,delasiguientemanera:
EXCEPCIN
CUANDOINVALID_NUMBEROENTONCESSTANDARD.INVALID_NUMBER
Gestionarelerror
FINAL;

CmosecranPLExcepciones/SQL
Excepcionesinternassoncriadosdemaneraimplcitaporelsistemadetiempodeejecucin,comosonlasexcepcionesdefinidas
porelusuarioquesehaasociadoconunnmerodeerrordeOraclemedianteEXCEPTION_INIT.Sinembargo,otrasexcepciones
definidasporelusuariodebenserplanteadasexplcitamenteporRAISEdeclaraciones.

ElaumentodeexcepcionesconlaDeclaracinSUBIR
BloquesPL/SQLysubprogramasdebenplantearunaexcepcinslocuandounerrorhacequeseaindeseableoimposiblede
terminarelprocesamiento.PuedecolocarSUBIRdeclaracionesparaunaexcepcinquesedaencualquierlugardentrodelalcance
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm

7/16

11/2/2016

10GestindeerroresdePL/SQL

terminarelprocesamiento.PuedecolocarSUBIRdeclaracionesparaunaexcepcinquesedaencualquierlugardentrodelalcance
deestaexcepcin.Enelsiguienteejemplo,alertarasubloquePL/SQLparaunaexcepcindefinidaporelusuariollamado
OUT_OF_STOCK:
DECLARE
EXCEPCINOUT_OF_STOCK;
number_on_handNMERO:=0;
EMPEZAR
SInumber_on_hand<1ENTONCES
AUMENTAROUT_OF_STOCK;Lanzarunaexcepcinquedefinimos
TERMINARASI;
EXCEPCIN
CUANDOENTONCESOUT_OF_STOCK
Gestionarelerror
dbms_output.put_line('Seencontrfueradestockerror.');
FINAL;
/

Tambinpuedeplantearunaexcepcinpredefinidadeformaexplcita.Deestamanera,unmanejadordeexcepcionesporescrito
paralaexcepcinpredefinidapuedeprocesarotroserrores,comomuestraelsiguienteejemplo:
DECLARE
acct_typeentero:=7;
EMPEZAR
SINOENacct_type(1,2,3)ENTONCES
AUMENTARINVALID_NUMBER;Aumentarlaexcepcinpredefinida
TERMINARASI;
EXCEPCIN
CUANDOENTONCESINVALID_NUMBER
dbms_output.put_line('Manejodeentradanovlidohaciendoretroceder.');
ROLLBACK;
FINAL;
/

CmoPLExcepciones/SQLdepropagacinde
Cuandoseproduceunaexcepcin,siPL/SQLnopuedeencontraruncontroladorparalenelbloqueosubprogramaactual,la
excepcinsepropaga.Esdecir,laexcepcinsereproduceenlosbloquesdecerramientosucesivashastaqueseencuentraun
controladoronohaymsbloquesparalabsqueda.Sinoseencuentraningncontrolador,PL/SQLdevuelveunaexcepcinno
controladadeerrorenelentornodeacogida.
Lasexcepcionesnopuedenpropagarseatravsdellamadasaprocedimientoremotorealizaatravsdeenlacesdebasededatos.
UnbloquePL/SQLnopuedecapturarunaexcepcinplanteadaporunsubprogramaremoto.Parasolucionaresteproblema,
consulte"Definicindelosmensajesdeerrorpropios:ProcedimientoRAISE_APPLICATION_ERROR".
Figura101,laFigura102ylafigura103ilustralasreglasbsicasdepropagacin.
Figura101reglasdepropagacin:Ejemplo1

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

8/16

11/2/2016

10GestindeerroresdePL/SQL

Figura102reglasdepropagacin:Ejemplo2

Descripcindelailustracinlnpls010.gif
Figura103reglasdepropagacin:Ejemplo3

Descripcindelailustracinlnpls011.gif
Unaexcepcinpuedepropagarsemsalldesumbitodeaplicacin,esdecir,msalldelbloqueenelquesedeclar.
Consideremoselsiguienteejemplo:
EMPEZAR
DECLAREsubbloquecomienza
EXCEPCINpast_due;
FECHADUE_DATE:=Tronco(SYSDATE)1;
todays_dateFECHA:=Tronco(SYSDATE);
EMPEZAR
SIDUE_DATE<todays_dateENTONCES
AUMENTARpast_due;
TERMINARASI;
FINAL;extremossubbloque
EXCEPCIN
CUANDOOTROSENTONCES
ROLLBACK;
FINAL;
/
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm

9/16

11/2/2016

10GestindeerroresdePL/SQL

Debidoaqueelbloquequedeclaralaexcepcinpast_duetieneningncontroladorparal,laexcepcinsepropagaalbloqueque
locontiene.PeroelbloquequelocontienenosepuedehacerreferenciaalnombrePAST_DUE,porqueelmbitodondesedeclarya
noexiste.Unavezquesepierdeelnombredelaexcepcin,sloOTROScontroladorpuededetectarlaexcepcin.Sinohayun
controladorparaunaexcepcindefinidaporelusuario,laaplicacinquellamaobtieneesteerror:
ORA06510:PL/SQL:excepcinnocontroladadefinidaporelusuario

ReraisingaPL/SQLException
Aveces,deseavolverasubirunaexcepcin,esdecir,manejarlasituacinanivellocal,acontinuacin,pasaraunbloquequelo
contiene.Porejemplo,esposiblequedeseedeshacerunatransaccinenelbloqueactual,acontinuacin,registrarelerrorenun
bloquequelocontiene.
Paravolverasubirunaexcepcin,utilizarunSUBIRdeclaracinsinunnombredeexcepcin,quesepermitesloenuncontrolador
deexcepciones:
DECLARE
EXCEPCINsalary_too_high;
NMEROcurrent_salary:=20,000;
NMEROMAX_SALARY:=10000;
NMEROerroneous_salary;
EMPEZAR
COMIENZOsubbloquecomienza
SIcurrent_salary>MAX_SALARYENTONCES
AUMENTARsalary_too_high;Aumentarlaexcepcin
TERMINARASI;
EXCEPCIN
CUANDOENTONCESsalary_too_high
Primerpasoenelmanejodelerror
dbms_output.put_line('salario'||||erroneous_salary
'Estfueraderango.');
dbms_output.put_line("salariomximoes'||||MAX_SALARY'.');
AUMENTO;Volverasubirlaexcepcinactual
FINAL;extremossubbloque
EXCEPCIN
CUANDOENTONCESsalary_too_high
Gestionarelerrormsafondo
erroneous_salary:=current_salary;
current_salary:=MAX_SALARY;
dbms_output.put_line('Revisinsalarialdel'||||erroneous_salary
'A'||current_salary||)'.';
FINAL;
/

ManejodeexcepcioneslevantadasPL/SQL
Cuandoseproduceunaexcepcin,laejecucinnormaldesuPL/SQLbloqueosubprogramasedetieneyelcontrolsetransfierea
lapartedecontroldeexcepciones,quetieneelformatodelasiguientemanera:
EXCEPCIN
CUANDOENTONCESexception_name1manejador
sequence_of_statements1
CUANDOENTONCESexception_name2otrocontrolador
sequence_of_statements2
...
CUANDOOTROSENTONCEScontroladoropcional
sequence_of_statements3
FINAL;

Paracapturarlasexcepcionesplanteadas,seescribecontroladoresdeexcepciones.CadacontroladorconsisteenunaCUANDO
clusula,queespecificaunaexcepcin,seguidodeunasecuenciadesentenciasqueseejecutancuandoseplanteaquelaexcepcin.
Estasdeclaracionesdeejecucincompletadelbloqueosubprogramaelcontrolnovuelveallugardondeseproducelaexcepcin.
Enotraspalabras,nosepuedereanudarelprocesodondelodej.
ElopcionalOTROSgestordeexcepciones,quesiempreeselltimocontroladorenunbloqueosubprograma,actacomoel
controladorparatodaslasexcepcionesnoexpresamentemencionadas.Porlotanto,unbloqueosubprogramapuedetenerslouna
OTROSmanejador.
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm

10/16

11/2/2016

10GestindeerroresdePL/SQL

Comomuestraelsiguienteejemplo,elusodelaOTROScontroladorgarantizaqueningunaexcepcinirnocontrolada:
EXCEPCIN
CUANDOENTONCES
Gestionarelerror
CUANDOENTONCES
Gestionarelerror
CUANDOOTROSENTONCES
Manejartodoslosdemserrores
FINAL;

Sideseaquedosomsexcepcionesparaejecutarlamismasecuenciadeinstrucciones,unalistadelosnombresdeexcepcinenel
CUANDOclusula,separndolosporlapalabraclaveO,delasiguientemanera:
EXCEPCIN
CUANDOover_limitOunder_limitOENTONCESVALUE_ERROR
Gestionarelerror

Siseobtienenningunadelasexcepcionesenlalista,seejecutalasecuenciaasociadadelosestados.LaspalabrasclaveOTROSno
puedenaparecerenlalistadenombresdeexcepcindebeaparecerporsmismo.Puedetenercualquiernmerodecontroladores
deexcepciones,ycadacontroladorpuedeasociarunalistadeexcepcionesconunasecuenciadeinstrucciones.Sinembargo,un
nombredeexcepcinpuedeaparecerslounavezenlapartedecontroldeexcepcionesdeunbloquePL/SQLosubprograma.
LasreglasdealcancehabitualesparalasvariablesPL/SQLseaplican,porloquesepuedehacerreferenciaavariableslocalesy
globalesenuncontroladordeexcepciones.Sinembargo,cuandoseproduceunaexcepcindentrodeuncursorPARAbucle,el
cursorsecierraimplcitamenteantesdequeseinvoqueelcontrolador.Porlotanto,losvaloresdelosatributosdecursorexplcitos
sonnodisponiblesenelcontrolador.
Traducidoal: espaol
Mostrartextooriginal
Manejodeexcepcionesplanteadasenlasdeclaraciones

Opciones

Lasexcepcionespuedensercriadosenlasdeclaracionesdelasexpresionesdeinicializacindefectuosos.Porejemplo,lasiguiente
declaracinsuscitaunaexcepcinporquelaconstantecredit_limitnopuedealmacenarunnmeromayorque999:
DECLARE
credit_limitnmeroconstante(3):=5000;Planteaunaexcepcin
EMPEZAR
NULO;
EXCEPCIN
CUANDOOTROSENTONCES
Nosepuededetectarlaexcepcin.Estecontroladornosellamanunca.
dbms_output.put_line('''tmanejarunaexcepcinenunadeclaracin.');
FINAL;
/

Losmanipuladoresenelbloqueactualnopuededetectarlaexcepcinplanteadaunaexcepcinporquesecrienunadeclaracin
propagainmediatamentealbloquequelocontiene.

Manejodeexcepcionesplanteadasenlosmanipuladores
Cuandoseproduceunaexcepcindentrodeuncontroladordeexcepciones,elmismocontroladornopuededetectarlaexcepcin.
Unaexcepcinplanteadadentrodeunmanejadorpropagainmediatamentealbloquequelocontiene,loquesebuscaencontrarun
controladorparaestenuevoexcepcin.Apartirdeah,laexcepcinsepropaganormalmente.Porejemplo:
EXCEPCIN
CUANDOENTONCESINVALID_NUMBER
INSERTINTO...podraplantearDUP_VAL_ON_INDEX
CUANDODUP_VAL_ON_INDEXENTONCES...nopuededetectarlaexcepcin
FINAL;

Laramificacinhaciaodesdeuncontroladordeexcepciones
UnGOTOdeclaracinpuedepasardeuncontroladordeexcepcionesenunbloquequelocontiene.
UnGOTOdeclaracinnopuedepasarauncontroladordeexcepciones,odesdeuncontroladordeexcepcionesenelbloqueactual.

RecuperandoelCdigodeerrorymensajedeerror:SQLCODEySQLERRM

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

11/16

11/2/2016

10GestindeerroresdePL/SQL

RecuperandoelCdigodeerrorymensajedeerror:SQLCODEySQLERRM
Enuncontroladordeexcepciones,puedeutilizarlafuncinincorporadadeSQLCODEySQLERRMparasaberquseprodujoelerrory
hacerllegarelmensajedeerrorasociado.Paralasexcepcionesinternas,SQLCODEdevuelveelnmerodelerrordeOracle.El
nmeroqueSQLCODEretornosesnegativoamenosqueelerrordeOracleesnohaydatosqueseencuentran,encuyocasoSQLCODE
devuelve100.SQLERRMdevuelveelmensajedeerrorcorrespondiente.ElmensajecomienzaconelcdigodeerrorOracle.
Paralasexcepcionesdefinidasporelusuario,SQLCODEdevuelve1ySQLERRMdevuelveelmensaje:excepcindefinidaporel
usuario.
menosquehayautilizadoelpragmaEXCEPTION_INITparaasociarelnombredelaexcepcinconunnmerodeerrordeOracle,en
cuyocasoSQLCODEdevuelveesenmerodeerrorySQLERRMdevuelveelmensajedeerrorcorrespondiente.Lalongitudmximade
unmensajedeerrordeOracleesde512caracteres,incluyendoelcdigodeerror,mensajesanidados,ylosinsertosdemensajes
talescomonombresdetablaycolumna.
Sinoeslaexcepcinhasidoplanteada,SQLCODEdevuelveceroySQLERRMdevuelveelmensaje:ORA0000:,completarconxito
lanormalidad.
PuedepasarunnmerodeerrordeSQLERRM,encuyocasoSQLERRMdevuelveelmensajeasociadoaesenmerodeerror.Asegrese
dequepasenmerosdeerrornegativosparaSQLERRM.
ElpasodeunnmeropositivoparaSQLERRMsiempredevuelveelmensajedeexcepcindefinidaporelusuarioamenosquepase
100,encuyocasoSQLERRMdevuelveelmensajeNoseencontrarondatos.PasarunceroaSQLERRMsiempredevuelveelmensajede
lonormal,lafinalizacinconxito.
NosepuedeutilizarSQLCODEoSQLERRMdirectamenteenunainstruccinSQL.Ensulugar,debeasignarsusvaloresalasvariables
locales,acontinuacin,utilizarlasvariablesenlainstruccinSQL,comosemuestraenelsiguienteejemplo:
DECLARE
err_msgVARCHAR2(100);
EMPEZAR
/*ObtenerunpardemensajesdeerrordeOracle.*/
PARAerr_numENBUCLE1..3
err_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)noseproducecuandoseasignaelvalorde
SQLERRMaERR_MSG.LasfuncionesdeSQLCODEySQLERRMsonespecialmentetilesenelOTROSgestordeexcepcionesporquetedicen
quesehayaformuladoexcepcininterna.
Nota:CuandoseutilizapragmaRESTRICT_REFERENCESparaafirmarlapurezadeunafuncinalmacenada,nosepuedeespecificar
lasrestriccionesWNPSyRNPSsilafuncinsellamaaSQLCODEoSQLERRM.

Lacapturadeexcepcionesnocontroladas
Recuerde,sinopuedeencontraruncontroladorparaunaexcepcinplanteada,PL/SQLdevuelveunaerrordeexcepcinno
controladaalmedioambientedeacogida,loquedeterminaelresultado.Porejemplo,enelentornodeOraclePrecompiladores,
cualquiercambiodebasededatosrealizadasporunainstruccinSQLfalladoobloquePL/SQLsedeshacen.
Lasexcepcionesnocontroladastambinpuedenafectarsubprogramas.Sisaledeunsubprogramaconxito,PL/SQLasigna
valoresaOUTparmetros.Sinembargo,sisaleconunaexcepcinnocontrolada,PL/SQLnoasignavaloresaOUTparmetros(a
menosqueseanNOCOPYparmetros).Adems,siunsubprogramaalmacenadofallaconunaexcepcinnocontrolada,PL/SQLno
nohacerretrocedereltrabajodebasededatosrealizadoporelsubprograma.
PuedeevitarlasexcepcionesnocontroladascodificandounaOTROSmanipuladorenelnivelmsaltodetodoslosprogramasPL/
SQL.

ConsejosparaelmanejodeerroresPL/SQL
Enestaseccin,seaprendetrestcnicasqueaumentanlaflexibilidad.
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm

12/16

11/2/2016

10GestindeerroresdePL/SQL

Continuandodespusseproduceunaexcepcin
Uncontroladordeexcepcioneslepermiterecuperarsedeunerrorfataldeotromodoantesdesalirdeunbloque.Perocuandoel
controladorsecompleta,elbloquesetermina.Nosepuedevolveralbloqueactualdesdeuncontroladordeexcepciones.Enel
siguienteejemplo,sielSELECTENafirmacinplanteaZERO_DIVIDE,nosepuedereanudarconelINSERTdeclaracin:
DECLARE
pe_ratioNMERO(3,1);
EMPEZAR
CANCELACINdeestadsticasDONDEsmbolo="XYZ";
preciosSELECT/NVL(ganancias,0)ENpe_ratiodelasexistencias
DONDEsmbolo="XYZ";
INSERTINTOEstadsticas(smbolo,relacin)VALUES('XYZ',pe_ratio);
EXCEPCIN
CUANDOENTONCESZERO_DIVIDE
NULO;
FINAL;
/

Todavasepuedemanejarunaexcepcinparauncomunicado,acontinuacin,contineconelsiguientecomunicado.Colocarla
declaracinensupropiasubbloqueconsuspropiosmanejadoresdeexcepciones.Siseproduceunerrorenelsubbloque,un
controladorlocalpuededetectarlaexcepcin.Cuandoterminaelsubbloque,elbloquequelocontienesigueejecutndoseenel
puntodondeterminalasubbloque.Consideremoselsiguienteejemplo:
DECLARE
pe_ratioNMERO(3,1);
EMPEZAR
CANCELACINdeestadsticasDONDEsmbolo="XYZ";
COMIENZOsubbloquecomienza
preciosSELECT/NVL(ganancias,0)ENpe_ratiodelasexistencias
DONDEsmbolo="XYZ";
EXCEPCIN
CUANDOENTONCESZERO_DIVIDE
pe_ratio:=0;
FINAL;extremossubbloque
INSERTINTOEstadsticas(smbolo,relacin)VALUES('XYZ',pe_ratio);
EXCEPCIN
CUANDOOTROSENTONCES
NULO;
FINAL;
/

Enesteejemplo,sielSELECTENdeclaracinplanteaunaZERO_DIVIDEdeexcepciones,lalocal,locogeyseponepe_ratioacero.
Laejecucindelgestorsehacompletado,porloqueelsubbloquetermina,ylaejecucincontinaconlaINSERTcomunicado.
TambinpuederealizarunasecuenciadeoperacionesdeDML,dondealgunospuedenfallar,yprocesarlasexcepcionesslo
despusdequetodalaoperacinsehacompletado,comosedescribeenelapartado"ManejoFORALLexcepcionesconlos
BULK_EXCEPTIONS%atributo".

unatransaccindereintentar
Despusseproduceunaexcepcin,enlugardeabandonarsutransaccin,esposiblequedeseevolveraintentarlo.Latcnicaes:
1.Encajonarlatransaccinenunsubbloque.
2.Coloqueelsubbloquedentrodeunbuclequeserepitelaoperacin.
3.Antesdeiniciarlaoperacin,marcarunpuntodesalvaguarda.Silaoperacintienexito,secomprometen,acontinuacin,
salirdelbucle.Silaoperacinfalla,elcontrolsetransfierealcontroladordeexcepciones,elquerodardenuevoalpuntode
rescatededeshacertodosloscambios,acontinuacin,tratardesolucionarelproblema.
Enelsiguienteejemplo,elINSERTdeclaracinpodraprovocarunaexcepcinacausadeunvalorduplicadoenunacolumnanica.
Enesecaso,cambiamoselvalorquetienequesernicoycontinuarconlasiguienteiteracindelbucle.Sielinsertotienexito,
salimosdelbucleinmediatamente.Conestatcnica,sedebeutilizarunaPARAoWHILEbucleparalimitarelnmerodeintentos.
DECLARE
nombrarVARCHAR2(20);
ans1VARCHAR2(3);
ANS2VARCHAR2(3);
ans3VARCHAR2(3);
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm

13/16

11/2/2016
ans3VARCHAR2(3);
NMEROsufijo:=1;

10GestindeerroresdePL/SQL

EMPEZAR
FORiIN1..10LOOPTrato10veces
COMENZARsubbloquecomienza
start_transactionpuntodeguardado;Marqueunjefe
/*Eliminafilasdeunatabladeresultadosdelaencuesta.*/
CANCELACINderesultadosDONDEanswer1="NO";
/*Aadirelnombreylasrespuestasdeunencuestado.*/
INSERTINTOVALORESresultados(nombre,ans1,ANS2,ans3);
PlanteaunaDUP_VAL_ON_INDEXsidosencuestadostienenelmismonombre
COMETER;
SALIDA;
EXCEPCIN
CUANDOENTONCESDUP_VAL_ON_INDEX
ROLLBACKTOstart_transaction;deshacercambios
sufijo:=sufijo+1;Tratardesolucionarunproblema
Nombre:nombre=||TO_CHAR(sufijo);
FINAL;extremossubbloque
LOOPEND;
FINAL;
/

Elusodevariablesdelocalizadorparaidentificarlugaresdeexcepcin
Utilizandounodegestindeexcepcionesparaunasecuenciadeinstrucciones,talescomoINSERT,DELETE,oACTUALIZACIN
declaraciones,puedeenmascararlasentenciaquecausunerror.Siloquenecesitasaberquafirmacinno,sepuedeutilizar
unavariablelocalizadora:
DECLARE
propmente;
nombrarVARCHAR2(100);
EMPEZAR
sent:=1;Designa1instruccinSELECT
SELECTINTOnombre_tablanombreuser_tablesDEDONDEnombre_tablaLIKE'%ABC';
sent:=2;DesignasegundainstruccinSELECT
SELECTINTOnombre_tablanombreuser_tablesDEDONDEnombre_tablaLIKE'XYZ%';
EXCEPCIN
CUANDOENTONCESNO_DATA_FOUND
dbms_output.put_line('Nombredelatablanoseencuentraenconsulta'||prop);
FINAL;
/

VistageneraldealarmasPL/SQLtiempodecompilacin
Parahacersusprogramasmsrobustosyevitarproblemasentiempodeejecucin,puedeactivarlacomprobacindeciertas
condicionesdeadvertencia.Estascondicionesnosonlosuficientementegravescomoparaproducirunerroryleimpidenla
compilacindeunsubprograma.Podransealaralgoenelsubprogramaqueproduceunresultadonodefinidoopodracrearun
problemaderendimiento.
ParatrabajarconmensajesdeadvertenciaPL/SQL,seutilizaelPLSQL_WARNINGSparmetrodeinicializacin,elDBMS_WARNING
paquete,ylos/DBA/usuarioALL_PLSQL_OBJECT_SETTINGSvistas.

PL/SQLdeadvertenciaCategoras
mensajesdeadvertenciaPL/SQLsedividenencategoras,porloquesepuedesuprimirogruposdevisualizacindeadvertencias
similaresdurantelacompilacin.Lascategorasson:
Grave:Mensajesparalascondicionesquepuedenprovocaruncomportamientoinesperadooresultadoserrneos,talescomo
problemasdesolapamientoconparmetros.
Rendimiento:Mensajesparalascondicionesquepuedencausarproblemasderendimiento,talescomopasarunVARCHAR2valora
unNMEROcolumnaenunINSERTcomunicado.
Informativo:Mensajesparacondicionesquenotienenunefectosobreelrendimientoolacorreccin,peroquepuedequedesee
cambiarparahacerelcdigomsfcildemantener,comoporejemploelcdigomuertoquenopuedeserejecutado.
LapalabraclaveTodoesunaformaabreviadadereferirseatodoslosmensajesdeadvertencia.
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm

14/16

11/2/2016

10GestindeerroresdePL/SQL

LapalabraclaveTodoesunaformaabreviadadereferirseatodoslosmensajesdeadvertencia.
Tambinpuedetratarmensajesparticularescomoerroresenlugardeadvertencias.Porejemplo,sisesabequeelmensajede
advertenciaPLW05003representaungraveproblemaensucdigo,incluyendo'ERROR:05003'enelPLSQL_WARNINGSajustehace
quelacondicindedisparounmensajedeerror(PLS_05003)enlugardeunmensajedeadvertencia.Unmensajedeerrorhaceque
lacompilacinfalle.

ElcontroldePLMensajesdeadvertencia/SQL
ParapermitirlaedicindebasededatosdemensajesdeadvertenciadurantelacompilacinPL/SQL,seestableceelparmetrode
inicializacinPLSQL_WARNINGS.Puedeactivarydesactivarcategorascompletasdeadvertencias(ALL,GRAVES,INFORMATIVO,
RENDIMIENTO),activarydesactivarlosnmerosdemensajesespecficos,yhacerquelabasededatosatratarciertosavisoscomo
erroresdecompilacinparaqueesascondicionesdebensercorregidas.
Esteparmetrosepuedeestableceraniveldesistemaoelniveldesesin.Tambinpuedeconfigurarloparaqueunasola
compilacinincluyndolocomopartedelaALTERPROCEDUREcomunicado.Esposibleactivartodaslasadvertenciasduranteel
desarrollo,apaguetodaslasadvertenciascuandoeldesplieguedeproduccin,oencenderalgunasadvertenciascuandosetrabajaen
unsubprogramaparticularcuandoustedestpreocupadoconalgnaspecto,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/SQLbloquesannimosno
producenningunaadvertencia.
LosajustesparaelPLSQL_WARNINGSparmetrosealmacenanjuntoconcadasubprogramacompilado.Sivuelveacompilarel
subprogramaconunaCREAROSUSTITUIRdeclaracin,seutilizanlosvaloresactualesdelasesin.Sivuelveacompilarel
subprogramaconunALTER...COMPILEcomunicado,laconfiguracindelasesinactualpodraserutilizado,olaconfiguracin
originalquesealmacenaconelsubprograma,dependiendodesiseincluyenlosAJUSTESDEREUTILIZACINclusulaenel
comunicado.
Paraverlosavisosgeneradosdurantelacompilacin,seutilizaelSQL*PlusVERERRORESordenoconsultalaUSER_ERRORSvista
deldiccionariodedatos.PL/SQLtodoslosmensajesdeadvertenciautilizanelprefijodelasMEL.

UtilizandoelpaqueteDBMS_WARNING
SiustedestescribiendounentornodedesarrolloquecompilaPLsubprogramas/SQL,puedecontrolarlosmensajesde
advertenciaPL/SQLllamandosubprogramasenelDBMS_WARNINGpaquete.Tambinpuedeutilizarestepaquetealcompilaruna
aplicacincompleja,compuestadevariassecuenciasdecomandosSQL*Plusanidada,dondelasdiferentesopcionesde
advertenciaseaplicanalosdiferentessubprogramas.PuedeguardarelestadoactualdelaPLSQL_WARNINGSparmetroconuna
llamadaalpaquete,cambiarelparmetroparacompilarunconjuntoparticulardesubprogramas,acontinuacin,restaurarelvalor
originaldelparmetro.
Porejemplo,aquesunprocedimientoconcdigoinnecesarioquepodraserquitada.Podrarepresentarunerror,opodraser
ocultadointencionalmenteporunindicadordedepuracin,porloquepodraonopodradesearunmensajedeadvertenciapara
ello.
CREAROSUSTITUIRdead_codePROCEDIMIENTO
COMO
nmerox:=10;
EMPEZAR
six=10,entonces
x:=20;
ms
x:=100;Cdigomuerto(nuncaalcanzado)
terminarasi;
FINdead_code;/
Pordefecto,elprocedimientoanteriorcompilasinerroresniadvertencias.
Ahorapermitirquetodoslosmensajesdeadvertencia,sloparaestasesin.
LLAMEDBMS_WARNING.SET_WARNING_SETTING_STRING("ACTIVAR:ALL','sesin');
https://docs.oracle.com/cd/B13789_01/appdev.101/b10807/07_errs.htm

15/16

11/2/2016

10GestindeerroresdePL/SQL

Compruebeelajustedealertaactual.
seleccionedbms_warning.get_warning_setting_string()deladoble;
Cuandovolvamosacompilarelprocedimiento,vamosaverunaadvertenciasobreelcdigomuerto.
ALTERPROCEDIMIENTOdead_codeCOMPILE;

Vasetambin:ALTERPROCEDIMIENTO,DBMS_WARNINGpaqueteenelPL/SQLpaquetesytiposdereferencia,losmensajesPLW
losmensajesdeerrordebasededatosOracle

Anterior Siguiente

Copyright1996,OracleCorporation2003
Todoslosderechosreservados.

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

Hogar

Listade
libros

Contenido ndice

ndice
maestro

Realimentacin

16/16

You might also like