Dibisyon sa pamamagitan ng zero oracle exception handling. Mga tampok ng error handling ng Oracle database server. Mga Error na Dulot ng Foreign Key Constraints

Ph.D. Vladimir Likhachev, Kaluga Pedagogical University na pinangalanan kay K.E

Para sa mga program na gumagana sa mga database, mahalaga hindi lamang na iproseso nang tama ang kanilang mga error, ngunit din upang makabuo ng mga mensaheng nagbibigay-kaalaman tungkol sa mga error na ito. Ang pagkakaroon ng naturang mga mensahe ay nagbibigay-daan sa iyo upang mabilis na matukoy ang mga sanhi at iwasto ang mga error. Ito ay totoo lalo na kapag nagtatrabaho sa isang programa ng end-user, dahil sa karamihan ng mga kaso hindi niya alam hindi lamang ang istraktura ng isang tiyak na database, kundi pati na rin ang mga teoretikal na pundasyon ng mga relational na database.

Kakatwa, ang sitwasyon sa pagbuo ng mga mensahe ng error sa mga programa ay kadalasang ibang-iba sa mismong paghawak ng mga error. Kapag humahawak ng mga error, kadalasan ay posible na bumuo ng isang pangkalahatang diskarte, na ginagawang posible na i-localize ang kanilang paghawak sa isa o higit pang mga function. Ang isang katulad na diskarte para sa mga mensahe ng error ay maaaring ipatupad batay sa katotohanan na sa mensahe ng error, ang Oracle server ay nagpapahiwatig ng uri ng error at ang database object na sanhi nito. Ang ganitong mga bagay ay karaniwang mga hadlang, tulad ng pangunahin, natatangi at dayuhang mga susi, natatanging mga index, "hindi null" na mga hadlang, atbp. Mula sa mga talahanayan ng system at mga view ng database, ang detalyadong impormasyon tungkol sa mga hadlang na ito ay maaaring makuha at ang mga halaga ay maaaring matukoy na maaaring ang pagbabago ay nagresulta sa isang error. Ngunit ang problema ay ang pagpapatupad ng gayong mekanismo para sa pagbuo ng mga mensahe ng error sa mga tunay na aplikasyon ay nakakaranas ng ilang mga paghihirap:

  • Depende sa mensahe ng error sa layunin ng programa. Kahit na ang mga program na gumagana sa parehong database ay maaaring kailanganin na bumuo ng iba't ibang mga mensahe tungkol sa parehong error. Halimbawa, sa isang programa para sa pag-edit ng data ng user, ang mensahe ay dapat na: "Nakarehistro na ang isang produkto na may parehong pangalan! Ngunit ang programa sa pag-import ng data ay nangangailangan ng isang mensahe na may ganap na naiibang nilalaman: "Ang na-import na data ay nadoble - suriin ang petsa kung saan ang data ay ini-import!"
  • Kahirapan sa pagbuo ng mga mensahe para sa ilang mga error na dulot ng mga limitasyon sa database. Halimbawa, ang CHECK na mga hadlang sa mga talahanayan ay maaaring gumamit ng medyo kumplikadong mga query at kundisyon. Samakatuwid, ang pagbuo ng mga mensahe batay sa kanilang pagsusuri ay maaaring maging isang mahirap na gawain.
  • Paggamit ng mga custom na pangalan ng talahanayan at column sa mga client program na iba sa kanilang mga pangalan sa database. Halimbawa, ang talahanayan ay may pangalang "GOODS", at sa client application ang data mula sa talahanayang ito ay maaaring ipakita sa direktoryo bilang "Mga Produkto" o "Mga Produkto".

Ang kumbinasyon ng mga salik na ito ay karaniwang humahantong sa katotohanan na ang pagbuo ng mga mensahe kahit tungkol sa mga error ng parehong uri ay ipinapatupad nang paisa-isa para sa bawat transaksyon. Bilang resulta, ang code para sa pagbuo ng mga mensahe ng error ay ipinamamahagi sa buong application, na nagpapahirap sa pagpapanatili. Dahil sa pangangailangang magsulat ng code para sa halos lahat ng posibleng error, ang ilang mga error na alam ng developer ay napupunta nang walang kaukulang mga mensahe sa user. Bilang resulta, ang mga sapat na impormasyong mensahe para sa end user ay nabuo lamang para sa ilan sa mga error sa ibang mga kaso, siya ay dapat na kontento, sa pinakamahusay, mga mensahe mula sa database server mismo. Sa karamihan ng mga kaso, ang nilalaman ng impormasyon ng naturang mga mensahe para sa karaniwang gumagamit ay hindi sapat upang matukoy ang sanhi ng problema at maalis ito.

Ang pamamaraan na tinalakay sa artikulo para sa pagbuo ng mga mensahe ng error na nagbibigay-kaalaman para sa gumagamit ay medyo pangkalahatan at maaaring ipatupad pareho sa mga aplikasyon ng kliyente at sa bahagi ng server ng Oracle. Maaari itong magamit sa iba't ibang uri ng mga programa, tulad ng:

  • Mga program na gumagamit ng isang espesyal na interface upang ipasok at baguhin ang data ng database. Sa karamihan ng mga kaso, ang mga mensahe ng error na nagbibigay-kaalaman ay maaaring makuha sa pamamagitan ng pagsusuri sa istraktura ng database. Ipapaalam nito sa user ang tungkol sa kanilang layunin nang may kaunting pagsisikap sa bahagi ng mga developer at software.
  • Mga program na may kakayahan para sa user na bumuo ng mga arbitrary na query sa SQL. Ang pagbuo ng mga mensahe batay sa pagsusuri ng istraktura ng database ay maaaring maging partikular na may kaugnayan para sa mga programa na naglalayong sa isang malawak na hanay ng mga gumagamit, kabilang ang mga may mababang antas ng kaalaman sa lugar na ito. Gagawin nitong mas mauunawaan ng user ang mga mensahe ng error sa mga query sa SQL.
  • Mga platform ng paksa. Ang paggamit ng mga pamamaraan na inilarawan sa artikulo ay magbibigay-daan sa mismong platform ng paksa na makabuo ng mga mensaheng nagbibigay-kaalaman tungkol sa mga error sa database batay sa pagsusuri ng istraktura nito. Gagawin nitong posible na bawasan ang code sa wika ng platform na ginagamit upang pangasiwaan ang mga sitwasyon ng error. At ang mga error na nangangailangan ng mga espesyal na mensahe, ngunit lumabas na wala ang mga ito, ay magiging sapat na nagbibigay-kaalaman upang gawing mas madali ang pagtukoy sa kanilang dahilan.

