Mgawanyiko kwa ushughulikiaji usiofuata kanuni za sifuri. Vipengele vya kushughulikia makosa ya seva ya hifadhidata ya Oracle. Makosa Yanayotokana na Vikwazo Muhimu vya Kigeni

Ph.D. Vladimir Likhachev, Chuo Kikuu cha Kaluga Pedagogical kilichoitwa baada ya K.E. Tsiolkovsky

Kwa programu zinazofanya kazi na hifadhidata, ni muhimu sio tu kusindika makosa yao kwa usahihi, lakini pia kutoa ujumbe wa habari kuhusu makosa haya. Uwepo wa ujumbe kama huo hukuruhusu kutambua haraka sababu na kusahihisha makosa. Hii ni kweli hasa wakati wa kufanya kazi na programu ya mtumiaji wa mwisho, kwa kuwa katika hali nyingi hajui tu muundo wa database maalum, lakini pia misingi ya kinadharia ya hifadhidata ya uhusiano.

Cha ajabu, hali na kizazi cha ujumbe wa makosa katika programu mara nyingi ni tofauti sana na kushughulikia makosa yenyewe. Wakati wa kushughulikia makosa, kwa kawaida inawezekana kuendeleza mkakati wa jumla, ambayo inafanya uwezekano wa kuweka ujanibishaji wao katika kazi moja au zaidi. Njia sawa ya ujumbe wa makosa inaweza kutekelezwa kwa kuzingatia ukweli kwamba katika ujumbe wa makosa, seva ya Oracle inaonyesha aina ya kosa na kitu cha database kilichosababisha. Vitu kama hivyo kawaida ni vizuizi, kama vile funguo za msingi, za kipekee na za kigeni, faharisi za kipekee, vizuizi vya "sio null", n.k. Kutoka kwa jedwali la mfumo na maoni ya hifadhidata, habari ya kina juu ya vizuizi hivi inaweza kupatikana na maadili yanaweza kuamua ambayo yanaweza. kubadilishwa na kusababisha hitilafu. Lakini shida ni kwamba kutekeleza utaratibu kama huu wa kutoa ujumbe wa makosa katika programu halisi hukutana na shida kadhaa:

  • Utegemezi wa ujumbe wa makosa kwa madhumuni ya programu. Hata programu zinazofanya kazi na hifadhidata sawa zinaweza kuhitaji kutoa ujumbe tofauti kuhusu kosa sawa. Kwa mfano, katika mpango wa kuhariri data na mtumiaji, ujumbe unapaswa kuwa: "Bidhaa yenye jina sawa tayari imesajiliwa! Angalia jina la bidhaa!" Lakini mpango wa uingizaji wa data unahitaji ujumbe ulio na maudhui tofauti kabisa: "Data iliyoingizwa inarudiwa - angalia tarehe ambayo data inaletwa!"
  • Ugumu wa kutoa ujumbe kwa baadhi ya makosa yanayosababishwa na mapungufu ya hifadhidata. Kwa mfano, ANGALIA vizuizi kwenye jedwali vinaweza kutumia maswali na masharti changamano. Kwa hivyo, kutoa ujumbe kulingana na uchambuzi wao inaweza kuwa kazi ngumu sana.
  • Kwa kutumia jedwali maalum na majina ya safu wima katika programu za mteja ambazo ni tofauti na majina yao kwenye hifadhidata. Kwa mfano, jedwali lina jina "BIDHAA", na katika programu ya mteja data kutoka kwa jedwali hili inaweza kuonyeshwa kwenye saraka kama "Bidhaa" au "Bidhaa".

Mchanganyiko wa mambo haya kwa kawaida husababisha ukweli kwamba kizazi cha ujumbe hata kuhusu makosa ya aina moja hutekelezwa kila mmoja kwa kila shughuli. Kama matokeo, msimbo wa kutoa ujumbe wa makosa unasambazwa katika programu nzima, na kuifanya iwe ngumu kudumisha. Kwa sababu ya hitaji la kuandika msimbo kwa karibu kila kosa linalowezekana, makosa kadhaa ambayo msanidi anafahamu huisha bila ujumbe unaolingana kwa mtumiaji. Kwa hivyo, ujumbe wa taarifa za kutosha kwa mtumiaji wa mwisho hutolewa kwa baadhi ya makosa tu; katika hali nyingine, lazima aridhike na, bora zaidi, ujumbe kutoka kwa seva ya hifadhidata yenyewe. Mara nyingi, maudhui ya habari ya ujumbe huo kwa mtumiaji wa kawaida haitoshi kutambua sababu ya tatizo na kuiondoa.

Njia iliyojadiliwa katika kifungu cha kutoa ujumbe wa makosa ya habari kwa mtumiaji ni ya ulimwengu wote na inaweza kutekelezwa katika programu za mteja na kwa upande wa seva ya Oracle. Inaweza kutumika katika aina mbalimbali za programu, kama vile:

  • Programu zinazotumia kiolesura maalum kuingiza na kubadilisha data ya hifadhidata. Katika hali nyingi, ujumbe wa makosa unaweza kupatikana kwa kuchambua muundo wa hifadhidata. Hii itamjulisha mtumiaji kuhusu sababu yao kwa juhudi ndogo kutoka kwa watengenezaji na programu.
  • Programu zilizo na uwezo wa mtumiaji kuunda maswali ya kiholela ya SQL. Kuzalisha ujumbe kulingana na uchanganuzi wa muundo wa hifadhidata kunaweza kuwa muhimu hasa kwa programu ambazo zinalenga watumiaji mbalimbali, ikiwa ni pamoja na wale walio na kiwango cha chini cha ujuzi katika eneo hili. Hii itafanya ujumbe wa makosa katika maswali ya SQL kueleweka zaidi kwa mtumiaji.
  • Majukwaa ya mada. Kutumia mbinu zilizoelezwa katika makala itaruhusu jukwaa la somo lenyewe kutoa ujumbe wa habari kuhusu makosa ya hifadhidata kulingana na uchanganuzi wa muundo wake. Hii itafanya iwezekane kupunguza msimbo katika lugha ya jukwaa inayotumika kushughulikia hali za makosa. Na makosa ambayo yanahitaji ujumbe maalum, lakini ikawa bila wao, itakuwa na taarifa ya kutosha ili kufanya kutambua sababu yao iwe rahisi zaidi.

Shida za uundaji wa ujumbe zilizoelezewa hapo juu zinaweza kutatuliwa ikiwa ujumbe wa makosa umegawanywa katika vikundi viwili:

  • ujumbe wa ulimwengu wote unaotokana na uchambuzi wa muundo wa hifadhidata;
  • ujumbe maalum ambao hufafanuliwa kibinafsi kwa kila kosa.

