Руковање изузецима Орацле ПЛ / СКЛ: примери за подизање кориснички дефинисаног изузетка

Преглед садржаја:

Anonim

Шта је руковање изузецима у ПЛ / СКЛ-у?

Изузетак се јавља када ПЛ / СКЛ механизам наиђе на инструкцију коју не може извршити због грешке која се догоди у току извођења. Ове грешке неће бити забележене у време састављања, па су стога требале да се реше само током времена извршавања.

На пример, ако ПЛ / СКЛ механизам добије упуту за поделу било ког броја са „0“, тада ће га ПЛ / СКЛ механизам послати као изузетак. Изузетак покреће ПЛ / СКЛ механизам само током извођења.

Изузеци ће зауставити даљње извршавање програма, па да би се избегло такво стање, потребно их је ухватити и руковати одвојено. Овај процес се назива руковање изузецима, у којем програмер обрађује изузетак који се може догодити у време извођења.

У овом упутству научићете следеће теме-

  • Синтакса руковања изузецима
  • Врсте изузетака
  • Унапред дефинисани изузеци
  • Кориснички дефинисани изузетак
  • Изузетак за подизање ПЛ / СКЛ-а
  • Важне напомене које треба напоменути у изузетку

Синтакса руковања изузецима

Изузеци се обрађују на нивоу блока, тј. Када се било који изузетак догоди у било ком блоку, контрола ће изаћи из извршног дела тог блока. Тада ће се изузетак обрадити у делу који обрађује изузетке у том блоку. Након обраде изузетка, није могуће поново послати контролу назад у одељак извршења тог блока.

Доња синтакса објашњава како ухватити и руковати изузетком.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Објашњење синтаксе:

  • У горњој синтакси, блок за руковање изузецима садржи низ услова ВХЕН за руковање изузетком.
  • Сваки ВХЕН услов прати име изузетка за које се очекује да ће бити покренуто током извођења.
  • Када се било који изузетак покрене током извођења, тада ће ПЛ / СКЛ механизам потражити у делу за руковање изузецима тај одређени изузетак. Почиње од прве клаузуле „ВХЕН“ и узастопно ће претраживати.
  • Ако је пронашао руковање изузетком за изузетак који је покренут, тада ће извршити тај одређени део кода за руковање.
  • Ако ниједна клаузула 'ВХЕН' није присутна за изузетак који је покренут, тада ће ПЛ / СКЛ механизам извршити део 'ВХЕН ОТХЕРС' (ако постоји). Ово је уобичајено за све изузетке.
  • Након извршавања изузетка, контрола делова ће изаћи из тренутног блока.
  • Само један изузетак може се извршити за блок током извођења. Након извршења, контролер ће прескочити преостали део који обрађује изузетке и изаћи ће из тренутног блока.

Напомена: КАДА ОСТАЛИ увек треба да буду на последњем месту низа. Дио обраде изузетака присутан након ВХЕН ОТХЕРС никада се неће извршити јер ће контрола изаћи из блока након извршавања ВХЕН ОТХЕРС.

Врсте изузетака

Постоје две врсте изузетака у Пл / СКЛ.

  1. Унапред дефинисани изузеци
  2. Кориснички дефинисани изузетак

Унапред дефинисани изузеци

Орацле је унапред дефинисао неке уобичајене изузетке. Ови изузеци имају јединствено име изузетка и број грешке. Ови изузеци су већ дефинисани у пакету 'СТАНДАРД' у програму Орацле. У коду, можемо директно да користимо ово унапред дефинисано име изузетка за њихово руковање.

Испод је неколико унапред дефинисаних изузетака

Изузетак Код грешке Разлог за изузетак
АЦЦЕСС_ИНТО_НУЛЛ ОРА-06530 Доделите вредност атрибутима неиницијализованих објеката
ЦАСЕ_НОТ_ФОУНД ОРА-06592 Ниједна клаузула „ВХЕН“ у ЦАСЕ изјави није задовољена и није наведена ниједна „ЕЛСЕ“ клаузула
ЦОЛЛЕЦТИОН_ИС_НУЛЛ ОРА-06531 Коришћење метода сакупљања (осим ПОСТОЈИ) или приступање атрибутима колекције на неиницијализованим колекцијама
ЦУРСОР_АЛРЕАДИ_ОПЕН ОРА-06511 Покушај отварања курсора који је већ отворен
ДУП_ВАЛ_ОН_ИНДЕКС ОРА-00001 Чување дупликата вредности у колони базе података која је ограничена јединственим индексом
ИНВАЛИД_ЦУРСОР ОРА-01001 Илегалне операције курсора попут затварања неотвореног курсора
НЕВАЖЕЋИ БРОЈ ОРА-01722 Конверзија карактера у број није успела због неважећег броја броја
НИЈЕ ПРОНАЂЕН НИЈЕДАН ПОДАЦИ ОРА-01403 Када наредба 'СЕЛЕЦТ' која садржи клаузулу ИНТО не дохваћа редове.
РОВ_МИСМАТЦХ ОРА-06504 Када је тип података променљиве курсора некомпатибилан са стварним типом повратка курсора
СУБСЦРИПТ_БЕИОНД_ЦОУНТ ОРА-06533 Навођење збирке индексним бројем који је већи од величине збирке
СУБСЦРИПТ_ОУТСИДЕ_ЛИМИТ ОРА-06532 Навођење збирке индексним бројем који је изван дозвољеног опсега (нпр. -1)
ТОО_МАНИ_РОВС ОРА-01422 Када израз 'СЕЛЕЦТ' са клаузулом ИНТО врати више од једног реда
ВАЛУЕ_ЕРРОР ОРА-06502 Аритметичка грешка или ограничење величине (нпр. Додељивање вредности променљивој која је већа од величине променљиве)
ЗЕРО_ДИВИДЕ ОРА-01476 Дељење броја са '0'