Ang mga problema sa pagbuo ng mensahe na inilarawan sa itaas ay malulutas kung ang mga mensahe ng error ay nahahati sa dalawang grupo:

  • mga pangkalahatang mensahe na nabuo batay sa pagsusuri ng istraktura ng database;
  • mga espesyal na mensahe na isa-isang tinukoy para sa bawat error.

Ang pamamaraan para sa pagbuo ng mga mensahe ng error sa database na inilarawan sa artikulong ito ay maaaring ilapat sa maraming mga server ng relational database. Ang isang halimbawa ng paggamit nito para sa mga database ng server ng Firebird ay tinalakay sa artikulo. Kung ang client application ay binuo sa Object Pascal (Delphi, Kylix, Free Pascal), kung gayon ang mga kakayahan ng JEDI library ay maaaring maging kapaki-pakinabang upang matukoy ang mga sanhi ng hindi inaasahang mga error.

1. Mga generic na mensahe ng error na dulot ng mga limitasyon sa database

Tulad ng nabanggit sa itaas, ang pangunahing ideya ng paglikha ng mga unibersal na mensahe ay upang lumikha ng isang mensahe na sapat na nagbibigay kaalaman at naiintindihan para sa end user batay sa data mula sa mensahe ng error mula sa Oracle at tungkol sa istraktura ng database. Ipagpalagay natin na sa talahanayang "GOODS" (script 1.1) sinusubukan ng user na magdagdag ng produkto na may pamagat (column "TITLE") na nasa talahanayan na.

GUMAWA NG TABLE DEMO.GOODS (CODE INTEGER NOT NULL , TITLE VARCHAR2(50 byte) NOT NULL , PRICE NUMBER(16, 2) NOT NULL , CONSTRAINT CK_PRICE CHECK (PRICE > 0), CONSTRAINT PK_GOODS PRIMARY KEY (CODE)); COMMENT SA TABLE DEMO.GOODS ay "Mga Produkto"; COMMENT SA COLUMN DEMO.GOODS.CODE ay "Product code"; COMMENT SA COLUMN DEMO.GOODS.TITLE ay "Title"; COMMENT SA COLUMN DEMO.GOODS.PRICE ay "Price"; GUMAWA NG NATATANGING INDEX DEMO.IDX_GOODS_TITLE SA DEMO.GOODS (TITLE);

Iskrip 1.1. Paglikha ng talahanayan ng "GOODS".

Sa kasong ito, bubuo ang server ng error, dahil ang column na "TITLE", na nag-iimbak ng pangalan ng produkto, ay kasama sa natatanging index na "DEMO.IDX_GOODS_TITLE":

Sa halip na ang mensaheng ito para sa user, halimbawa, isa sa mga mensahe ay maaaring mabuo:

  • Ang halaga ng field na "Pangalan" sa talahanayan ng "Mga Produkto" ay dapat na natatangi!
  • Ang isang produkto na may ganitong pangalan ay nairehistro na! Suriin ang pangalan ng produkto!
  • Ang direktoryo ng produkto ay hindi maaaring maglaman ng mga produkto na may parehong mga pangalan!

Bagama't magkakaiba ang mga mensaheng ito, naglalaman ang lahat ng ito ng impormasyon tungkol sa bagay kung saan nilalabag ang limitasyon sa pagiging natatangi - ito ang field na "Pangalan" ng talahanayang "Mga Produkto".

Ang isa sa mga problema sa pagbuo ng ganitong uri ng mensahe ay ang mga user name ng mga field at table ay naiiba sa mga pangalan ng mga table at column sa database. Upang maunawaan ng user ang mensahe ng error, dapat itong gumamit ng mga custom na pangalan. Maaaring gumamit ng hiwalay na talahanayan o mga komento para sa mga talahanayan at column upang itugma ang mga pangalan ng talahanayan at field at ang kanilang mga custom na pangalan. Ang huling opsyon ay maaaring ituring na mas kanais-nais, dahil pinapayagan ka nitong sabay na idokumento ang database. Kaya naman sa script 1.1, ang kanilang mga custom na pangalan ay ibinibigay bilang mga komento para sa talahanayan at mga column nito. Kung ihahambing mo ang mga mensahe at komento sa itaas para sa talahanayan at mga column, mapapansin mo na ang pagbuo ng unang mensahe ay ang pinakasimpleng opsyon. Upang mabuo ang iba pang dalawang mensahe, maaaring kailanganin ang lexical synthesis, ngunit ito ay isang hiwalay na gawain. Nais kong iguhit ang iyong pansin sa katotohanan na sa ibang pagkakataon sa artikulo ay isa lamang sa mga posibleng pagpipilian sa mensahe para sa bawat kaso ng error ang ibinigay. Sa pagsasagawa, ang pagpili ng istilo ng mensahe at nilalaman ay maaaring nakadepende sa ilang salik at matutukoy ng taga-disenyo ng system.

Syempre, hindi natin mabubukod ang isang sitwasyon kung saan walang mga komento para sa isang talahanayan o column na dapat isama sa mensahe. Sa sitwasyong ito, maaaring direktang ipakita ng mensahe ng error ang pangalan ng talahanayan o column.

2. Ang halaga ng isang kinakailangang field ay hindi tinukoy (NOT NULL constraint)

Ang error na ito ay nabuo ng server sa ilang mga kaso:

  • ang "not null" na hadlang na itinakda sa column ay nilabag;
  • Ang halaga ng isang column na bahagi ng isang natatanging index, master, o natatanging key ay hindi tinukoy.

Sa lahat ng mga kasong ito ang server ay bumubuo ng isang error:

Upang makakuha ng paglalarawan ng talahanayan at column mula sa isang mensahe ng error, maaari mong gamitin ang Query 2.1.

piliin ang tc.comments bilang table_comment, cc.comments bilang column_comment mula sa all_tab_columns c, all_tab_comments tc, all_col_comments cc where c.owner = :owner and c.table_name = :table_name at c.column_name = :column_name at tc.owner = c.owner and tc.table_name = c.table_name at cc.owner = c.may-ari at cc.table_name = c.table_name at cc.column_name = c.column_name

Kahilingan 2.1. Pagkuha ng mga paglalarawan ng talahanayan at hanay

Bilang mga parameter ng query na "may-ari", "table_name", "column_name" dapat mong tukuyin ang pangalan ng schema, talahanayan at column mula sa mensahe ng error, ayon sa pagkakabanggit. Ang query ay nagbabalik ng mga komento para sa talahanayan at column.