Mbinu ya kutoa ujumbe wa makosa ya hifadhidata iliyoelezewa katika nakala hii inaweza kutumika kwa seva nyingi za hifadhidata za uhusiano. Mfano wa matumizi yake kwa hifadhidata za seva ya Firebird inajadiliwa katika makala. Ikiwa maombi ya mteja yametengenezwa katika Object Pascal (Delphi, Kylix, Free Pascal), basi uwezo wa maktaba ya JEDI inaweza kuwa muhimu kutambua sababu za makosa yasiyotarajiwa.

1. Ujumbe wa makosa ya jumla unaosababishwa na mapungufu ya hifadhidata

Kama ilivyoelezwa hapo juu, wazo kuu la kuunda ujumbe wa ulimwengu wote ni kuunda ujumbe ambao una taarifa ya kutosha na inayoeleweka kwa mtumiaji wa mwisho kulingana na data kutoka kwa ujumbe wa makosa kutoka Oracle na kuhusu muundo wa hifadhidata. Hebu tuchukulie kuwa katika jedwali la "GOODS" (script 1.1) mtumiaji anajaribu kuongeza bidhaa yenye kichwa (safu "TITLE") ambacho tayari kiko kwenye jedwali.

TUNZA DEMO YA JEDWALI. BIDHAA (CODE INTEGER NOT NULL , TITLE VARCHAR2(50 byte) NOT NULL , BEI NUMBER(16, 2) NOT NULL , CONTRAINT CK_PRICE CHECK (PRICE > 0), CONTRAINT PK_GOODS FUNGUO MSINGI (CODE)); MAONI KUHUSU DEMO YA JEDWALI.BIDHAA ni "Bidhaa"; MAONI KUHUSU COLUMN DEMO.GOODS.CODE ni "Msimbo wa Bidhaa"; MAONI KUHUSU COLUMN DEMO.GOODS.TITLE ni "Kichwa"; TOA MAONI KUHUSU COLUMN DEMO.GOODS.BEI ni "Bei"; UTANDA INDEX YA KIPEKEE DEMO.IDX_GOODS_TITLE KWENYE DEMO.GOODS (TITLE);

Hati 1.1. Kuunda meza ya "BIDHAA".

Katika hali hii, seva itazalisha hitilafu, kwa kuwa safu wima ya "TITLE", ambayo huhifadhi jina la bidhaa, imejumuishwa katika faharasa ya kipekee "DEMO.IDX_GOODS_TITLE":

Badala ya ujumbe huu kwa mtumiaji, kwa mfano, moja ya ujumbe unaweza kuzalishwa:

  • Thamani ya sehemu ya "Jina" katika jedwali la "Bidhaa" lazima iwe ya kipekee!
  • Bidhaa yenye jina hili tayari imesajiliwa! Angalia jina la bidhaa!
  • Saraka ya bidhaa haiwezi kuwa na bidhaa zilizo na majina sawa!

Ingawa barua pepe hizi hutofautiana, zote zina habari kuhusu kitu ambacho kizuizi cha kipekee kinakiukwa - hii ni sehemu ya "Jina" ya jedwali la "Bidhaa".

Mojawapo ya matatizo ya kuzalisha aina hii ya ujumbe ni kwamba majina ya watumiaji wa sehemu na jedwali hutofautiana na majina ya jedwali na safu wima kwenye hifadhidata. Ili mtumiaji aelewe ujumbe wa hitilafu, lazima atumie majina maalum. Jedwali tofauti au maoni ya majedwali na safu wima yanaweza kutumika kulinganisha jedwali na majina ya sehemu na majina yao maalum. Chaguo la mwisho linaweza kuzingatiwa kuwa bora zaidi, kwani hukuruhusu kuandika wakati huo huo hifadhidata. Ndio maana katika hati 1.1, majina yao maalum hupewa kama maoni kwa jedwali na safu wima zake. Ikiwa unalinganisha ujumbe na maoni hapo juu kwa jedwali na safu wima, utaona kuwa kutoa ujumbe wa kwanza ndio chaguo rahisi zaidi. Ili kutoa jumbe zingine mbili, usanisi wa kileksia unaweza kuhitajika, lakini hii ni kazi tofauti. Ningependa kuteka mawazo yako kwa ukweli kwamba baadaye katika makala moja tu ya chaguo iwezekanavyo ujumbe kwa kila kesi ya makosa hutolewa. Kwa mazoezi, uchaguzi wa mtindo wa ujumbe na yaliyomo inaweza kutegemea mambo kadhaa na itaamuliwa na mbuni wa mfumo.

Bila shaka, hatuwezi kukataa hali ambapo hakuna maoni kwa meza au safu ambayo inapaswa kuingizwa katika ujumbe. Katika hali hii, ujumbe wa hitilafu unaweza kuonyesha meza au jina la safu moja kwa moja.

2. Thamani ya sehemu inayohitajika haijabainishwa (SI kikwazo NULL)

Hitilafu hii inatolewa na seva katika matukio kadhaa:

  • kizuizi cha "sio null" kilichowekwa kwenye safu kilikiukwa;
  • Thamani ya safu wima ambayo ni sehemu ya faharasa ya kipekee, bwana au ufunguo wa kipekee haijabainishwa.

Katika visa hivi vyote seva hutoa hitilafu:

Ili kupata maelezo ya jedwali na safu wima kutoka kwa ujumbe wa hitilafu, unaweza kutumia Hoji 2.1.

chagua tc.comments kama table_comment, cc.comments kama column_comment kutoka safuwima_zote_c, all_tab_comments tc, all_col_comments cc ambapo c.owner = :mmiliki na c.table_name = :jedwali_jina na c.column_name = :column_name na tc.owner = c.owner na tc.table_name = c.table_name = c.owner na cc.table_name = c.table_name na cc.column_name = c.column_name

Ombi 2.1. Kupata maelezo ya jedwali na safu wima

Kama vigezo vya kuuliza "mmiliki", "jedwali_jina", "jina_la safu" lazima ubainishe jina la schema, jedwali na safu wima kutoka kwa ujumbe wa hitilafu, mtawalia. Hoja inarudisha maoni kwa jedwali na safu wima.

Kwa kutumia matokeo ya ombi hili, ujumbe wa makosa unaweza kuzalishwa, kwa mfano, na maudhui yafuatayo:

Lazima ueleze thamani ya safu "<Описание поля>"katika meza"<Описание таблицы>" katika<добавлении новой/изменении>kumbukumbu.

3. Upekee wa thamani ya sehemu au seti ya safu wima imekiukwa

Haja ya kuingiza thamani ya safu wima ya kipekee inaweza kuhitajika hasa katika hali tatu:

  • safu imejumuishwa kwenye ufunguo mkuu;
  • safu imejumuishwa katika ufunguo wa kipekee;
  • safu imejumuishwa katika faharisi ya kipekee.

Katika visa vyote vitatu, Hifadhidata ya Oracle hutoa makosa sawa:
ORA-00001: kizuizi cha kipekee kimekiukwa (<Схема>.<Ограничение>)