Кориснички дефинисани изузетак

У Орацле-у, осим претходно дефинисаних изузетака, програмер може створити сопствени изузетак и руковати њима. Могу се креирати на нивоу потпрограма у делу декларације. Ови изузеци су видљиви само у том потпрограму. Изузетак који је дефинисан у спецификацији пакета је јавни изузетак и видљив је свуда где је пакету доступан. <

Синтакса: На нивоу потпрограма

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • У горњој синтакси, променљива „изузетк_име“ је дефинисана као „ЕКСЦЕПТИОН“ тип.
  • Ово се може користити на сличан начин као унапред дефинисани изузетак.

Синтакса: На нивоу спецификације пакета

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • У горњој синтакси, променљива 'изнимка_име' је дефинисана као 'ЕКСЦЕПТИОН' тип у спецификацији пакета <име_пакета>.
  • Ово се може користити у бази података где год се може назвати пакет 'име_пакета'.

Изузетак за подизање ПЛ / СКЛ-а

Сви унапред дефинисани изузеци се имплицитно покрећу кад год се грешка догоди. Али кориснички дефинисане изузетке треба експлицитно навести. То се може постићи употребом кључне речи „ПОДИЗАЊЕ“. Ово се може користити на било који од доленаведених начина.

Ако се 'РАИСЕ' користи одвојено у програму, он ће проширити већ постављени изузетак на родитељски блок. Само у изузетном блоку се може користити како је приказано доле.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Објашњење синтаксе:

  • У горњој синтакси, кључна реч РАИСЕ се користи у блоку за руковање изузецима.
  • Кад год програм наиђе на изузетак „име_изузетака“, изузећем се рукује и довршит ће се нормално
  • Али кључна реч 'РАИСЕ' у делу за руковање изузецима ће проширити овај изузетак на надређени програм.

Напомена: Док подизање изузетка на надређени блок, изузетак који се подиже такође треба да буде видљив на надређеном блоку, у супротном ће орацле избацити грешку.

  • Можемо користити кључну реч „РАИСЕ“ праћену именом изузетка да бисмо покренули тај одређени кориснички дефинисани / предефинисани изузетак. Ово се може користити и у извршном делу и у делу за руковање изузецима за подизање изузетка.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Објашњење синтаксе:

  • У горњој синтакси, кључна реч РАИСЕ се користи у извршном делу иза чега следи изузетак „изнимка_име“.
  • Ово ће покренути овај изузетак у време извршења, и ово треба даље решавати или подизати.

Пример 1 : У овом примеру ћемо видети

  • Како пријавити изузетак
  • Како подићи декларисани изузетак и
  • Како га проширити у главни блок
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Објашњење кода:

  • Линија 2 : Проглашавање променљиве „сампле_екцептион“ типом ЕКСЦЕПТИОН.
  • Редак кода 3 : Поступак проглашавања нестед_блоцк.
  • 6. ред кода : Штампање израза „Унутар угнежђеног блока“.
  • Редак кода 7: Штампање изјаве „Подизање сампле_екцептион из угнежђеног блока.“
  • Редак кода 8: Повећавање изузетка помоћу „РАИСЕ сампле_екцептион“.
  • Редак кода 10: Обрађивач изузетака за изузетак сампле_екцептион у угнежђеном блоку.
  • Линија кода 11: Штампање израза „Изузетак забележен у угнежђеном блоку. Подизање у главни блок '.
  • Редак кода 12: Подизање изузетка у главни блок (ширење у главни блок).
  • Редак кода 15: Штампање изјаве „Унутар главног блока“.
  • Редак кода 16: Штампање изјаве „Позивање угнежђеног блока“.
  • Линија кода 17: Позивање процедуре нестед_блоцк.
  • Редак кода 19: Обрађивач изузетака за сампле_екцептион у главном блоку.
  • Редак кода 20: Штампање изјаве „Изузетак је забележен у главном блоку“.

Важне напомене које треба напоменути у изузетку

  • У функцији, изузетак би увек требало да врати вредност или да изузетак додатно повећа. у супротном ће Орацле приликом покретања појавити грешку „Функција враћена без вредности“.
  • Изводи за контролу трансакција могу се дати у блоку за руковање изузецима.
  • СКЛЕРРМ и СКЛЦОДЕ су уграђене функције које ће дати поруку и код за изузеће.
  • Ако се изузетак не обради, тада ће се подразумевано вратити све активне трансакције у тој сесији.
  • РАИСЕ_АППЛИЦАТИОН_ЕРРОР (- <код_грешке>, <порука_грешке>) може се користити уместо РАИСЕ за подизање грешке са корисничким кодом и поруком. Код грешке треба да буде већи од 20000 и са префиксом „-“.

Резиме

После овог поглавља. требали бисте бити у могућности да радите на следећим аспектима изузетака Пл СКЛ

  • Руковање изузецима
  • Дефинишите изузетак
  • Повећајте изузетак
  • Размножавање изузетака