Gamit ang mga resulta ng kahilingang ito, maaaring makabuo ng mensahe ng error, halimbawa, kasama ang sumusunod na nilalaman:

Dapat mong tukuyin ang halaga ng hanay "<Описание поля>"sa mesa"<Описание таблицы>"sa<добавлении новой/изменении>mga tala.

3. Nilabag ang pagiging natatangi ng halaga ng isang field o hanay ng mga column

Ang pangangailangang maglagay ng natatanging halaga ng column ay maaaring kailanganin pangunahin sa tatlong kaso:

  • ang hanay ay kasama sa master key;
  • ang column ay kasama sa isang natatanging key;
  • ang column ay kasama sa isang natatanging index.

Sa lahat ng tatlong kaso, ang Oracle Database ay bumubuo ng parehong error:
ORA-00001: nilabag ang natatanging hadlang (<Схема>.<Ограничение>)

Tinutukoy ng mensahe ng error ang hadlang na naging sanhi ng error. Upang makakuha ng impormasyon tungkol sa mga column na kasama sa pangunahing o natatanging mga key, maaari mong gamitin ang query 3.1, upang makakuha ng impormasyon tungkol sa index - query 3.2.

piliin ang dcs.constraint_type, cc.table_name, tc.comments bilang table_comment, cc.column_name, ccom.comments bilang column_comment mula sa all_cons_columns cc join all_tab_comments tc on (tc.owner = cc.owner and tc.table_name = cc.table_name) join all_col_comments ccom on (ccom.owner = cc.owner and ccom.table_name = cc.table_name at ccom.column_name = cc.table_name at ccom.column_name column_name) sumali sa all_constraints dcs sa (dcs.constraint_name = cc.constraint_name) kung saan cc.owner = :owner at cc.constraint_name = :key_name
Kahilingan 3.1. Pagkuha ng impormasyon tungkol sa mga column ng talahanayan na kasama sa pangunahing o natatanging mga key.
piliin ang ic.table_name, tc.comments bilang table_comment, ic.column_name, ccom.comments bilang column_comment mula sa all_ind_columns ic join all_tab_comments tc on (tc.owner = ic.table_owner and tc.table_name = ic.table_name) join all_col_comments ccom on (ccom.owner = ic.table_owner and ccom.table_name = ic.table_name at ccom.column column_name) kung saan table_owner = :owner at index_name = :index_name
Kahilingan 3.2. Pagkuha ng impormasyon tungkol sa mga column ng talahanayan na kasama sa index.

Bilang mga parameter, ipinapasa ang mga query sa schema name ("may-ari"), key name ("key_name") o index name ("index_name"). Ang mga query ay nagbabalik ng mga pangalan at komento para sa mga talahanayan at column na kasama sa hadlang. Ibinabalik din ng Query 3.1 ang uri ng pagpilit ("constraint_type"): "P" ang pangunahing susi, "U" ang natatanging susi. Ang bilang ng mga tala na ibinalik ng mga query ay tumutugma sa bilang ng mga column sa natatanging hadlang.

Batay sa impormasyong natanggap tungkol sa paghihigpit sa pagiging natatangi, ang mga variant ng mga mensahe ng error ay maaaring mabuo para sa user, halimbawa, ang mga ibinigay sa Seksyon 1.

4. Mga Error na Dulot ng Foreign Key Constraints

Kapag nagsasagawa ng mga operasyon sa tabular na data na naka-link ng mga dayuhang key, mayroong ilang dahilan na humahantong sa mga error:

1. Ang isang tala ay idinagdag sa subordinate na talahanayan kung saan ang column na kasama sa foreign key ay walang katumbas na halaga sa pangunahing talahanayan. Ang isang katulad na sitwasyon ay nangyayari kapag binabago ang halaga ng isang column ng isang subordinate na talahanayan kung ang bagong halaga ng column ay wala sa pangunahing talahanayan. Ang Oracle Database ay bumubuo ng isang error sa kasong ito:

  1. Sinusubukan ng master table na baguhin ang value ng isang column na nire-reference sa child table. Para sa kasong ito, ang Oracle Database ay bumubuo ng isang error:
  1. Sinusubukan ng master table na tanggalin ang data na isinangguni sa slave table. Kung ang kahulugan ng isang relasyon sa pagitan ng mga talahanayan ay tumutukoy ng isang hadlang na "WALANG PAGKILOS" para sa isang operasyon sa pagtanggal ng data, hindi pinapayagan ng Oracle na tanggalin ang data mula sa pangunahing talahanayan kung ang talahanayan ng bata ay may mga talaan na nauugnay sa rekord na tinatanggal. Para sa sitwasyong ito, ang Oracle Database ay bumubuo ng isang error na katulad ng nakaraang kaso.

Upang makakuha ng impormasyon tungkol sa mga column ng main at subordinate table na kasama sa foreign key, maaari mong gamitin ang sumusunod na query 4.1.

piliin ang a.constraint_name, a.table_name, tc1.comments bilang table_comment, a2.column_name, cc1.comments bilang column_comment, b.owner bilang r_owner, b.table_name bilang r_table_name, tc2.comments bilang r_table_comment, b2.column_name bilang r,_column_name .comments bilang r_column_comment mula sa all_constraints a, all_constraints b, all_cons_columns a2, all_cons_columns b2, all_tab_comments tc1, all_col_comments cc1, all_tab_comments tc2, all_col_comments cc2 kung saan a.owner = :owner and a.constraint_type and sa ("P","U") at b.constraint_name = a.r_constraint_name at b.owner = a.r_owner and a2.constraint_name = a.constraint_name at a2.table_name = a.table_name at a2.owner = a.owner and b2.constraint_name = b.constraint_name at b2.table_name = b.table_name at b2.owner = b.owner and b2.position = a2.position and tc1.owner = a.owner and tc1.table_name = a.table_name at cc1. may-ari = a2.may-ari at cc1.table_name = a2.table_name at cc1.column_name = a2.column_name at tc2.owner = b.may-ari at tc2.table_name = b.table_name at cc2.owner = b2.may-ari at cc2.table_name = b2.table_name at cc2.column_name = b2.column_name
Kahilingan 4.1. Pagkuha ng impormasyon tungkol sa isang foreign key.

Ang kahilingan ay may dalawang parameter: "may-ari" at "foreign_key" - ang scheme at foreign key kung saan kailangan mong makakuha ng impormasyon. Nagbabalik ito ng impormasyon tungkol sa mga column na kasama sa foreign key: "table_name", "table_comment" - ang pangalan at paglalarawan ng subordinate table; "column_name", "column_comment" - pangalan at paglalarawan ng column ng subordinate table. Ang mga column ng query na may prefix na "r_" ay nagbabalik ng impormasyon tungkol sa pangunahing talahanayan. Ang bilang ng mga record na ibinalik ng query ay tumutugma sa bilang ng mga column na kasama sa foreign key.