Ujumbe wa hitilafu hubainisha kikwazo kilichosababisha kosa. Ili kupata taarifa kuhusu nguzo zilizojumuishwa kwenye funguo kuu au za kipekee, unaweza kutumia swala 3.1, ili kupata taarifa kuhusu index - swala 3.2.

chagua dcs.constraint_type, cc.table_name, tc.comments kama table_comment, cc.column_name, ccom.comments kama safu_maoni kutoka all_cons_columns cc jiunge na all_tab_comments tc on (tc.owner = cc.owner na tc.table_name = cc.table_name) jiunge na maoni_yote ccom kwenye (ccom.owner = cc.owner na ccom.table_name = cc.table_column._name. = cc.table_column._name.) column_name) jiunge na all_constraints dcs kwenye (dcs.constraint_name = cc.constraint_name) ambapo cc.owner = :owner na cc.constraint_name = :key_name
Ombi 3.1. Kupata habari kuhusu safu wima za jedwali zilizojumuishwa kwenye funguo kuu au za kipekee.
chagua ic.table_name, tc.comments kama table_comment, ic.column_name, ccom.comments kama safu_maoni kutoka safuwima_zote ic unganisha maoni_ya_ya_maoni tc kwenye (tc.owner = ic.table_owner na tc.table_name = ic.table_name) jiunge na maoni_col_yote ccom kwenye (ccom.owner = ic.table_owner na ccom.table_name = ic.table_come = ic.table_me. column_name) ambapo table_owner = :mmiliki na index_name = :index_name
Ombi 3.2. Kupata taarifa kuhusu safu wima za jedwali zilizojumuishwa kwenye faharasa.

Kama vigezo, hoja hupitishwa jina la schema ("mmiliki"), jina la ufunguo ("jina_la_msingi") au jina la faharasa ("index_name"). Hoja hurejesha majina na maoni kwa majedwali na safu wima zilizojumuishwa kwenye kikwazo. Hoja ya 3.1 pia inarudisha aina ya kizuizi ("constraint_type"): "P" ndio ufunguo mkuu, "U" ndio ufunguo wa kipekee. Idadi ya rekodi zilizorejeshwa na hoja inalingana na idadi ya safu wima katika kikwazo cha kipekee.

Kulingana na taarifa iliyopokelewa kuhusu kikwazo cha upekee, arifa za ujumbe wa hitilafu zinaweza kutolewa kwa mtumiaji, kwa mfano, zile zilizotolewa katika Sehemu ya 1.

4. Makosa Yanayotokana na Vikwazo Muhimu vya Kigeni

Wakati wa kufanya shughuli kwenye data ya jedwali iliyounganishwa na funguo za kigeni, kuna sababu kadhaa zinazosababisha makosa:

1. Rekodi huongezwa kwenye jedwali la mtumwa ambalo safu wima iliyojumuishwa kwenye ufunguo wa kigeni haina thamani inayolingana katika jedwali kuu. Hali kama hiyo hutokea wakati wa kubadilisha thamani ya safu ya jedwali ndogo ikiwa thamani mpya ya safu haipo kwenye jedwali kuu. Hifadhidata ya Oracle hutoa hitilafu katika kesi hii:

  1. Jedwali kuu linajaribu kubadilisha thamani ya safu wima ambayo imerejelewa katika jedwali la watoto. Kwa kesi hii, Hifadhidata ya Oracle hutoa kosa:
  1. Jedwali kuu linajaribu kufuta data ambayo imerejelewa kwenye jedwali la watumwa. Ikiwa ufafanuzi wa uhusiano kati ya majedwali unabainisha kikwazo cha "HAKUNA HATUA" kwa operesheni ya kufuta data, basi Oracle hairuhusu data kufutwa kutoka kwa jedwali kuu ikiwa jedwali la watoto lina rekodi zinazohusiana na rekodi kufutwa. Kwa hali hii, Hifadhidata ya Oracle hutoa hitilafu sawa na kesi ya awali.

Ili kupata taarifa kuhusu safu wima za jedwali kuu na za watoto zilizojumuishwa kwenye ufunguo wa kigeni, unaweza kutumia swali lifuatalo 4.1.

chagua a.constraint_name, a.table_name, tc1.comments kama table_comment, a2.column_name, cc1.comments kama safu_maoni_mmiliki, b.jina_la_jedwali kama r_jedwali_jina, tc2.comments kama r_table.ccum2_comment, b.mmiliki_jina_la_jedwali, tc2.comment_comment_2 .maoni kama r_column_comment kutoka vikwazo_vyote a, vizuizi_vyote b, safu_ma_zote_vikwazo_zote a2, safu_zote_la_maoni b2, maoni_yote_ya_maoni tc1, maoni_yote_col cc1, maoni_yote_maoni tc2, maoni_yote_col2 cc2 ambapo a.owner = :mmiliki na a.constraint_key =Rconstraint_type =Rconstraint_me. chapa ("P","U") na b.constraint_name = a.r_constraint_name na b.owner = a.r_owner na a2.constraint_name = a.constraint_name na a2.table_name = a.table_name na a2.owner =.mmiliki na b2.constraint_name = b.constraint_name na b2.table_name = b.table_name na b2.owner = b.owner na b2.position = a2.nafasi na tc1.owner = a.owner na tc1.table_name = a.table_name na cc1. mmiliki = a2.mmiliki na cc1.table_name = a2.table_name na cc1.column_name = a2.column_name na tc2.owner = b.owner na tc2.table_name = b.table_name na cc2.owner = b2.owner_namecc = b. b2.table_name na cc2.column_name = b2.column_name
Ombi 4.1. Kupata habari kuhusu ufunguo wa kigeni.

Ombi lina vigezo viwili: "mmiliki" na "foreign_key" - mpango na ufunguo wa kigeni ambao unahitaji kupata habari. Inarudisha taarifa kuhusu safu wima zilizojumuishwa kwenye ufunguo wa kigeni: "meza_jina", "meza_maoni" - jina na maelezo ya jedwali ndogo; "column_name", "column_comment" - jina na maelezo ya safu ya jedwali ndogo. Safu wima za hoja zilizoainishwa na "r_" hurejesha maelezo kuhusu jedwali kuu. Idadi ya rekodi zilizorejeshwa na hoja inalingana na idadi ya safu wima zilizojumuishwa kwenye ufunguo wa kigeni.

Kulingana na habari hii, ujumbe wa makosa muhimu ya kigeni unaweza kuzalishwa kwa mtumiaji.

5. Ujumbe maalum wa makosa unaosababishwa na mapungufu ya hifadhidata

Haja ya kutumia ujumbe maalum inaweza kutokea ikiwa ujumbe wa makosa ya ulimwengu kwa sababu fulani hauwezi kutumika au hauwezi kuzalishwa. Mfano wa kesi ya mwisho ni ANGALIA vizuizi kwenye jedwali. Vikwazo vinaweza kuhusisha maswali na masharti ambayo yanaweza kuwa changamoto sana kuchanganua. Kwa hiyo, kwa vikwazo hivi mara nyingi ni rahisi zaidi kutumia ujumbe unaofafanuliwa wakati wa kubuni.

Vikundi viwili vya ujumbe maalum wa makosa vinaweza kutofautishwa. Aina ya kwanza ya ujumbe maalum imekusudiwa kutumiwa katika programu zote zinazofanya kazi na hifadhidata ya kawaida. Hizi zinaweza kuitwa kwa urahisi "ujumbe wa makosa ya kiwango cha hifadhidata." Kundi la pili la ujumbe ni maalum kwa matumizi fulani. Huenda zikahitajika wakati programu tofauti zinahitaji kuwasilisha ujumbe tofauti kwa mtumiaji kuhusu hitilafu sawa. Zinaweza kuitwa kwa urahisi "ujumbe maalum wa makosa ya kiwango cha programu". Ni rahisi kuhifadhi habari kuhusu kikundi cha kwanza cha ujumbe kwenye hifadhidata yenyewe na kutumia jedwali tofauti kwa hili. Ujumbe maalum kwa programu unaweza kuhifadhiwa katika rasilimali zake, kwa mfano, katika mfumo wa faili tofauti au pia katika hifadhidata. Utambulisho wa ujumbe maalum unaweza kufanywa kulingana na msimbo wa makosa, jina la schema, na neno moja au zaidi kutoka kwa ujumbe wa hitilafu.

6. Ujumbe wa Hitilafu kwa ANGALIA Vizuizi kwenye Majedwali

Hitilafu inapotokea kwa sababu ya kizuizi cha CHECK kwenye jedwali, seva hutoa hitilafu:
ORA-02290: ANGALIA kizuizi cha uadilifu kimekiukwa (<Схема>.<Имя ограничения>)

Kama ilivyoelezwa hapo juu, mara nyingi ni rahisi kutumia ujumbe maalum kwa makosa kama hayo. Kwa mfano, kikwazo cha "CK_PRICE" cha jedwali la "GOODS" kinaweza kutumia ujumbe maalum uliohifadhiwa katika jedwali maalum la ujumbe:

7. Matumizi jumuishi ya ujumbe maalum na wa kawaida wa makosa

Utaratibu unaonyumbulika wa kutoa ujumbe wa makosa ya taarifa kwa mtumiaji unatekelezwa katika hatua kadhaa (Mchoro 1):

1. Onyesha ujumbe wa makosa ya kiwango cha programu maalum. Programu hutafuta kwanza ujumbe wa makosa kati ya ujumbe mahususi wa programu. Ikiwa ujumbe kama huo utapatikana, utaonyeshwa na uundaji wa ujumbe umekamilika.

2. Toa ujumbe maalum kuhusu hitilafu ya kiwango cha hifadhidata. Ikiwa hakuna ujumbe unaopatikana katika hatua ya 1, utafutaji unafanywa kwa ujumbe maalum wa makosa ya kiwango cha hifadhidata. Ikipatikana, itaonyeshwa kwa mtumiaji na kizazi cha ujumbe wa hitilafu kinaishia hapa.

3. Kutoa ujumbe kulingana na uchambuzi wa muundo wa hifadhidata (ujumbe wa jumla). Ikiwa hakuna ujumbe maalum uliogunduliwa katika hatua za awali, basi hutolewa kulingana na uchambuzi wa muundo wa database. Inaonyeshwa kwa mtumiaji na uundaji wa ujumbe umekamilika.

4. Toa ujumbe kutoka kwa seva ya hifadhidata. Ikiwa ujumbe kwa mtumiaji haukutolewa katika hatua tatu zilizopita, ujumbe wa hitilafu kutoka kwa Oracle utaonyeshwa. Hali hii inaweza kutokea kwa sababu kadhaa. Kwa mfano, hitilafu maalum inapotokea ambayo ilitolewa kimakusudi katika utaratibu uliohifadhiwa au kichochezi kwa kutumia chaguo la kukokotoa la RAISE_APPLICATION_ERROR, na maudhui ya ujumbe ambayo hayahitaji kubadilishwa.

Kesi ngumu zaidi kuliko ile iliyotolewa katika nakala hii inawezekana. Kwa mfano, ikiwa ujumbe unazalishwa katika utaratibu uliohifadhiwa, ambao unaweza kuitwa kutoka kwa kichocheo au utaratibu mwingine uliohifadhiwa. Katika kesi hii, unaweza pia kuhitaji habari kuhusu jinsi utaratibu uliozalisha ujumbe wa kosa uliitwa. Na kwa hiyo ujumbe wa awali unaweza kuongezewa au kurekebishwa, kwa mfano, kulingana na taarifa kuhusu simu ya simu ya taratibu zilizohifadhiwa na vichochezi.

Katika baadhi ya matukio, ujumbe kama huo unaweza kuwa na taarifa zaidi kuliko ule uliotolewa katika hatua za awali. Kwa mfano, badala ya kikwazo cha CK_PRICE cha jedwali la DEMO.GOODS (hati 1.1), unaweza kufanya ukaguzi unaohitajika katika kichochezi kabla ya kuingiza na kusasisha rekodi na kutoa ujumbe kwa mtumiaji katika fomu ya "tayari":

Ikiwa bei ya bidhaa ni chini ya au sawa na sifuri, seva itazalisha hitilafu, kwa mfano:

Programu ya mteja inaweza kupitisha ujumbe huu mara moja kwa mtumiaji bila marekebisho.

Sababu nyingine inaweza kuwa kutokea kwa hitilafu ambayo kizazi cha ujumbe hakijatolewa.

Mchele. 1. Mlolongo wa kutoa ujumbe wa makosa ya hifadhidata.

Ningependa kusema kwamba hata ikiwa programu hutumia ujumbe maalum wa makosa, kutumia kazi ya jumla ya kutoa ujumbe kutaboresha muundo wa programu. Ikiwa ni lazima, muundo wa ujumbe maalum unaweza kusaidia viungo kwenye mfumo wa usaidizi, picha, nk. Mbinu iliyoelezwa ya kutoa ujumbe wa makosa ya hifadhidata inalenga zaidi katika utekelezaji katika programu ya mteja. Wakati huo huo, inaweza kutumika kwa upande wa seva katika taratibu zilizohifadhiwa, vichochezi vya meza, na pia katika vichochezi vya mfumo kwa tukio la SERVERERROR la ​​hifadhidata au schema.

Hitimisho

Madhumuni ya makala haya ni kuonyesha mawazo ya kimsingi ya mbinu ambayo inaweza kutumika kuzalisha ujumbe wa makosa ya hifadhidata ya Oracle kwa mtumiaji wa mwisho. Ingawa baadhi ya vipengele vya utekelezaji viliachwa nje ya upeo wa makala, ningependa kutumaini kwamba mbinu iliyoelezwa katika makala itapunguza gharama za kazi katika maendeleo ya programu na kuongeza uaminifu na ubora wake.