Batay sa impormasyong ito, maaaring mabuo ang mga foreign key na mensahe ng error para sa user.

5. Mga espesyal na mensahe ng error na dulot ng mga limitasyon sa database

Ang pangangailangang gumamit ng mga espesyal na mensahe ay maaaring lumitaw kung ang isang unibersal na mensahe ng error sa ilang kadahilanan ay hindi magagamit o hindi mabuo. Ang isang halimbawa ng huling kaso ay ang CHECK constraints sa mga talahanayan. Ang mga hadlang ay maaaring may kasamang mga query at kundisyon na maaaring medyo mahirap i-parse. Samakatuwid, para sa mga hadlang na ito ay madalas na mas maginhawang gumamit ng mga mensahe na tinukoy sa oras ng disenyo.

Dalawang grupo ng mga espesyal na mensahe ng error ay maaaring makilala. Ang unang uri ng mga espesyal na mensahe ay inilaan para sa paggamit sa lahat ng mga application na gumagana sa isang karaniwang database. Ang mga ito ay maaaring maluwag na tinatawag na "mga mensahe ng error na partikular sa antas ng database." Ang pangalawang pangkat ng mga mensahe ay partikular sa isang partikular na aplikasyon. Maaaring kailanganin ang mga ito kapag kailangan ng iba't ibang application na magpakita ng iba't ibang mensahe sa user tungkol sa parehong error. Maaari silang maluwag na tinatawag na "mga espesyal na mensahe ng error sa antas ng application." Maginhawang mag-imbak ng impormasyon tungkol sa unang pangkat ng mga mensahe sa database mismo at gumamit ng isang hiwalay na talahanayan para dito. Ang mga mensaheng partikular sa isang programa ay maaaring maimbak sa mga mapagkukunan nito, halimbawa, sa anyo ng isang hiwalay na file o sa isang database din. Maaaring gawin ang pagkilala sa mga espesyal na mensahe batay sa error code, pangalan ng schema, at isa o higit pang mga keyword mula sa mensahe ng error.

6. Error Messages para sa CHECK Constraints sa Tables

Kapag may naganap na error dahil sa isang CHECK constraint sa isang table, ang server ay bumubuo ng isang error:
ORA-02290: CHECK integrity constraint nilabag (<Схема>.<Имя ограничения>)

Tulad ng nabanggit sa itaas, madalas na maginhawang gumamit ng mga espesyal na mensahe para sa mga naturang error. Halimbawa, ang limitasyon ng "CK_PRICE" ng talahanayang "GOODS" ay maaaring gumamit ng isang espesyal na mensahe na nakaimbak sa talahanayan ng espesyal na mensahe:

7. Pinagsamang paggamit ng mga espesyal at generic na mensahe ng error

Ang flexible na mekanismo para sa pagbuo ng mga mensahe ng error na nagbibigay-kaalaman para sa user ay ipinatupad sa ilang yugto (Larawan 1):

1. Magpakita ng espesyal na mensahe ng error sa antas ng aplikasyon. Ang programa ay unang naghahanap ng isang mensahe ng error sa mga mensaheng tukoy sa application. Kung ang naturang mensahe ay natagpuan, ito ay ipapakita at ang pagbuo ng mensahe ay nakumpleto.

2. Mag-output ng isang espesyal na mensahe tungkol sa isang error sa antas ng database. Kung walang nakitang mensahe sa hakbang 1, isang paghahanap ang isinasagawa para sa isang partikular na mensahe ng error sa antas ng database. Kung natagpuan, ito ay ipinapakita sa gumagamit at ang henerasyon ng mensahe ng error ay nagtatapos dito.

3. Paglalabas ng mensahe batay sa pagsusuri ng istruktura ng database (unibersal na mensahe). Kung walang mga espesyal na mensahe ang nakita sa mga nakaraang yugto, ito ay nabuo batay sa isang pagsusuri ng istraktura ng database. Ito ay ipinapakita sa gumagamit at ang pagbuo ng mensahe ay nakumpleto.

4. Mag-output ng mensahe mula sa database server. Kung ang isang mensahe para sa user ay hindi nabuo sa tatlong nakaraang mga yugto, isang mensahe ng error mula sa Oracle ay ipinapakita. Ang sitwasyong ito ay maaaring lumitaw sa maraming kadahilanan. Halimbawa, kapag may nangyaring custom na error na sadyang nabuo sa isang naka-imbak na pamamaraan o trigger gamit ang RAISE_APPLICATION_ERROR function, at ang nilalaman ng mensahe tungkol sa kung saan ay hindi kailangang baguhin.

Posible ang mas kumplikadong mga kaso kaysa sa ibinigay sa artikulong ito. Halimbawa, kung ang isang mensahe ay nabuo sa isang naka-imbak na pamamaraan, na maaaring tawagan mula sa isang trigger o iba pang naka-imbak na pamamaraan. Sa kasong ito, maaaring kailanganin mo rin ang impormasyon tungkol sa kung paano tinawag ang pamamaraan na nakabuo ng mensahe ng error. At samakatuwid ang orihinal na mensahe ay maaaring dagdagan o baguhin, halimbawa, batay sa impormasyon tungkol sa stack ng tawag ng mga nakaimbak na pamamaraan at pag-trigger.

Sa ilang mga kaso, ang mga naturang mensahe ay maaaring maging mas nakapagtuturo kaysa sa mga nabuo sa mga nakaraang yugto. Halimbawa, sa halip na CK_PRICE constraint para sa DEMO.GOODS table (script 1.1), maaari mong isagawa ang kinakailangang pagsusuri sa isang trigger bago magpasok at mag-update ng record at bumuo ng mensahe para sa user sa isang “ready” na form:

Kung ang presyo ng produkto ay mas mababa sa o katumbas ng zero, bubuo ng error ang server, halimbawa:

Ang application ng kliyente ay maaaring agad na ipasa ang mensaheng ito sa gumagamit nang walang pagbabago.

Ang isa pang dahilan ay maaaring ang paglitaw ng isang error kung saan hindi ibinigay ang pagbuo ng mensahe.

kanin. 1. Pagkakasunod-sunod ng pagbuo ng mensahe ng error sa database.

Gusto kong ituro na kahit na ang application ay gumagamit lamang ng mga espesyal na mensahe ng error, ang paggamit ng isang pangkalahatang function para sa pagbuo ng mga mensahe ay mapapabuti ang istraktura ng programa. Kung kinakailangan, ang format ng mga espesyal na mensahe ay maaaring suportahan ang mga link sa sistema ng tulong, mga larawan, atbp. Ang inilarawang paraan ng pagbuo ng mga mensahe ng error sa database ay higit na nakatuon sa pagpapatupad sa isang application ng kliyente. Kasabay nito, maaari itong magamit sa panig ng server sa mga naka-imbak na pamamaraan, mga trigger ng talahanayan, gayundin sa mga trigger ng system para sa kaganapan ng SERVERERROR ng isang database o schema.

Konklusyon

Ang layunin ng artikulong ito ay ipakita ang mga pangunahing ideya ng isang paraan na maaaring magamit upang makabuo ng impormasyon ng mga mensahe ng error sa database ng Oracle para sa end user. Kahit na ang ilang mga aspeto ng pagpapatupad ay naiwan sa labas ng saklaw ng artikulo, nais kong umaasa na ang diskarte na inilarawan sa artikulo ay magbabawas ng mga gastos sa paggawa sa pagbuo ng software at madaragdagan ang pagiging maaasahan at kalidad nito.

Kapag nangyari ang mga pagbubukod, mahalagang magbigay ng mga mensahe ng error na madaling gamitin. Nabanggit na ang mga pagbubukod sa seksyon sa mga pangunahing bloke ng PL/SQL. Ngayon ay oras na upang tingnan ang mga ito nang mas detalyado.

Mga pagbubukod

Ang isang pagbubukod ay isang kundisyon ng error na itinaas - o nasasabik - kapag may problema. Mayroong maraming iba't ibang mga pagbubukod, ang bawat isa ay nauugnay sa isang partikular na uri ng problema. Kapag may nangyaring exception, hihinto ang pagpapatupad ng code sa statement na nagtaas ng exception, at inililipat ang kontrol sa bahagi ng block na humahawak sa exception. Kung ang block ay hindi naglalaman ng isang executable na seksyon, PL/SQL ay sumusubok na maghanap ng isang executable na seksyon sa kasama ang batayang yunit (kalakip ang pangunahing bloke), i.e. sa isang bloke na panlabas sa code na nagtaas ng exception. Kung walang tagapangasiwa para sa isang partikular na pagbubukod sa agarang nakapaloob na bloke, pagkatapos ay ang paghahanap ay magpapatuloy sa mga bloke ng kasunod na mga antas hanggang sa matagpuan ang isang angkop na tagapangasiwa, at kung hindi ito matagpuan, ang pagpapatupad ng programa ay tatapusin sa isang hindi nahawakang mensahe ng error.

Ang exception handling na bahagi ng block ay isang mainam na lugar para mag-isyu ng mga mensahe ng error na nagbibigay-kaalaman at magsagawa paglilinis (paglilinis), na nagbibigay-daan sa iyong alisin ang anumang bagay na maaaring magdulot ng kalituhan o problema sa ibang pagkakataon. Kung ang isang exception ay itinapon sa panahon ng isang pamamaraan na nagpasok ng isang row sa isang talahanayan, ang karaniwang pamamaraan ng paglilinis ay maaaring magsama ng isang ROLLBACK na pahayag.

Kapag nailipat na ang kontrol sa isang exception handler, hindi na ito ibabalik sa statement na naging sanhi ng exception. Sa halip, inililipat ang kontrol sa nakapaloob na pangunahing block statement na kaagad na sumusunod sa nested block o procedure/function call.

System Exceptions

Pamilyar ka na sa ZERO_DIVIDE exception, na paunang natukoy sa PL/SQL. Mayroong ilang iba pang mga pagbubukod sa system na kinikilala at pinalaki ng PL/SQL o Oracle. Ang talahanayan 1 ay nagbibigay ng mas kumpletong listahan ng mga pagbubukod ng system.

Maaaring magbigay ang PL/SQL ng impormasyon ng error sa mga user sa dalawang paraan. Ang unang paraan ay ang paggamit ng SQLCODE command, na nagbabalik ng error code. Ang code na ito ay isang negatibong numero, kadalasang katumbas ng numero ng error sa ORA na naka-print kapag natapos ang application kung ang pagbubukod ay mananatiling hindi mahawakan. Ang pangalawang paraan ay ang pagbabalik ng text message na naglalarawan sa error. Hindi nakakagulat, ang kaukulang utos ay tinatawag na SQLERRM. Maaari mong gamitin ang alinman sa SQLCODE o SQLERRM sa iyong exception handler. Tandaan: Hindi lahat ng system exception ay may mga pangalan.

mesa1 . System Exceptions

System exceptionerror code

Dahilan ng pananabik

CURSOR_ MERON NA_ BUKAS

ORA-06511

Sinusubukang buksan ang nakabukas na cursor

DUP_VAL_ON_INDEX

ORA-00001

Sinusubukang magpasok ng isang duplicate na halaga sa isang column na may natatanging index at samakatuwid ay isang natatanging hadlang

INVALID_ CURSOR

ORA-01001

Sinusubukang kunin ang isang cursor na hindi nabuksan o sinusubukang isara ang isang cursor na hindi nabuksan

NO_DATA_FOUND

ORA-01403

Sinusubukang gawin ang SELECT INTO kapag nagbalik ang SELECT ng mga zero na row (at iba pang mga dahilan na lampas sa saklaw ng aklat na ito)

PROGRAMA_ ERROR

ORA-06501

Panloob na error. Karaniwang nangangahulugan na kailangan mong makipag-ugnayan sa Oracle Support

Imbakan_ ERROR

ORA-06500

Ang programa ay nauubusan ng memorya ng system

TIMEOUT_ON_RESOURCE

ORA-00051

Ang programa ay naghintay ng masyadong mahaba para sa ilang mapagkukunan na maging available

TOO_MANY_ROWS

ORA-01422

SELECT INTO sa PL/SQL ay nagbalik ng higit sa isang row

VALUE_ ERROR

ORA-06502

Nakatagpo ang PL/SOL ng maling conversion o truncation ng data, o maling hadlang sa data

ZERO_ PAGHAHATI

ORA-01476

Subukang hatiin sa zero

Lahat ng iba pang mga pagbubukod at panloob na mga error na hindi saklaw ng mga pagbubukod na tinukoy sa pangunahing bloke. Ginagamit sa mga kaso kung saan hindi mo alam nang eksakto kung ano ang pinangalanang exception na hahawakan at gustong pangasiwaan ang anumang mga exception na itinapon