Vighairi vinapotokea, ni muhimu kutoa ujumbe wa makosa unaomfaa mtumiaji. Vighairi vimetajwa tayari katika sehemu ya vizuizi vya msingi vya PL/SQL. Sasa ni wakati wa kuwaangalia kwa undani zaidi.

Vighairi

Isipokuwa ni hali ya makosa ambayo imeinuliwa - au anapata msisimko - tatizo linapotokea. Kuna tofauti nyingi tofauti, kila moja inahusishwa na aina maalum ya shida. Kighairi kinapotokea, utekelezaji wa msimbo huacha kwenye taarifa iliyoibua ubaguzi, na udhibiti huhamishiwa kwenye sehemu ya kizuizi ambayo inashughulikia ubaguzi. Ikiwa kizuizi hakina sehemu inayoweza kutekelezwa, PL/SQL inajaribu kupata sehemu inayoweza kutekelezwa katika ikijumuisha kitengo cha msingi (kufunga block ya msingi), i.e. katika kizuizi ambacho kiko nje ya nambari iliyoibua ubaguzi. Ikiwa hakuna kidhibiti kwa ubaguzi fulani katika kizuizi cha karibu kilichofungwa, basi utafutaji unaendelea katika vizuizi vya viwango vinavyofuata hadi kidhibiti kinachofaa kipatikane, na ikiwa hakiwezi kupatikana, basi utekelezaji wa programu unasitishwa na ujumbe wa hitilafu ambao haujashughulikiwa.

Sehemu ya ushughulikiaji ya ubaguzi ni mahali pazuri pa kutoa ujumbe wa hitilafu na kutekeleza kusafisha (kusafisha), ambayo hukuruhusu kuondoa chochote ambacho kinaweza kusababisha machafuko au shida baadaye. Ikiwa ubaguzi ulitupwa wakati wa utaratibu ulioingiza safu mlalo kwenye jedwali, utaratibu wa kawaida wa kusafisha unaweza kujumuisha taarifa ya ROLLBACK.

Udhibiti ukishahamishiwa kwa kidhibiti kisichofuata kanuni, hakirudishwi kwa taarifa iliyosababisha ubaguzi. Badala yake, udhibiti huhamishiwa kwenye taarifa ya msingi ya kuzuia ambayo hufuata mara moja kizuizi kilichowekwa kiota au utaratibu/simu ya kazi.

Vighairi vya Mfumo

Tayari unafahamu ubaguzi wa ZERO_DIVIDE, ambao umefafanuliwa awali katika PL/SQL. Kuna vighairi vingine vichache vya mfumo ambavyo vinatambuliwa na kukuzwa na PL/SQL au Oracle. Jedwali la 1 linatoa orodha kamili zaidi ya vighairi vya mfumo.

PL/SQL inaweza kutoa maelezo ya makosa kwa watumiaji kwa njia mbili. Njia ya kwanza ni kutumia amri ya SQLCODE, ambayo inarudisha msimbo wa makosa. Msimbo huu ni nambari hasi, kwa kawaida ni sawa na nambari ya hitilafu ya ORA ambayo huchapishwa wakati programu itasitishwa ikiwa ubaguzi hautashughulikiwa. Njia ya pili ni kurudisha ujumbe wa maandishi unaoelezea kosa. Haishangazi, amri inayolingana inaitwa SQLERRM. Unaweza kutumia SQLCODE au SQLERRM katika kidhibiti chako cha ubaguzi. Kumbuka: Sio vighairi vyote vya mfumo vilivyo na majina.

Jedwali1 . Vighairi vya Mfumo

Ubaguzi wa mfumomsimbo wa makosa

Sababu ya msisimko

MSHALE_ TAYARI_ FUNGUA

ORA-06511

Inajaribu kufungua kishale ambacho tayari kimefunguliwa

DUP_VAL_ON_INDEX

ORA-00001

Kujaribu kuingiza thamani iliyorudiwa kwenye safu ambayo ina faharasa ya kipekee na kwa hivyo kizuizi cha kipekee

SI SAHIHI_ MSHALE

ORA-01001

Kujaribu KUCHUKUA kishale ambacho hakikufunguliwa au kujaribu kufunga kishale ambacho hakikufunguliwa.

HAKUNA_DATA_IMEPATIKANA

ORA-01403

Kujaribu kufanya SELECT INTO wakati SELECT inarejesha safu mlalo sufuri (na sababu zingine ambazo ziko nje ya upeo wa kitabu hiki)

PROGRAM_ HITILAFU

ORA-06501

Hitilafu ya ndani. Kwa kawaida inamaanisha unahitaji kuwasiliana na Usaidizi wa Oracle

HIFADHI_ HITILAFU

ORA-06500

Programu inaishiwa na kumbukumbu ya mfumo

TIMEOUT_ON_RESOURCE

ORA-00051

Mpango ulisubiri kwa muda mrefu sana kwa rasilimali fulani kupatikana

SAFU_NYINGI

ORA-01422

SELECT INTO katika PL/SQL ilirudisha zaidi ya safu mlalo moja

VALUE_ HITILAFU

ORA-06502

PL/SOL ilikumbana na ubadilishaji au upunguzaji wa data usio sahihi, au kikwazo kisicho sahihi cha data

SUFURI_ GAWANYA

ORA-01476

Jaribu kugawanya kwa sifuri

Vighairi vingine vyote na makosa ya ndani ambayo hayajashughulikiwa na vighairi vilivyofafanuliwa kwenye kizuizi cha msingi. Inatumika katika hali ambapo haujui ni kibaguzi gani hasa cha kushughulikia na unataka kushughulikia tofauti zozote ambazo hutupwa.

Sasa hebu turudi kwenye mfano wa kwanza kabisa wa sura hii na tutumie SQLCODE na SQLERRM ndani yake. Chini ni msimbo wa chanzo wa mfano na matokeo ya uzinduzi wake (Mchoro 1).

Nambari_a NAMBA:= 6;

Num_b NUMBER;

Nambari_b:= 0;

Num_a:= Num_a / Num_b;

Nambari_b:= 7;

dbms_output.put_line(" Thamani ya Num_b "|| Num_b);

ILA

WAKATI ZERO_GAWANYA BASI

err_num NUMBER:= SQLCODE;

err_msg VARCHAR2(512) := SQLERRM;

dbms_output.put_line("Nambari ya Hitilafu ya ORA " || err_num);

dbms_output.put_line("Ujumbe wa hitilafu wa ORA " || err_msg);

dbms_output.put_line("Thamani ya Num_a " || Num_a);

dbms_output.put_line("Thamani ya Num_b " || Num_b);

SQL> kuweka serveroutput juu

SQL>TANGAZA

2 nambari_a NAMBA:= 6;

3 num_b NUMBER;

4 ANZA

5 num_b:= 0;

6 nambari_a:= nambari_a / nambari_b;

7 num_b:= 7;

8 dbms_output.put_line(" Thamani ya num_b "|| num_b);

9 ILA

10 WAKATI ZERO_DIVIDE

11 BASI

13 err_num NUMBER:= SQLCODE;

14 err_msg VARCHAR2(512) := SQLERRM;

15 ANZA

16 dbms_output.put_line("Nambari ya Hitilafu ya ORA "|| err_num);

17 dbms_output.put_line("Ujumbe wa hitilafu wa ORA " || err_msg);

18 dbms_output.put_line("Thamani ya num_a " || num_a);

19 dbms_output.put_line("Thamani ya num_b " || num_b);

20 MWISHO;

21 MWISHO;

Nambari ya Hitilafu ya ORA -1476

Ujumbe wa Hitilafu wa ORA ORA-01476: kigawanyaji ni sawa na sifuri

Thamani ya nambari_a 6

Thamani ya nambari_b 0

Utaratibu wa PL/SQL umekamilika.

Mchele. 1. Kutumia SQLCODE na SQLERRM wakati wa kushughulikia vighairi vya mfumo

Katika sura hii, tutajadili Vighairi katika PL/SQL. Isipokuwa ni hali ya hitilafu wakati wa utekelezaji wa programu. PL/SQL inasaidia watengenezaji programu kupata hali kama hizi kwa kutumia ILA kuzuia katika programu na hatua inayofaa inachukuliwa dhidi ya hali ya makosa. Kuna aina mbili za vighairi -

  • Vighairi vilivyoainishwa na mfumo
  • Vighairi vilivyoainishwa na mtumiaji

Sintaksia ya Ushughulikiaji wa Vighairi

Sintaksia ya jumla ya kushughulikia ubaguzi ni kama ifuatavyo. Hapa unaweza kuorodhesha tofauti nyingi uwezavyo kushughulikia. Isipokuwa chaguo-msingi itashughulikiwa kwa kutumia WAKATI wengine BASI

TANGAZA ANZA ILA WAKATI ubaguzi1 BASI ubaguzi1-ushughulikiaji-taarifa WAKATI ubaguzi2 BASI ubaguzi2-ushughulikiaji-taarifa WAKATI ubaguzi3 BASI ubaguzi3-ushughulikiaji-taarifa ........ WAKATI Nyingine BASI Kauli-tatu-kushughulikia-ZIMISHIA;

Mfano

Hebu tuandike msimbo ili kuelezea dhana. Tutakuwa tukitumia jedwali la WATEJA tulilounda na kutumia katika sura zilizopita −

TANGAZA wateja wa c_id.id%aina:= 8; c_name customerS.Name%aina; c_addr customers.anwani%aina; ANZA CHAGUA jina, anwani INGIA c_name, c_addr KUTOKA kwa wateja WHERE id = c_id; DBMS_OUTPUT.PUT_LINE("Jina: "|| c_name); DBMS_OUTPUT.PUT_LINE("Anwani: " || c_addr); ISIPOKUWA WAKATI hakuna_data_inayopatikana BASI dbms_output.put_line("Hakuna mteja kama huyo!"); WAKATI wengine BASI dbms_output.put_line("Error!"); MWISHO; /

Hakuna mteja kama huyo! Utaratibu wa PL/SQL umekamilika.

Programu iliyo hapo juu inaonyesha jina na anwani ya mteja ambaye kitambulisho chake kimetolewa. Kwa kuwa hakuna mteja aliye na nambari ya kitambulisho 8 kwenye hifadhidata yetu, programu inaongeza ubaguzi wa wakati wa kukimbia HAKUNA_DATA_IMEPATIKANA, ambayo imekamatwa katika EXCEPTION block.

Kuongeza Vighairi

Isipokuwa huletwa na seva ya hifadhidata kiotomatiki wakati wowote kunapokuwa na hitilafu yoyote ya hifadhidata ya ndani, lakini isipokuwa kunaweza kuonyeshwa waziwazi na mpangaji programu kwa kutumia amri. INUA. Ifuatayo ni syntax rahisi ya kuongeza ubaguzi -

DECLARE exception_name EXCEPTION; ANZA IKIWA sharti BASI INUA exception_name; ENDIF; ISIPOKUWA WAKATI Exception_name BASI taarifa; MWISHO;

Unaweza kutumia sintaksia iliyo hapo juu katika kuongeza ubaguzi wa kawaida wa Oracle au ubaguzi wowote ulioainishwa na mtumiaji. Katika sehemu inayofuata, tutakupa mfano wa kuongeza ubaguzi uliobainishwa na mtumiaji. Unaweza kuongeza vighairi vya kawaida vya Oracle kwa njia sawa.

Vighairi vilivyoainishwa na Mtumiaji

PL/SQL hukuruhusu kufafanua vighairi vyako mwenyewe kulingana na hitaji la programu yako. Ubaguzi ulioainishwa na mtumiaji lazima utangazwe na kisha kuonyeshwa wazi, kwa kutumia taarifa ya RAISE au utaratibu. DBMS_STANDARD.RAISE_APPLICATION_ERROR.

Syntax ya kutangaza ubaguzi ni -

TANGAZA ubaguzi wangu isipokuwa;

Mfano

Mfano ufuatao unaonyesha dhana. Mpango huu unauliza kitambulisho cha mteja, wakati mtumiaji anaingiza kitambulisho kisicho sahihi, isipokuwa kitambulisho_batili imeinuliwa.

TANGAZA wateja wa c_id.id%type:= &cc_id; c_name customerS.Name%aina; c_addr customers.anwani%aina; -- ubaguzi uliobainishwa na mtumiaji ex_invalid_id EXCEPTION; ANZA IF c_id<= 0 THEN RAISE ex_invalid_id; ELSE SELECT name, address INTO c_name, c_addr FROM customers WHERE id = c_id; DBMS_OUTPUT.PUT_LINE ("Name: "|| c_name); DBMS_OUTPUT.PUT_LINE ("Address: " || c_addr); END IF; EXCEPTION WHEN ex_invalid_id THEN dbms_output.put_line("ID must be greater than zero!"); WHEN no_data_found THEN dbms_output.put_line("No such customer!"); WHEN others THEN dbms_output.put_line("Error!"); END; /

Wakati nambari iliyo hapo juu inatekelezwa kwa haraka ya SQL, hutoa matokeo yafuatayo -

Weka thamani ya cc_id: -6 (hebu tuweke thamani -6) ya zamani 2: c_id customers.id%type:= &cc_id; mpya 2: c_id customers.id%type:= -6; ID lazima kiwe kikubwa kuliko sufuri Utaratibu wa !PL/SQL umekamilika.

Vighairi vilivyoainishwa mapema

PL/SQL hutoa vighairi vingi vilivyoainishwa awali, ambavyo hutekelezwa wakati sheria yoyote ya hifadhidata inakiukwa na programu. Kwa mfano, ubaguzi uliofafanuliwa awali NO_DATA_FOUND huonyeshwa wakati taarifa ya SELECT INTO haileti safu mlalo. Jedwali lifuatalo linaorodhesha vighairi vichache muhimu vilivyobainishwa awali -