Ngayon bumalik tayo sa pinakaunang halimbawa ng kabanatang ito at gamitin ang SQLCODE at SQLERRM dito. Nasa ibaba ang source code ng halimbawa at ang mga resulta ng paglulunsad nito (Fig. 1).

Num_a NUMBER:= 6;

Num_b NUMBER;

Num_b:= 0;

Num_a:= Num_a / Num_b;

Num_b:= 7;

dbms_output.put_line(" Halaga ng Num_b "|| Num_b);

EXCEPTION

KAPAG ZERO_DIVIDE NOON

err_num NUMBER:= SQLCODE;

err_msg VARCHAR2(512) := SQLERRM;

dbms_output.put_line("ORA Error Number " || err_num);

dbms_output.put_line("ORA Error message " || err_msg);

dbms_output.put_line("Halaga ng Num_a " || Num_a);

dbms_output.put_line("Halaga ng Num_b " || Num_b);

SQL> itakda ang serveroutput sa

SQL>DECLARE

2 num_a NUMBER:= 6;

3 num_b NUMBER;

4 MAGSIMULA

5 num_b:= 0;

6 num_a:= num_a / num_b;

7 num_b:= 7;

8 dbms_output.put_line(" Halaga ng num_b "|| num_b);

9 EXCEPTION

10 KAPAG ZERO_DIVIDE

11 NOON

13 err_num NUMBER:= SQLCODE;

14 err_msg VARCHAR2(512) := SQLERRM;

15 MAGSIMULA

16 dbms_output.put_line("ORA Error Number "|| err_num);

17 dbms_output.put_line("ORA Error message " || err_msg);

18 dbms_output.put_line("Halaga ng num_a " || num_a);

19 dbms_output.put_line("Halaga ng num_b " || num_b);

20 WAKAS;

21 WAKAS;

ORA Error Number -1476

ORA Error Message ORA-01476: ang divisor ay katumbas ng zero

Halaga ng num_a 6

Halaga ng num_b 0

Matagumpay na nakumpleto ang pamamaraan ng PL/SQL.

kanin. 1. Paggamit ng SQLCODE at SQLERRM kapag humahawak ng mga pagbubukod sa system

Sa kabanatang ito, tatalakayin natin ang Mga Pagbubukod sa PL/SQL. Ang pagbubukod ay isang kundisyon ng error sa panahon ng pagpapatupad ng programa. Sinusuportahan ng PL/SQL ang mga programmer upang mahuli ang mga ganitong kundisyon gamit EXCEPTION harangan sa programa at isang naaangkop na aksyon ang gagawin laban sa kundisyon ng error. Mayroong dalawang uri ng mga pagbubukod −

  • Mga pagbubukod na tinukoy ng system
  • Mga pagbubukod na tinukoy ng user

Syntax para sa Exception Handling

Ang pangkalahatang syntax para sa paghawak ng exception ay ang mga sumusunod. Dito maaari mong ilista ang maraming mga pagbubukod na maaari mong pangasiwaan. Ang default na exception ay hahawakan gamit KAPAG ang iba NOON

MAGDEKLARA MAGSIMULA EXCEPTION WHEN exception1 THEN exception1-handling-statements WHEN exception2 THEN exception2-handling-statements KAPAG exception3 THEN exception3-handling-statements ........ KAPAG ang iba TAPOS ang exception3-handling-statements;

Halimbawa

Sumulat tayo ng isang code upang ilarawan ang konsepto. Gagamitin namin ang CUSTOMERS table na aming ginawa at ginamit sa mga nakaraang kabanata −

IDEKLARA ang c_id customers.id%type:= 8;

c_name customerS.Name%type;

Ang programa sa itaas ay nagpapakita ng pangalan at address ng isang customer na ang ID ay ibinigay. Dahil walang customer na may ID value 8 sa aming database, itinataas ng program ang run-time exception NO_DATA_FOUND, na nakunan sa EXCEPTION block.

Pagtaas ng mga Exception

Awtomatikong itinataas ng database server ang mga eksepsiyon sa tuwing mayroong anumang panloob na error sa database, ngunit ang mga eksepsiyon ay maaaring tahasang itaas ng programmer sa pamamagitan ng paggamit ng command. ITAAS. Ang sumusunod ay ang simpleng syntax para sa pagtataas ng exception −

IDEKLARA ang exception_name EXCEPTION; MAGSIMULA KUNG kundisyon SAKA ITAAS ANG exception_name;

ENDIF; EXCEPTION WHEN exception_name THEN statement; WAKAS;

Maaari mong gamitin ang syntax sa itaas sa pagtaas ng pamantayang pagbubukod ng Oracle o anumang pagbubukod na tinukoy ng gumagamit. Sa susunod na seksyon, bibigyan ka namin ng isang halimbawa sa pagpapataas ng exception na tinukoy ng user. Maaari mong itaas ang mga karaniwang exception ng Oracle sa katulad na paraan.

Mga Exception na tinukoy ng user Binibigyang-daan ka ng PL/SQL na tukuyin ang iyong sariling mga eksepsiyon ayon sa pangangailangan ng iyong programa. Ang isang eksepsiyon na tinukoy ng gumagamit ay dapat ideklara at pagkatapos ay tahasang itaas, gamit ang alinman sa isang pahayag ng RAISE o ang pamamaraan.

DBMS_STANDARD.RAISE_APPLICATION_ERROR

Ang syntax para sa pagdedeklara ng exception ay −

Halimbawa

IDEKLARA ang my-exception EXCEPTION; Ang sumusunod na halimbawa ay naglalarawan ng konsepto. Ang program na ito ay humihingi ng isang customer ID, kapag ang user ay nagpasok ng isang di-wastong ID, ang pagbubukod invalid_id

ay nakataas.<= 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; /

IDEKLARA ang c_id customers.id%type:= &cc_id;

c_name customerS.Name%type;

c_addr customers.address%type;

-- tinukoy ng user ang exception ex_invalid_id EXCEPTION; MAGSIMULA KUNG c_id