Isipokuwa Hitilafu ya Oracle SQLCODE Maelezo
ACCESS_INTO_NULL 06530 -6530 Huinuliwa wakati kitu kisicho na maana kinapewa thamani kiotomatiki.
KESI_HAIJAPATIKANA 06592 -6592 Hutolewa wakati hakuna chaguo lolote katika kifungu cha WAKATI WA KESI ya taarifa iliyochaguliwa, na hakuna kifungu ELSE.
COLLECTION_NI_NULL 06531 -6531 Hutolewa wakati programu inapojaribu kutumia mbinu za ukusanyaji kando na EXISTS kwenye jedwali au safu iliyopangwa ambayo haijaanzishwa, au programu inapojaribu kugawa thamani kwa vipengele vya jedwali au mpangilio tofauti ambao haujaanzishwa.
DUP_VAL_ON_INDEX 00001 -1 Huinuliwa wakati thamani rudufu zinajaribiwa kuhifadhiwa kwenye safu wima yenye faharasa ya kipekee.
INVALID_CURSOR 01001 -1001 Huinuliwa wakati majaribio yanafanywa kufanya operesheni ya kishale ambayo hairuhusiwi, kama vile kufunga kielekezi ambacho hakijafunguliwa.
INVALID_NUMBER 01722 -1722 Huinuliwa wakati ubadilishaji wa mfuatano wa herufi kuwa nambari unaposhindwa kwa sababu mfuatano huo hauwakilishi nambari halali.
INGIA_IMEKATAA 01017 -1017 Inatolewa wakati programu inapojaribu kuingia kwenye hifadhidata na jina la mtumiaji au nenosiri batili.
HAKUNA_DATA_IMEPATIKANA 01403 +100 Huinuliwa wakati taarifa ya SELECT INTO hairejeshi safu mlalo.
HAIJAWAHI_KUINGIA_ 01012 -1012 Inakuzwa wakati simu ya hifadhidata inatolewa bila kuunganishwa kwenye hifadhidata.
PROGRAM_ERROR 06501 -6501 Inakuzwa wakati PL/SQL ina shida ya ndani.
ROWTYPE_MISMATCH 06504 -6504 Huinuliwa wakati kielekezi kinapochukua thamani katika kigezo chenye aina ya data isiyolingana.
NAFSI_NI_NULL 30625 -30625 Hutolewa wakati mbinu ya mwanachama inatumiwa, lakini mfano wa aina ya kitu haukuanzishwa.
STORAGE_ERROR 06500 -6500 Inatolewa wakati PL/SQL ilipoishiwa na kumbukumbu au kumbukumbu ilipoharibika.
SAFU_NYINGI 01422 -1422 Huinuliwa wakati taarifa ya SELECT INTO inarudisha zaidi ya safu mlalo moja.
VALUE_ERROR 06502 -6502 Huinuliwa wakati hitilafu ya hesabu, ubadilishaji, upunguzaji au ukubwa wa kizuizi inapotokea.
ZERO_DIVIDE 01476 1476 Inafufuliwa wakati jaribio linafanywa kugawanya nambari na sifuri.

Wacha tuzingatie muundo wa kupata tofauti (makosa) ndani Oracle

wakati wengine basi- hupata makosa yote ambayo yanaweza kutokea ikiwa hayakupatikana hapo awali

kuweka serveroutput juu;

tangaza
Nambari kamili:= 1;
b INTEGER:= 0;
c CHAR(1) := "c";
kuanza
--Haitasababisha kosa
DBMS_OUTPUT.PUT_LINE(a / a);
--Itasababisha mgawanyiko kwa 0
--DBMS_OUTPUT.PUT_LINE(a / b);
--Itaongeza makosa mengine yote
--DBMS_OUTPUT.PUT_LINE(a / c);
ubaguzi
wakati zero_divide basi
DBMS_OUTPUT.PUT_LINE("zero_divide!");
wakati wengine basi
DBMS_OUTPUT.PUT_LINE("wakati wengine basi!");
mwisho;

Tulitafsiri ishara inayoelezea makosa: http://oracleplsql.ru/named-system-exceptions.html

/*
DUP_VAL_ON_INDEX Ulijaribu kuingiza au kusasisha sehemu ambayo thamani yake ingekiuka kikwazo cha kipekee cha sehemu hii.
TIMEOUT_ON_RESOURCE Hutolewa wakati muda wa kuisha unatokea wakati ORACLE inasubiri rasilimali.
TRANSACTION_BACKED_OUT Hurudisha sehemu iliyofutwa ya muamala.
INVALID_CURSOR Unajaribu kurejelea kishale ambacho bado hakipo. Hili linaweza kutokea kwa sababu unaleta kishale ambacho kilikuwa kimefungwa au hakijafunguliwa.
NOT_LOGGED_ON Unajaribu kupiga simu kwa Oracle bila kuunganishwa na Oracle.
LOGIN_DENIED Unajaribu kuingia kwenye Oracle ukitumia jina la mtumiaji/nenosiri lisilo sahihi.
NO_DATA_FOUND Ulijaribu mojawapo ya yafuatayo:
1. Umetekeleza SELECT INTO na hoja haikurejesha safu mlalo zozote.
2. Unarejelea safu mlalo ambayo haijaanzishwa kwenye jedwali.
3. Unasoma hadi mwisho wa faili ya kifurushi cha UTL_FILE.
TOO_MANY_ROWS Ulijaribu kutekeleza SELECT INTO na hoja ikarudisha zaidi ya safu mlalo moja.
ZERO_DIVIDE Ulijaribu kugawanya nambari kwa sufuri.
INVALID_NUMBER Unajaribu kutekeleza taarifa ya SQL inayojaribu kubadilisha mfuatano kuwa nambari.
STORAGE_ERROR Umemaliza kumbukumbu inayopatikana au kumbukumbu imeharibika.
PROGRAM_ERROR Huu ni ujumbe wa kawaida wa Usaidizi wa Mawasiliano wa Oracle uliotolewa kwa sababu hitilafu ya ndani imegunduliwa.
VALUE_ERROR Ulijaribu kufanya operesheni na kulikuwa na hitilafu katika kubadilisha, kupunguza, au kupunguza data ya nambari au herufi.
CURSOR_ALREADY_OPEN Ulijaribu kufungua kishale ambacho tayari kimefunguliwa.
*/

Hitilafu zinaweza kutokea wakati wa kutekeleza msimbo wa PL/SQL ambao utasababisha kizuizi cha PL/SQL kusitishwa. Hitilafu kama hizo hutupa kando, ambazo zinaweza kukamatwa na kushughulikiwa na kidhibiti cha kipekee.

Isipokuwa - Tofauti ya PL/SQL ambayo huinuliwa wakati wa utekelezaji wa block na kuacha kutekeleza vitendo katika mwili wa block. Ikiwa kizuizi chako cha PL/SQL kina sehemu ya ushughulikiaji wa vighairi, unaweza kufafanua vitendo ambavyo lazima vifanywe kwa ubaguzi fulani kabla ya kizuizi kusitishwa.