Kapag ang code sa itaas ay naisakatuparan sa SQL prompt, ito ay gumagawa ng sumusunod na resulta − Maglagay ng value para sa cc_id: -6 (magpasok tayo ng value -6) old 2: c_id customers.id%type:= &cc_id; new 2: c_id customers.id%type:= -6; ID ay dapat na mas malaki kaysa sa zero !Matagumpay na nakumpleto ang pamamaraan ng PL/SQL. Mga Paunang Natukoy na Pagbubukod Nagbibigay ang PL/SQL ng maraming paunang natukoy na mga pagbubukod, na isinasagawa kapag ang anumang panuntunan sa database ay nilabag ng isang programa. Halimbawa, ang paunang natukoy na pagbubukod na NO_DATA_FOUND ay itataas kapag ang isang SELECT INTO na pahayag ay hindi nagbabalik ng mga row. Ang sumusunod na talahanayan ay naglilista ng ilan sa mahahalagang paunang natukoy na mga pagbubukod −
Exception 06530 -6530 Error sa Oracle
SQLCODE 06592 -6592 Paglalarawan
ACCESS_INTO_NULL 06531 -6531 Itinataas ito kapag sinubukan ng isang programa na maglapat ng mga paraan ng pagkolekta maliban sa EXISTS sa isang hindi inisyal na nested table o varray, o sinubukan ng program na magtalaga ng mga value sa mga elemento ng isang uninitialized nested table o varray.
DUP_VAL_ON_INDEX 00001 -1 Itinataas ito kapag ang mga duplicate na halaga ay tinangka na maimbak sa isang column na may natatanging index.
INVALID_CURSOR 01001 -1001 Itinataas ito kapag ginawa ang mga pagtatangka na gumawa ng operasyon ng cursor na hindi pinapayagan, tulad ng pagsasara ng hindi nabuksang cursor.
INVALID_NUMBER 01722 -1722 Itinataas ito kapag nabigo ang conversion ng string ng character sa isang numero dahil hindi kumakatawan ang string ng wastong numero.
LOGIN_DENIED 01017 -1017 Itinataas ito kapag sinubukan ng isang programa na mag-log on sa database gamit ang isang hindi wastong username o password.
NO_DATA_FOUND 01403 +100 Ito ay itataas kapag ang isang SELECT INTO statement ay hindi nagbabalik ng mga row.
NOT_LOGGED_ON 01012 -1012 Ito ay itataas kapag ang isang database na tawag ay ibinigay nang hindi nakakonekta sa database.
PROGRAM_ERROR 06501 -6501 Itinataas ito kapag may internal na problema ang PL/SQL.
ROWTYPE_MISMATCH 06504 -6504 Itinataas ito kapag ang isang cursor ay kumukuha ng halaga sa isang variable na may hindi tugmang uri ng data.
SELF_IS_NULL 30625 -30625 Ito ay itataas kapag ang isang paraan ng miyembro ay tinawag, ngunit ang halimbawa ng uri ng bagay ay hindi nasimulan.
STORAGE_ERROR 06500 -6500 Itinataas ito kapag naubusan ng memory ang PL/SQL o nasira ang memorya.
TOO_MANY_ROWS 01422 -1422 Itinataas ito kapag ang isang SELECT INTO na pahayag ay nagbabalik ng higit sa isang row.
VALUE_ERROR 06502 -6502 Itinataas ito kapag nagkaroon ng error sa aritmetika, conversion, truncation, o sizeconstraint.
ZERO_DIVIDE 01476 1476 Itinataas ito kapag sinubukang hatiin ang isang numero sa zero.

Isaalang-alang natin ang isang disenyo para sa pagkuha ng mga pagbubukod (mga error) sa Oracle

kapag ang iba noon- nahuhuli ang lahat ng mga error na maaaring mangyari kung hindi nahuli bago

itakda ang serveroutput sa;

ipahayag
isang INTEGER:= 1;
b INTEGER:= 0;
c CHAR(1) := "c";
magsimula
--Hindi magdudulot ng error
DBMS_OUTPUT.PUT_LINE(a / a);
--Magdudulot ng paghahati ng 0
--DBMS_OUTPUT.PUT_LINE(a / b);
--Itataas ang lahat ng iba pang mga error
--DBMS_OUTPUT.PUT_LINE(a / c);
pagbubukod
kapag zero_divide pagkatapos
DBMS_OUTPUT.PUT_LINE("zero_divide!");
kapag ang iba noon
DBMS_OUTPUT.PUT_LINE("kapag ang iba pa!");
wakas;

Nagsalin kami ng sign na naglalarawan sa mga error: http://oracleplsql.ru/named-system-exceptions.html

/*
DUP_VAL_ON_INDEX Sinubukan mong ipasok o i-update ang isang field na ang halaga ay lalabag sa uniqueness constraint ng field.
TIMEOUT_ON_RESOURCE Itinaas kapag nagkaroon ng timeout habang naghihintay ang ORACLE ng resource.
TRANSACTION_BACKED_OUT Ibinabalik ang tinanggal na bahagi ng isang transaksyon.
INVALID_CURSOR Sinusubukan mong sumangguni sa isang cursor na hindi pa umiiral. Maaaring mangyari ito dahil kumukuha ka ng cursor na sarado o hindi nakabukas.
NOT_LOGGED_ON Sinusubukan mong tumawag sa Oracle nang hindi nakakonekta sa Oracle.
LOGIN_DENIED Sinusubukan mong mag-log in sa Oracle gamit ang maling username/password.
NO_DATA_FOUND Sinubukan mo ang isa sa mga sumusunod:
1. Isinagawa mo ang SELECT INTO at ang query ay hindi nagbalik ng anumang mga row.
2. Tinutukoy mo ang isang hindi nasimulang hilera sa talahanayan.
3. Nagbabasa ka sa dulo ng UTL_FILE package file.
TOO_MANY_ROWS Sinubukan mong magsagawa ng SELECT INTO at nagbalik ang query ng higit sa isang row.
ZERO_DIVIDE Sinubukan mong hatiin ang isang numero sa zero.
INVALID_NUMBER Sinusubukan mong magsagawa ng SQL statement na sumusubok na i-convert ang isang string sa isang numero.
STORAGE_ERROR Naubos mo na ang magagamit na memorya o sira ang memorya.
PROGRAM_ERROR Ito ay isang generic na mensahe ng Contact Oracle Support na itinaas dahil may nakitang internal na error.
VALUE_ERROR Sinubukan mong magsagawa ng operasyon at nagkaroon ng error sa pag-convert, pagputol, o paglilimita sa data ng numero o character.
CURSOR_ALREADY_OPEN Sinubukan mong buksan ang isang cursor na nakabukas na.
*/

Maaaring mangyari ang mga error habang isinasagawa ang PL/SQL code na magiging sanhi ng pagwawakas ng PL/SQL block. Ang mga ganitong error ay nagtatapon ng mga exception, na maaaring mahuli at mahawakan ng isang exception handler.

Exception – isang PL/SQL variable na itinataas sa panahon ng block execution at huminto sa pagsasagawa ng mga aksyon sa katawan ng block. Kung ang iyong PL/SQL block ay naglalaman ng isang exception handling section, maaari mong tukuyin ang mga aksyon na dapat gawin para sa isang partikular na exception bago magwakas ang block.

Awtomatikong itinataas ng Oracle server ang isang exception kapag may nangyaring error sa Oracle (TOO_MANY_ROWS, NO_DATA_FOUND). Gayunpaman, maaari mong tukuyin ang sarili mong exception sa declarative na seksyon ng isang PL/SQL block at pagkatapos ay tahasang itaas ito sa executable na seksyon ng block.

Kung ang isang exception ay itinaas sa executable na seksyon ng isang block, ang kontrol ay ililipat sa exception handling section (EXCEPTION section). Kung matagumpay na mahawakan ang pagbubukod, ang PL/SQL block ay makukumpleto nang walang mga error. Kung walang handler para sa exception na ito, ang execution ng PL/SQL block ay magwawakas nang abnormal.

Mayroong tatlong uri ng mga pagbubukod:

Paghuli ng mga pagbubukod

Ang pagkuha ng mga exception ay isinasagawa sa exception handling section ng PL/SQL block.

EXCEPTION

KAILAN exception_1 [ O exception_2 ...] TAPOS

mga operator ;

KAILAN exception_3 [ O exception_4 ...] TAPOS

mga operator ;

pagbubukod– ang pangalan ng isang paunang natukoy na pagbubukod o pagbubukod na inilarawan sa isang deklaratibong seksyon

WHEN OTHERS – tumutukoy sa mga aksyon upang pangasiwaan ang lahat ng mga pagbubukod kung saan ang paghawak ay hindi tahasang tinukoy

Ang seksyon ng exception handling ay nagsisimula sa EXCEPTION na keyword. Ang seksyon ng exception handling ay maaaring magsama ng maraming exception handler, na ang bawat isa ay nagpapatupad ng sarili nitong grupo ng mga statement. Kung ang isang exception ay itinaas sa executable na seksyon ng isang PL/SQL block, ang kontrol ay ililipat sa exception handling section ng handler na idinisenyo upang pangasiwaan ang partikular na exception. Pagkatapos makumpleto ang mga aksyon na tinukoy sa handler na ito, ang block execution ay magtatapos nang walang mga error.

Maaari mong tukuyin ang mga aksyon na isasagawa kung mayroong anumang mga pagbubukod kung saan ang isang handler ay hindi tahasang tinukoy. Upang gawin ito, gamitin ang sugnay na WHEN OTHERS. Maaari lamang magkaroon ng isang WHEN OTHERS clause at inilalagay pagkatapos ng lahat ng iba pang mga humahawak ng exception.

Pagkuha ng Oracle Server Predefined Exceptions

Ang paghuli sa mga paunang natukoy na error ng Oracle ay ginagawa sa pamamagitan ng pagtukoy sa karaniwang pangalan ng exception sa seksyon ng exception handling.

Pangalan ng pagbubukod

Numero ng error

Paglalarawan

CURSOR_ALREADY_OPEN

Sinusubukang buksan ang isang cursor na nakabukas na

DUP_VAL_ON_INDEX

Pagtatangkang magsagawa ng hindi awtorisadong operasyon sa isang cursor (pagsasara ng hindi nabuksan na cursor)

Sinusubukang i-convert ang isang character value sa isang numeric na value sa isang SQL statement kapag ang character value ay hindi isang character na representasyon ng isang numero

Sinusubukang kumonekta sa isang database na may maling username at/o password

SELECT INTO statement ay hindi nagbalik ng anumang mga row

Sinusubukang i-access ang isang database nang hindi kumokonekta dito

Panloob na error sa PL/SQL

Hindi sapat ang memorya

SYS_INVALID_ROWID

Sinusubukang i-convert ang isang value ng character sa isang ROWID kapag ang value ng character ay hindi kumakatawan sa isang wastong representasyon ng character ng ROWID

TIMEOUT_ON_RESOURCE

Nag-time out ang mapagkukunan

SELECT INTO statement ay nagbalik ng higit sa isang row

Error sa pagkalkula, conversion ng uri, paglabag sa dimensyon

Subukang hatiin sa zero

Tingnan natin ang isang halimbawa. Hayaang magkaroon ng isang batch file maliban sa.sql upang kalkulahin ang suweldo ng isang empleyado na may isang tiyak na posisyon. Sa kasong ito, kinakailangan na magbigay para sa paghawak ng mga sitwasyon kung saan walang mga empleyado na may ganoong posisyon o maraming empleyado ang may ganoong posisyon.

v_sal emp.sal%TYPE;

PUMILI ng sal SA v_sal MULA sa emp WHERE LOWER(job)=LOWER(:v_job);

DBMS_OUTPUT.put_line("Suweldo ng " || :v_job || " ay " || TO_CHAR(v_sal));

KAPAG WALANG_DATA_NATAGPUAN NOON

DBMS_OUTPUT.put_line(:v_job || " ay hindi isang titulo ng mga empleyado");

KAPAG MASYADONG_MARAMING_ROWS NOON

DBMS_OUTPUT.put_line(:v_job || " ay isang titulo ng maraming empleyado");

KAPAG ANG IBA NOON

DBMS_OUTPUT.put_line("Naganap ang ibang error");

Ngayon tingnan natin ang iba't ibang mga opsyon, na nagtatalaga ng iba't ibang mga halaga sa host variable v_trabaho.

SQL> VARIABLE v_job VARCHAR2(20)

SQL> EXECUTE:v_job:= "Pangulo"

SQL> @d:\users\maliban

Ang suweldo ng Pangulo ay 5000

Matagumpay na nakumpleto ang pamamaraan ng PL/SQL.

SQL> EXECUTE:v_job:= "Clerk"

Matagumpay na nakumpleto ang pamamaraan ng PL/SQL.

SQL> @d:\users\maliban

Ang Clerk ay isang titulo ng maraming empleyado

Matagumpay na nakumpleto ang pamamaraan ng PL/SQL.

SQL> EXECUTE:v_job:= "Inhinyero"

Matagumpay na nakumpleto ang pamamaraan ng PL/SQL.

SQL> @d:\users\maliban

Ang inhinyero ay hindi isang titulo ng mga empleyado

Matagumpay na nakumpleto ang pamamaraan ng PL/SQL.

Pagkuha ng Oracle Undefined Exceptions

Kung gusto mong pangasiwaan ang isang standard na error sa Oracle server na hindi isang paunang natukoy na error, dapat mo munang ideklara ang exception sa declarative section, iugnay ito sa isang standard na error number, at reference ang exception sa exception handling section.