Isipokuwa huwekwa kiotomatiki na seva ya Oracle wakati hitilafu ya Oracle inapotokea (TOO_MANY_ROWS, NO_DATA_FOUND). Walakini, unaweza kufafanua ubaguzi wako mwenyewe katika sehemu ya kutangaza ya kizuizi cha PL/SQL na kisha uinue kwa uwazi katika sehemu inayoweza kutekelezwa ya kizuizi.

Ikiwa ubaguzi utatolewa katika sehemu inayoweza kutekelezwa ya kizuizi, udhibiti huhamishiwa kwenye sehemu ya ushughulikiaji wa vighairi (sehemu ya EXCEPTION). Ikiwa ubaguzi utashughulikiwa kwa ufanisi, kizuizi cha PL/SQL kitakamilika bila hitilafu. Ikiwa hakuna kidhibiti kwa ubaguzi huu, utekelezaji wa kizuizi cha PL/SQL utakoma isivyo kawaida.

Kuna aina tatu za ubaguzi:

Kukamata isipokuwa

Vighairi vya kukamata hufanywa katika sehemu ya utunzaji wa kipekee ya kizuizi cha PL/SQL.

ILA

LINI ubaguzi_1 [ AU ubaguzi_2 ...] BASI

waendeshaji ;

LINI ubaguzi_3 [ AU ubaguzi_4 ...] BASI

waendeshaji ;

ubaguzi- jina la ubaguzi ulioainishwa mapema au ubaguzi ulioelezewa katika sehemu ya tangazo

WAKATI WENGINE - inafafanua hatua za kushughulikia isipokuwa zote ambazo utunzaji haujabainishwa kwa uwazi

Sehemu ya utunzaji wa ubaguzi huanza na neno kuu la EXCEPTION. Sehemu ya kushughulikia vighairi inaweza kujumuisha vidhibiti vingi vya kutofuata kanuni, ambavyo kila kimoja kinatekeleza kundi lake la taarifa. Ikiwa ubaguzi utatolewa katika sehemu inayoweza kutekelezwa ya kizuizi cha PL/SQL, udhibiti huhamishiwa kwenye sehemu ya ushughulikiaji wa vighairi kwa kidhibiti ambacho kimeundwa kushughulikia hali hiyo mahususi. Baada ya kukamilisha vitendo vilivyoainishwa kwenye kidhibiti hiki, utekelezaji wa kizuizi huisha bila makosa.

Unaweza kufafanua hatua zinazopaswa kuchukuliwa ikiwa ubaguzi wowote utatolewa ambao kidhibiti hakijafafanuliwa kwa uwazi. Ili kufanya hivyo, tumia kifungu cha WAKATI WENGINE. Kunaweza kuwa na kifungu kimoja tu WHEN OTHERS na kuwekwa baada ya vidhibiti vingine vyote.

Kukamata Vighairi Vilivyoainishwa Awali vya Seva ya Oracle

Kukamata hitilafu zilizobainishwa awali za Oracle hufanywa kwa kurejelea jina la kawaida la kutofuata kanuni katika sehemu ya kushughulikia vighairi.

Jina la kipekee

Nambari ya hitilafu

Maelezo

CURSOR_ALREADY_OPEN

Kujaribu kufungua kishale ambacho tayari kimefunguliwa

DUP_VAL_ON_INDEX

Kujaribu kufanya operesheni isiyoidhinishwa kwenye kielekezi (kufunga kishale ambacho hakijafunguliwa)

Kujaribu kubadilisha thamani ya herufi kuwa nambari ya nambari katika taarifa ya SQL wakati thamani ya herufi sio kiwakilishi cha nambari.

Kujaribu kuunganisha kwenye hifadhidata na jina la mtumiaji lisilo sahihi na/au nenosiri

Taarifa ya SELECT INTO haikurejesha safu mlalo zozote

Kujaribu kupata hifadhidata bila kuunganishwa nayo

Hitilafu ya ndani ya PL/SQL

Hakuna kumbukumbu ya kutosha

SYS_INVALID_ROWID

Kujaribu kubadilisha thamani ya herufi kuwa ROWID wakati thamani ya herufi haiwakilishi uwakilishi halali wa herufi ya ROWID.

TIMEOUT_ON_RESOURCE

Muda wa nyenzo umekwisha

Taarifa ya SELECT INTO imerejesha zaidi ya safu mlalo moja

Hitilafu ya kuhesabu, ubadilishaji wa aina, ukiukaji wa vipimo

Jaribu kugawanya kwa sifuri

Hebu tuangalie mfano. Acha kuwe na faili ya batch isipokuwa.sql kuhesabu mshahara wa mfanyakazi aliye na nafasi maalum. Katika kesi hiyo, ni muhimu kutoa hali ya kushughulikia wakati hakuna wafanyakazi wenye nafasi hiyo au wafanyakazi kadhaa wana nafasi hiyo.

v_sal emp.sal%TYPE;

CHAGUA sal KUWA v_sal KUTOKA emp WHERE LOWER(kazi)=LOWER(:v_job);

DBMS_OUTPUT.put_line("Mshahara wa " || :v_job || " ni " || TO_CHAR(v_sal));

WAKATI HAKUNA_DATA_KUPATIKANA BASI

DBMS_OUTPUT.put_line(:v_job || " si jina la wafanyakazi");

ILIPO SAFU_NYINGI BASI

DBMS_OUTPUT.put_line(:v_job || " ni jina la wafanyakazi wengi");

WAKATI WENGINE BASI

DBMS_OUTPUT.put_line("Hitilafu nyingine imetokea");

Sasa hebu tuangalie chaguzi tofauti, tukipeana maadili tofauti kwa utofauti wa mwenyeji v_kazi.

SQL> VARIABLE v_job VARCHAR2(20)

SQL> EXECUTE:v_job:= "Rais"

SQL> @d:\users\isipokuwa

Mshahara wa Rais ni 5000

Utaratibu wa PL/SQL umekamilika.

SQL> EXECUTE:v_job:= "Karani"

Utaratibu wa PL/SQL umekamilika.

SQL> @d:\users\isipokuwa

Karani ni cheo cha wafanyakazi wengi

Utaratibu wa PL/SQL umekamilika.

SQL> EXECUTE:v_job:= "Mhandisi"

Utaratibu wa PL/SQL umekamilika.

SQL> @d:\users\isipokuwa

Mhandisi sio jina la wafanyikazi

Utaratibu wa PL/SQL umekamilika.

Kukamata Oracle Isiyobainishwa Vighairi

Iwapo ungependa kushughulikia hitilafu ya kawaida ya seva ya Oracle ambayo si hitilafu iliyofafanuliwa awali, lazima kwanza utangaze kutofuata kanuni katika sehemu ya tangazo, uihusishe na nambari ya kawaida ya hitilafu, na urejelee ubaguzi huo katika sehemu ya ushughulikiaji wa vighairi.