You are on page 1of 102

Alsaeedi999@hotmail.

com ١ ‫ ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬/ ‫أﻋﺪاد‬

PDF created with pdfFactory Pro trial version www.pdffactory.com


 





 





 



PL/SQL

 
 

Alsaeedi999@hotmail.com ٢ ‫ ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬/ ‫أﻋﺪاد‬

PDF created with pdfFactory Pro trial version www.pdffactory.com


‫اﻟﻤﺤﺘﻮﯾﺎت‬
‫اﻟﺼﻔﺤﺔ‬ ‫اﻟﻤﻮﺿﻮع‪:‬‬ ‫اﻟﻔﺼﻞ‬
‫‪6‬‬ ‫ﻣﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات ‪Exceptions‬‬ ‫اﻷول‬
‫‪7‬‬ ‫أﻧﻮاع اﻻﺳﺘﺜﻨﺎءات ‪Exceptions‬‬
‫‪8‬‬ ‫اﻛﺘﺸﺎف وﻣﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات ‪Trapping Exceptions‬‬
‫‪9‬‬ ‫اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻻﺳﺘﺜﻨﺎءات ‪Predefined Exceptions‬‬
‫‪11‬‬ ‫اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻻﺳﺘﺜﻨﺎءات ‪Non- Predefined Exceptions‬‬ ‫ﻣﻌﺎﻟﺠﺔ‬
‫اﻻﺳﺘﺜﻨﺎءات‬
‫‪13‬‬ ‫اﺳﺘﺨﺪام اﻟﺪوال ﻟﻠﺘﻌﺮف ﻋﻞ اﻻﺳﺘﺜﻨﺎءات‬
‫‪Exceptions‬‬
‫‪14‬‬ ‫اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻻﺳﺘﺜﻨﺎءات ‪User-defined exceptions‬‬
‫‪15‬‬ ‫اﻧﺘﻘﺎل ﺗﻨﻔﯿﺬ اﻻﺳﺘﺜﻨﺎءات ﺑﯿﻦ اﻟﻘﻄﻊ اﻟﺒﺮﻣﺠﯿﺔ‬
‫‪18‬‬ ‫ﻣﻘﺪﻣﺔ ﻋﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ‪Sub-programs‬‬ ‫اﻟﺜﺎﻧﻲ‬
‫‪19‬‬ ‫ﻛﯿﻔﯿﺔ اﺳﺘﺨﺪام اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻣﻊ اﻷداة ‪iSQL*plus‬‬
‫‪20‬‬ ‫اﻹﺟﺮاءات ‪Procedure‬‬
‫‪21‬‬ ‫اﻟﻤﻌﻄﯿﺎت ‪Parameters‬‬
‫‪26‬‬ ‫ﻃﺮق ﺗﻤﺮﯾﺮ ﻗﯿﻢ اﻟﻤﻌﻄﯿﺎت إﻟﻰ اﻹﺟﺮاءات‬ ‫إﻧﺸﺎء‬
‫‪28‬‬ ‫اﻹﺟﺮاءات اﻹﻗﻠﯿﻤﯿﺔ‬ ‫اﻹﺟﺮاءات‬
‫‪29‬‬ ‫ﺣﺬف اﻹﺟﺮاءات‪Procedure‬‬ ‫‪Procedure‬‬
‫‪30‬‬ ‫ﻣﻘﺪﻣﺔ ﻋﻦ اﻟﻮﻇﺎﺋﻒ ‪Functions‬‬
‫‪32‬‬
‫اﻟﺜﺎﻟﺚ‬
‫ﻣﺰاﯾﺎ اﺳﺘﺨﺪام اﻟﻮﻇﺎﺋﻒ ﻓﻲ اﻟﺘﻌﺒﯿﺮات ‪SQL‬‬ ‫إﻧﺸﺎء اﻟﻮﻇﺎﺋﻒ‬
‫‪33‬‬ ‫‪Functions‬‬
‫اﻟﻘﯿﻮد اﻟﺨﺎﺻﺔ ﺑﺎﺳﺘﺪﻋﺎء اﻟﻮﻇﺎﺋﻒ ﻓﻲ اﻟﺘﻌﺒﯿﺮات ‪SQL‬‬

‫‪34‬‬ ‫ﺣﺬف اﻟﻮﻇﺎﺋﻒ واﻟﻔﺮق ﺑﯿﻨﮭﺎ وﺑﯿﻦ اﻹﺟﺮاءات‬

‫اﻻﻣﺘﯿﺎزات ‪Privileges‬‬
‫‪35‬‬ ‫اﻟﺮاﺑﻊ‬
‫اﻟﺴﻤﺎح ﻟﻠﻮﺻﻮل إﻟﻰ اﻟﺒﯿﺎﻧﺎت ‪Granting Access to‬‬
‫‪36‬‬ ‫‪Data‬‬
‫‪37‬‬ ‫اﺳﺘﻌﺮاض اﻟﻤﻌﻠﻮﻣﺎت واﻟﻜﻮد اﻟﺨﺎص ﺑﺎﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ‬ ‫إدارة اﻟﺒﺮاﻣﺞ‬
‫اﺳﺘﻌﺮاض ﺑﯿﺎﻧﺎت اﻷﺧﻄﺎء وﻣﻌﻄﯿﺎت اﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ‬ ‫اﻟﻔﺮﻋﯿﺔ‬
‫‪38‬‬

‫‪40‬‬ ‫ﺗﻨﻘﯿﺢ اﻟﺒﺮﻧﺎﻣﺞ ‪Debugging‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫اﻟﺼﻔﺤﺔ‬ ‫اﻟﻤﻮﺿﻮع‪:‬‬ ‫اﻟﻔﺼﻞ‬
‫‪41‬‬ ‫ﺗﻌﺮﯾﻒ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪Bodiless Packages‬‬ ‫اﻟﺨﺎﻣﺲ‬
‫‪42‬‬ ‫إﻧﺸﺎء اﻟﻘﺴﻢ ‪Package Specification‬‬
‫‪43‬‬ ‫إﻧﺸﺎء اﻟﻘﺴﻢ ‪Package Body‬‬
‫‪45‬‬ ‫اﺳﺘﺪﻋﺎء ﻋﻨﺎﺻﺮ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪Package‬‬ ‫اﻟﻤﺠﻤﻮﻋﺎت‬
‫‪46‬‬ ‫اﻟﺨﺎﺻﯿﺔ ‪ Overloading‬واﻟﺘﻌﺮﯾﻒ اﻟﻤﺴﺒﻖ‪Forward declaration‬‬ ‫اﻟﺒﺮﻣﺠﯿﺔ‬
‫‪48‬‬ ‫اﺳﺘﺨﺪام وﻇﺎﺋﻒ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻓﻲ اﻟﻜﻮد ‪SQL‬‬ ‫‪Packages‬‬
‫ﻛﯿﻔﯿﺔ اﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ اﻟﺠﺎھﺰة‬
‫‪50‬‬
‫اﻟﺴﺎدس‬
‫‪53‬‬ ‫اﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪Execute Immediate‬‬
‫‪55‬‬ ‫‪DBMS_DDL‬‬ ‫اﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ اﻟﺠﺎھﺰة‬
‫‪57‬‬ ‫]‪[1‬‬ ‫اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪DBMS_JOB‬‬
‫‪58‬‬ ‫]‪[2‬‬ ‫اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪DBMS_JOB‬‬
‫‪61‬‬ ‫اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ‪DBMS_Output‬‬
‫‪63‬‬ ‫اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪UTL_FILE‬‬ ‫اﻟﻤﺠﻤﻮﻋﺎت‬
‫‪64‬‬ ‫ﻓﺘﺢ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ‬ ‫اﻟﺒﺮﻣﺠﯿﺔ‬
‫‪66‬‬ ‫اﻟﻜﺘﺎﺑﺔ واﻟﻘﺮاءة ﻣﻦ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ‬ ‫اﻟﺠﺎھﺰة‬
‫‪67‬‬ ‫إﻏﻼق اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ‬
‫‪68‬‬ ‫ﺗﻄﺒﯿﻖ ﻋﻠﻰ اﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪[1] UTL_FILE‬‬
‫‪70‬‬ ‫ﺗﻄﺒﯿﻖ ﻋﻠﻰ اﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪[2] UTL_FILE‬‬
‫‪72‬‬ ‫اﻟﺘﻌﺮف ﻋﻠﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪LOB‬‬
‫‪73‬‬ ‫ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺪاﺧﻠﻲ ‪ internal LOB‬وﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻌﮭﺎ‬ ‫اﻟﺴﺎﺑﻊ‬
‫‪74‬‬ ‫ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪BFILE‬‬
‫‪75‬‬ ‫اﻟﻤﺠﻠﺪات ‪Directories‬‬
‫‪76‬‬ ‫ﻛﯿﻔﯿﺔ إدارة اﻟﺒﯿﺎﻧﺎت ‪BFILE‬‬
‫ﻣﻌﺎﻟﺠﺔ‬
‫‪77‬‬ ‫اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﺒﯿﺎﻧﺎت ‪ LOB‬ﻣﻦ ﺧﻼل اﻟﻤﺠﻤﻮﻋﺔ ‪DBMS_LOB‬‬ ‫اﻟﻌﻨﺎﺻﺮ‬
‫‪79‬‬ ‫اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪[1] DBMS_LOB‬‬ ‫‪Large‬‬
‫‪81‬‬ ‫اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪[2] DBMS_LOB‬‬ ‫‪Object‬‬
‫‪83‬‬ ‫اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪[3] DBMS_LOB‬‬
‫‪84‬‬ ‫اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪[4] DBMS_LOB‬‬
‫‪86‬‬ ‫ﺣﺬف اﻟﺒﯿﺎﻧﺎت ‪LOB‬‬
‫‪87‬‬ ‫ﻣﻘﺪﻣﺔ ﻋﻦ اﻟﻤﻄﻠﻘﺎت ‪Triggers‬‬ ‫اﻟﺜﺎﻣﻦ‬
‫‪88‬‬ ‫ﻣﻜﻮﻧﺎت اﻟﻤﻄﻠﻘﺎت ‪Triggers‬‬
‫‪89‬‬ ‫إﻧﺸﺎء اﻟﻤﻄﻠﻘﺎت ‪Triggers‬‬
‫‪91‬‬ ‫إﻧﺸﺎء اﻟﻤﻄﻠﻘﺎت ‪DML ROW‬‬
‫‪93‬‬ ‫اﻟﻤﻄﻠﻘﺎت ‪Instead of‬‬
‫‪94‬‬ ‫اﻟﻔﺮق ﺑﯿﻦ اﻹﺟﺮاءات ‪ PRORCEDURE‬واﻟﻤﻄﻠﻘﺎت ‪TRIGGERS‬‬
‫‪95‬‬ ‫إدارة اﻟﻤﻄﻠﻘﺎت‪Triggers‬‬ ‫اﻟﻤﻄﻠﻘﺎت‬
‫‪96‬‬ ‫اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬اﻟﺨﺎﺻﺔ ﺑﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت‬ ‫‪Triggers‬‬
‫‪98‬‬ ‫اﻟﺠﺪاول ‪ Mutating Tables‬واﻟﺠﻤﻠﺔ ‪CALL‬‬
‫‪100‬‬ ‫اﻻﻣﺘﯿﺎزات اﻟﺨﺎﺻﺔ ﺑﺈدارة اﻟﻤﻄﻠﻘﺎت ‪Triggers‬‬
‫‪100‬‬ ‫اﺳﺘﻌﺮاض ﺑﯿﺎﻧﺎت اﻟﻤﻄﻠﻘﺎت ‪Triggers‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻣﻘﺪﻣﺔ‪  ‬‬

‫اﻟﺤﻤﺪ ﷲ رب اﻟﻌﺎﻟﻤﯿﻦ واﻟﺼﻼة واﻟﺴﻼم ﻋﻠﻰ أﺷﺮف اﻷﻧﺒﯿﺎء واﻟﻤﺮﺳﻠﯿﻦ ﺳﯿﺪﻧﺎ وﺣﺒﯿﺒﻨﺎ اﻟﻤﺒﻌﻮث رﺣﻤﺔ ﻟﻠﻌﺎﻟﻤﯿﻦ‬
‫ﻣﺤﻤﺪ ﺑﻦ ﻋﺒﺪاﷲ اﻟﺼﺎدق اﻷﻣﯿﻦ أم ﺑﻌﺪ‪:‬‬
‫ﻟﻘﺪ ﺗﻢ ﺗﻘﺴﯿﻢ ھﺬا اﻟﺠﺰء إﻟﻰ ﺛﻤﺎﻧﯿﺔ ﻓﺼﻮل وﺗﻢ ﺗﻘﺴﯿﻢ اﻟﻔﺼﻞ اﻟﻮاﺣﺪ إﻟﻰ ﻋﺪة دروس اﻟﻤﺘﻌﻠﻘﺔ ﺑﺎﻟﻠﻐﺔ ‪PL/SQL‬‬
‫ﺣﯿﺚ ﺗﻢ ﺷﺮح اﻟﺪروس ﺑﺎﻟﺘﻔﺼﯿﻞ وان ﺷﺎء اﷲ ﯾﺴﺘﻔﯿﺪ اﻟﺠﻤﯿﻊ ﻣﻦ ھﺬه اﻟﻠﻐﺔ واﻟﺘﻲ ﺗﻌﺘﺒﺮ اﻷﺳﺎس ﻓﻲ اﻷوراﻛﻞ ‪.‬‬

‫‪ ‬‬

‫ﻟﻐﺔ ‪ PL/SQL‬ھﻲ ﻋﺒﺎرة ﻋﻦ ﺗﻄﻮﯾﺮ ﻟﻠﻐﺔ اﻻﺳﺘﺮﺟﺎع ‪Programming Language/Structured ) SQL‬‬


‫‪ (Query Language‬ﺣﯿﺚ ﻗﺎﻣﺖ ﺷﺮﻛﺔ ‪ Oracle‬ﺑﻌﻤﻞ ھﺬا اﻟﺘﻄﻮﯾﺮ ﻹﻋﺎدة ﻟﻐﺔ اﻻﺳﺘﺮﺟﺎع اﻟﻤﺰاﯾﺎ اﻟﻼزﻣﺔ‬
‫ﻟﻤﻮاﻛﺒﺔ ﻣﺘﻄﻠﺒﺎت اﻟﺒﺮﻣﺠﺔ ﻣﺜﻞ ﻛﺘﺎﺑﺔ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺠﻤﻞ اﻟﺘﻲ ﺗﻘﻮم ﺑﺤﻞ ﻣﺴﺄﻟﺔ ﻣﻌﯿﻨﺔ ﺑﺨﻼف ‪ SQL‬اﻟﺘﻲ ﺗﺴﺘﺨﺪم‬
‫ﺟﻤﻠﺔ واﺣﺪة ﻓﻘﻂ ‪.‬‬
‫وﺗﻢ ﺗﺴﻤﯿﺘﮭﺎ ‪ PL/SQL‬ﻷﻧﮭﺎ ﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺔ أواﻣﺮ اﻟﻠﻐﺔ اﻟﺘﻲ ﺗﻮﻓﺮ اﻟﻌﻤﻠﯿﺎت اﻟﺘﻘﻠﯿﺪﯾﺔ ﻣﺜﻞ أي ﻟﻐﺔ ﺑﺮﻣﺠﺔ‬
‫ﺑﺎﻹﺿﺎﻓﺔ ﻟﺴﮭﻮﻟﺔ دﻣﺞ أواﻣﺮ ‪ SQL‬إﻟﯿﮭﺎ وﻓﻲ ﻣﺎ ﯾﻠﻲ اﻟﻨﻘﺎط اﻟﻌﺎﻣﺔ ﻟﻠﻐﺔ‪:‬‬
‫• اﻹﻋﻼن ﻋﻦ اﻟﻤﺘﻐﯿﺮات‬
‫• اﺳﺘﻌﻤﺎل اﻟﺪوال وإﻧﺸﺎﺋﮭﺎ ‪Functions‬‬
‫• اﻟﺘﺤﻜﻢ ﻓﻲ ﺳﯿﺮ اﻟﺒﺮﻧﺎﻣﺞ ‪Control Flow‬‬
‫• اﻟﺘﻜﺮار ‪Loops‬‬
‫• أواﻣﺮ ‪ PL/SQL‬وﻃﺮق اﻟﻜﺘﺎﺑﺔ وأدوات اﻟﻜﺘﺎﺑﺔ‬
‫• اﻟﺘﻌﺎﻣﻞ ﻣﻊ أﻛﺜﺮ ﻣﻦ ﺳﺠﻞ ‪Cursors‬‬
‫• اﻟﺘﻌﺎﻣﻞ ﻣﻊ أﺧﻄﺎء اﻟﺒﺮﻧﺎﻣﺞ ‪Error Handling‬‬
‫• اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ‪Sub-Programs‬‬
‫• اﻟﻤﻜﺘﺒﺎت ﻣﻦ ﻧﻮع ‪Package‬‬
‫• أﺣﺪاث ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪Database Triggers‬‬

‫وﻏﯿﺮھﺎ ﻣﻦ اﻟﻨﻘﺎط‬
‫ﺷﺮح اﻟﻔﺼﻮل‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪‬‬ ‫‪Exceptions‬‬ ‫‪‬‬

‫‪Exceptions ‬‬
‫‪‬‬
‫‪‬ﺳﻮف‪‬ﻧﺘﻌﺮف‪‬ﻓﻲ‪ ‬ھﺬا‪‬اﻟﺠﺰء‪‬ﻋﻠﻰ ‪‬ﻛﯿﻔﯿﺔ‪‬ﻣﻌﺎﻟﺠﺔ‪‬اﻻﺳﺘﺜﻨﺎءات‪Exceptions‬اﻟﺘﻲ‪‬ﺗﻨﺘﺞ‪‬أﺛﻨﺎء‪‬ﺗﻨﻔﯿﺬ‪‬اﻟﺒﺮﻧﺎﻣﺞ‪‬وﻓﻲ‪‬ﻣﻌﻈﻢ‪‬‬
‫اﻷﺣﯿﺎن‪‬ﺗﻌﻤﻞ‪‬ھﺬه‪‬اﻻﺳﺘﺜﻨﺎءات‪‬ﻋﻠﻰ‪‬إﻧﮭﺎء‪‬اﻟﺒﺮﻧﺎﻣﺞ‪ ‬وذﻟﻚ‪‬ﻓﻲ‪‬ﺣﺎﻟﺔ‪‬ﻋﺪم‪‬ﻣﻌﺎﻟﺠﺘﮭﺎ‪  ‬‬

‫وﻗﺒﻞ‪‬اﻟﺘﻌﺮف‪‬ﻋﻠﻰ‪‬ﻛﯿﻔﯿﺔ‪‬ھﺬه‪‬اﻻﺳﺘﺜﻨﺎءات‪‬ﻓﻲ‪‬اﻟﻠﻐﺔ‪PL/SQL‬ﻻﺑﺪ‪‬ﻣﻦ‪‬اﻟﺘﻌﺮف‪‬ﻋﻠﻰ ‪‬ﺑﻌﺾ‪‬اﻷﺳﺒﺎب ‪‬اﻟﻤﺴﺒﺒﺔ‪‬ﻟﮭﺬه‪‬‬


‫اﻻﺳﺘﺜﻨﺎءات‪  ‬‬

‫‪ -‬ﺧﻄﺄ‪‬ﻓﻲ‪‬ﺗﺼﻤﯿﻢ‪‬اﻟﺒﺮﻧﺎﻣﺞ‪  ‬‬

‫‪ -‬ﺧﻄﺄ‪‬ﻓﻲ‪‬ﻛﺘﺎﺑﺔ‪‬اﻷﻛﻮاد‪‬‬

‫‪ -‬ﺗﻠﻒ‪‬ﺑﻌﺾ‪‬اﻟﻤﻜﻮﻧﺎت ‪‬اﻟﻤﺎدﯾﺔ‪‬ﻟﺠﮭﺎز‪‬اﻟﺤﺎﺳﺐ‪Hardware Failures‬‬

‫وﻋﻠﻰ‪‬رﻏﻢ‪‬ﻣﻦ‪‬ذﻟﻚ‪‬ﻓﺈﻧﮫ‪‬ﻣﻦ‪‬اﻟﺼﻌﺐ‪‬ﺗﻮﻗﻊ ‪‬ﺟﻤﯿﻊ‪‬اﻻﺳﺘﺜﻨﺎءات‪‬اﻟﺘﻲ‪‬ﯾﻤﻜﻦ‪‬ﺣﺪوﺛﮭﺎ‪‬أﺛﻨﺎء‪‬ﺗﻨﻔﯿﺬ‪‬اﻟﺒﺮﻧﺎﻣﺞ‪‬وﻟﻜﻦ ‪‬ﯾﻤﻜﻦ‪‬‬


‫اﻟﺘﺨﻄﯿﻂ‪‬ﻟﻤﻌﺎﻟﺠﺔ اﻟﻌﺪﯾﺪ ﻣﻦ ھﺬه اﻻﺳﺘﺜﻨﺎءات ﻓﻲ ﺑﺮاﻣﺞ اﻟﻠﻐﺔ ‪ . PL/SQL‬وﯾﺠﺐ ﻣﻼﺣﻈﺔ اﻧﮫ ﻓﻲ اﻟﻌﺪﯾﺪ ﻣﻦ ﻟﻐﺔ‬
‫اﻟﺒﺮﻣﺠﺔ ﻓﺈن اﻻﺳﺘﺜﻨﺎءات اﻟﺘﻲ ﺗﺤﺪث أﺛﻨﺎء ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ ‪ Run-time-Errors‬ﺗﻌﻤﻞ ﻋﻠﻰ إﻧﮭﺎء ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ‬
‫واﻟﻌﻮدة إﻟﻰ ﻧﻈﺎم اﻟﺘﺸﻐﯿﻞ إﻟﻰ أن ﯾﺘﻢ ﻣﻌﺎﻟﺠﺔ ھﺬه اﻻﺳﺘﺜﻨﺎءات ‪.‬‬
‫أﻣﺎ اﻟﻠﻐﺔ ‪ PL/SQL‬ﺗﺴﺘﺨﺪم ﺗﻘﻨﯿﺔ ﻣﻌﺎﻟﺠﺎت اﻻﺳﺘﺜﻨﺎءات‬
‫‪PL/SQL‬‬ ‫‪Handling Exception‬‬
‫واﻟﺘﻲ ﺗﺘﯿﺢ ﻣﻌﺎﻟﺠﺔ ھﺬه اﻻﺳﺘﺜﻨﺎءات أﺛﻨﺎء ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ ﺑﺪون اﻟﺤﺎﺟﺔ إﻟﻰ إﻧﮭﺎءه وﺗﺴﻤﻰ اﻻﺳﺘﺜﻨﺎءات ﻓﻲ اﻟﻠﻐﺔ‬
‫‪ PL/SQL‬ﺑﺎﻻﺳﻢ ‪ Exceptions‬وھﻲ ﻋﺒﺎرة ﻋﻦ ﺣﺎﻻت ﻣﻌﺮﻓﺔ ﻓﻲ اﻟﻠﻐﺔ ‪ PL/SQL‬واﻟﺘﻲ ﯾﺘﻢ ﻣﻌﺎﻟﺠﺘﮭﺎ ﻣﻦ‬
‫ﺧﻼل ﻣﻌﺎﻟﺞ اﻻﺳﺘﺜﻨﺎءات ‪. Exception Handling‬‬

‫ﻣﻼﺣﻈﺔ‪:‬‬
‫اﻷﺟﺰاء اﻟﻤﺎدﯾﺔ ﻟﺠﮭﺎز اﻟﺤﺎﺳﺐ‪.‬‬
‫‪‬‬ ‫ﯾﻤﻜﻦ أن ﺗﻈﮭﺮ اﻻﺳﺘﺜﻨﺎءات ‪ Exceptions‬ﻧﺘﯿﺠﺔ ﻟﺘﻠﻒ ﺑﻌﺾ‬

‫وﯾﻤﻜﻦ‪‬ﺗﻌﯿﯿﻦ‪‬أﺳﻤﺎء ‪‬ﻟﻼﺳﺘﺜﻨﺎءات‪Exceptions‬داﺧﻠﯿﺎً‪‬أي‪‬ﻣﻦ‪‬ﺧﻼل‪‬اﻟﺨﺎدم‪‬أوراﻛﻞ‪Oracle server‬أو‪‬ﺗﻌﯿﯿﻦ‪‬‬


‫أﺳﻤﺎء‪‬ﻟﮫ‪‬ﺑﻮاﺳﻄﺔ‪‬اﻟﻤﺴﺘﺨﺪم‪‬وﻓﻲ‪‬اﻟﻌﺎدة‪‬ﯾﻤﻜﻦ ‪‬إﻧﮭﺎء‪‬اﻟﻘﺎﻟﺐ‪PL/SQL‬ﻋﻨﺪ‪‬ﻇﮭﻮر‪‬اﻻﺳﺘﺜﻨﺎء‪Exception ‬ﺣﯿﺚ‪‬ﯾﺘﻢ‪‬‬
‫إﯾﻘﺎف ‪‬ﺗﻨﻔﯿﺬ‪‬اﻟﺠﺰء‪‬اﻟﺮﺋﯿﺴﻲ‪‬ﻓﻲ‪‬اﻟﺒﺮﻧﺎﻣﺞ‪ ‬وﯾﺘﻢ‪‬اﻻﻧﺘﻘﺎل‪‬ﻟﻠﺘﻨﻔﯿﺬ‪‬اﻟﺠﺰء‪‬اﻟﺨﺎص‪‬ﺑﻤﻌﺎﻟﺠﺔ ‪‬اﻻﺳﺘﺜﻨﺎءات‪Handling ‬‬
‫‪Exception‬ﻓﻲ‪‬اﻟﻘﺎﻟﺐ‪PL/SQL‬أو‪‬اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ‪ Sub-programs‬وﯾﻤﻜﻦ اﺳﺘﺨﺪام ﻣﻌﺎﻟﺞ اﻻﺳﺘﺜﻨﺎءات‬
‫‪ Exception Handler‬ﻹﺟﺮاء ﻋﻤﻠﯿﺎت ﻣﻌﯿﻨﺔ ﻋﻨﺪ ﺣﺪوث ھﺬا اﻻﺳﺘﺜﻨﺎء وﯾﺘﻢ اﻹﺷﺎرة إﻟﻰ اﻟﺠﺰء اﻟﺨﺎص‬
‫ﺑﻤﻌﺎﻟﺠﺔ ھﺬه اﻻﺳﺘﺜﻨﺎءات ﻓﻲ ﺟﺰء ‪ Exception‬ﺑﺎﺳﺘﺨﺪام اﺳﻢ ھﺬا اﻻﺳﺘﺜﻨﺎء ‪ Exception Name‬واﻟﺬي ﯾﺘﻢ‬
‫ﺗﻌﯿﯿﻨﮫ ﻋﻨﺪ ﺗﻌﺮﯾﻒ اﻻﺳﺘﺜﻨﺎء ﻓﻲ ﺟﺰء اﻟﺘﻌﺮﯾﻒ ‪ Declaration Section‬أو ﻓﻲ ﺟﺰء اﻟﺨﺎص ﺑﻤﻌﺎﻟﺠﺔ رﺳﺎﺋﻞ‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫اﻻﺳﺘﺜﻨﺎء وﻓﻲ ﺣﺎﻟﺔ ﻇﮭﻮر أي اﺳﺘﺜﻨﺎء أﺛﻨﺎء ﻇﮭﻮر أو ﺗﻨﻔﯿﺬ اﻟﻘﺎﻟﺐ ﯾﺘﻢ اﻧﺘﻘﺎل اﻟﺘﻨﻔﯿﺬ إﻟﻰ اﻟﻤﻌﺎﻟﺞ ‪Exception‬‬
‫‪ Handler‬اﻟﺨﺎص ﺑﮭﺬا اﻻﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ ‪ Exception Section‬اﻟﻤﻮﺟﻮد ﻓﻲ ﻧﻔﺲ اﻟﻘﺎﻟﺐ إﻣﺎ أذا ﻟﻢ ﯾﺘﻢ‬
‫اﻟﻌﺜﻮر ﻋﻠﻰ اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﮭﺬا اﻻﺳﺘﺜﻨﺎء ﯾﺘﻢ إﻧﮭﺎء اﻟﺒﺮﻧﺎﻣﺞ ﺑﺼﻮرة ﻏﯿﺮ ﻃﺒﯿﻌﯿﺔ‪.‬‬
‫وﺗﻮﺟﺪ ﻃﺮﯾﻘﺘﯿﻦ ﻹﻃﻼق اﻻﺳﺘﺜﻨﺎءات ‪:‬‬
‫اﻷوﻟﻰ‪ :‬ﺗﺘﻢ ﻣﻦ ﺧﻼل اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬وﺗﺴﻤﻰ ‪ Implicit‬ﺣﯿﺚ ﯾﻘﻮم ﺧﺎدم أوراﻛﻞ ﺑﺈﻃﻼق ھﺬه‬
‫اﻻﺳﺘﺜﻨﺎءات ﺗﻠﻘﺎﺋﯿﺎً ﻋﻨﺪ ﺣﺪوﺛﮭﺎ ‪.‬‬
‫اﻟﺜﺎﻧﯿﺔ‪ :‬وﺗﺘﻢ ﻣﻦ ﺧﻼل اﻟﻤﺴﺘﺨﺪم ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Raise‬وﺗﺴﻤﻰ اﻻﺳﺘﺜﻨﺎءات اﻟﻤﻌﺮﻓﺔ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم‬
‫‪ User-defined Exception‬أو اﻻﺳﺘﺜﻨﺎءات ﺳﺎﺑﻘﺔ اﻟﺘﻌﺮﯾﻒ‪. Predefined Exception‬‬

‫‪Exceptions Types ‬‬

‫ﺗﻨﻘﺴﻢ أﻧﻮاع اﻻﺳﺘﺜﻨﺎءات إﻟﻰ ‪:‬‬


‫اﻷﻧﻮاع اﻟﻀﻤﻨﯿﺔ ‪: Implicitly‬‬
‫وھﻲ اﻷﻧﻮاع اﻟﺘﻲ ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬ﺑﺈﻃﻼﻗﮭﺎ وھﻲ أﺣﺪى اﻟﻨﻮﻋﺎن ‪-:‬‬
‫‪- Predefined oracle server Error‬‬
‫‪- Non- Predefined oracle server Error‬‬
‫اﻷﻧﻮاع اﻟﺘﺼﺮﯾﺤﯿﺔ ‪: Explicitly‬‬
‫وھﻲ ‪:‬‬
‫‪-User-defined Error‬‬
‫اﻟﺠﺪول اﻟﺘﺎﻟﻲ ﯾﻮﺿﺢ أﻧﻮاع اﻻﺳﺘﺜﻨﺎءات ‪:‬‬

‫وﯾﻌﺘﺒﺮ اﻟﻨﻮع اﻷول ) اﻷﻧﻮاع اﻟﻀﻤﻨﯿﺔ ‪ (Implicitly‬ھﻮ أﺣﺪ ‪ 20‬اﺳﺘﺜﻨﺎءاً ﻣﻦ اﻻﺳﺘﺜﻨﺎءات اﻟﺘﻲ ﻏﺎﻟﺒﺎً ﻣﺎ ﺗﺤﺪث ﻓﻲ‬
‫أﻛﻮاد اﻟﻠﻐﺔ ‪ PL/SQL‬وھﺬا اﻟﻨﻮع ﻣﻦ اﻻﺳﺘﺜﻨﺎءات ﻻ ﯾﺤﺘﺎج إﻟﻰ ﺗﻌﺮﯾﻒ ﻣﺴﺒﻖ أو ﻋﻤﻞ أﻃﻼق ‪ Raise‬ﻟﮫ داﺧﻞ‬
‫اﻟﻜﻮد وﻟﻜﻦ ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬ﺑﺘﻌﺮﯾﻔﮭﺎ وإﻃﻼﻗﮭﺎ ﺗﻠﻘﺎﺋﯿﺎً‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


Zero-Divid
: ‫وﻣﻦ أﻣﺜﻠﺔ اﻻﺳﺘﺜﻨﺎءات‬
[1] - Predefined oracle server Error
Storage-Error

[2] - Non- Predefined oracle server Error


‫ ﻟــﮫ ﺗﻠﻘﺎﺋﯿﺎً ﻣﻦ ﻗﺒﻞ اﻟﺨﺎدم‬Raise ‫ وﯾﺘﻢ إﻃﻼﻗﮫ أو ﻋﻤﻞ‬Declarative Section ‫وﯾﺠﺐ ﺗﻌﺮﯾﻔﮫ ﻓﻲ اﻟﻘﺴﻢ‬
Oracle server ‫أوراﻛﻞ‬
[3]- User-defined Error
Declarative Section ‫وھﻮ ﻋﺒﺎرة ﻋﻦ ﺷﺮط ﯾﻘﻮم اﻟﻤﺒﺮﻣﺞ ﺑﺘﺤﺪﯾﺪه وﻋﺎدة ﻣﺎ ﯾﺘﻢ ﺗﻌﺮﯾﻔﮫ ﺑﺎﻟﻘﺴﻢ اﻟﺨﺎص ﺑﺎﻟﺘﻌﺮﯾﻒ‬
. Raise ‫وﻛﻤﺎ ﯾﺘﻢ إﻃﻼﻗﮫ أﯾﻀﺎ ﻣﻦ ﻗﺒﻞ اﻟﻤﺒﺮﻣﺞ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ‬

Trapping Exceptions 

‫ﯾﻤﻜﻦ اﻛﺘﺸﺎف اﻻﺳﺘﺜﻨﺎءات ﻋﻦ ﻃﺮﯾﻖ ﻛﺘﺎﺑﺔ ﺑﻌﺾ اﻻﻛﻮاد اﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ اﻛﺘﺸﺎف ھﺬه اﻻﺳﺘﺜﻨﺎءات وﻣﻌﺎﻟﺠﺘﮭﺎ‬
BLOCKS ‫ ﻓﻲ اﻟﻘﺎﻟﺐ‬Exception Section ‫وﯾﺘﻢ ﻛﺘﺎﺑﺔ ھﺬه اﻻﻛﻮاد ﻓﻲ اﻟﻘﺴﻢ اﻟﺨﺎص ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات‬
:‫واﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﮭﺬه اﻻﻛﻮاد ھﻲ ﻛﺎﻟﺘﺎﻟﻲ‬

Exception
When Exception 1 [OR Exception 2……….] then
Statement 1;
Statement 2;
……..
[When Exception 3 [OR Exception 4……….] then
Statement 1;
Statement 2;
……..
]
[When Others then
Statement 1;
Statement 2;
……..
]
Alsaeedi999@hotmail.com ٨ ‫ ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬/ ‫أﻋﺪاد‬

PDF created with pdfFactory Pro trial version www.pdffactory.com


‫وﻛﻤﺎ ﻧﻼﺣﻆ ﻣﻦ اﻟﺼﯿﻐﺔ أن ﻛﻞ ﻛﻮد ﻣﻦ اﻻﻛﻮاد ﯾﻌﻤﻞ ﻋﻠﻰ ﻣﻌﺎﻟﺠﺔ اﺳﺘﺜﻨﺎء ﻣﻌﯿﻦ ﻣﻦ ﺧﻼل اﻟﻌﺒﺎرة ‪ when‬ﺣﯿﺚ‬
‫ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﻌﺒﺎرة ‪ when‬ﯾﻠﯿﮭﺎ أﺳﻢ اﻻﺳﺘﺜﻨﺎء اﻟﺬي ﻧﺮﯾﺪ ﻣﻌﺎﻟﺠﺘﮫ ﺛﻢ اﻟﻜﻠﻤﺔ ‪ Then‬ﺛﻢ ﯾﻠﯿﮭﺎ ﻣﺠﻤﻮﻋﺔ ﺟﻤﻞ اﻟﺬي‬
‫ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ ﺣﺪوث ھﺬا اﻻﺳﺘﺜﻨﺎء وﻧﻼﺣﻆ أﯾﻀﺎ إﻧﮫ ﯾﻤﻜﻨﻨﺎ ﻣﻌﺎﻟﺠﺔ أﻛﺜﺮ ﻣﻦ اﺳﺘﺜﻨﺎء ٍ داﺧﻞ ﻧﻔﺲ اﻟﻌﺒﺎرة‬
‫‪ when‬وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ اﻟﺮﺑﻂ ﺑﯿﻦ ھﺬه اﻻﺳﺘﺜﻨﺎءات ﺑﺎﺳﺘﺨﺪام اﻟﺪاﻟﺔ ‪ OR‬أﻣﺎ اﻟﻌﺒﺎرة‪when Others then‬‬
‫ﻓﺘﺴﺘﺨﺪم ﻟﻤﻌﺎﻟﺠﺔ ﺟﻤﯿﻊ اﻻﺳﺘﺜﻨﺎءات اﻟﺘﻲ ﻟﻢ ﯾﺘﻢ ﻣﻌﺎﻟﺠﺘﮭﺎ ﺑﺎﺳﺘﺨﺪام اﻟﻌﺒﺎرات ‪ When‬اﻟﺴﺎﺑﻘﺔ ﻟﮭﺬه اﻟﻌﺒﺎرة ﻟﺬﻟﻚ‬
‫ﻓﺈﻧﮫ ﯾﺘﻢ ﻛﺘﺎﺑﺔ ھﺬه اﻟﻌﺒﺎرة ﻛﺂﺧﺮ ﻋﺒﺎرة ﻓﻲ اﻟﺠﺰء ‪. Exception‬‬
‫وﻋﻨﺪ ﻛﺘﺎﺑﺔ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎء ﯾﺠﺐ ﻣﺮاﻋﺎة ﻋﺪة ﻧﻘﺎط وھﻲ ‪:‬‬
‫• ﯾﺠﺐ أن ﯾﺒﺪأ اﻟﻘﺴﻢ اﻟﺨﺎص ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎء ﺑﺎﻟﻜﻠﻤﺔ ‪. Exception‬‬
‫• ﯾﻤﻜﻦ أن ﯾﺤﺘﻮي اﻟﻘﺴﻢ ﻋﻠﻰ أﻛﺜﺮ ﻣﻦ ﻛﻮد ﻟﻤﻌﺎﻟﺠﺔ أﻛﺜﺮ ﻣﻦ اﺳﺘﺜﻨﺎء‪.‬‬
‫‪PL/SQL‬‬ ‫• ﻋﻨﺪ ﺣﺪوث أي اﺳﺘﺜﻨﺎء ﺗﻌﻤﻞ اﻟﻠﻐﺔ ‪ PL/SQL‬ﻋﻠﻰ ﺗﻨﻔﯿﺬ ﻣﻌﺎﻟﺞ واﺣﺪ ﻓﻘﻂ ﻗﺒﻞ اﻟﺨﺮوج ﻣﻦ اﻟﻘﺎﻟﺐ‬
‫• ﻻﺑﺪ ﻣﻦ وﺿﻊ اﻟﺠﻤﻠﺔ ‪ When Other‬ﺑﻌﺪ ﺟﻤﯿﻊ اﻟﺨﻮاص ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات اﻟﺘﻲ ﻧﺮﯾﺪ ﻣﻌﺎﻟﺠﺘﮭﺎ‪.‬‬
‫• ﻻ ﯾﺘﻢ اﻟﺴﻤﺎح ﺑﻜﺘﺎﺑﺔ أﻛﺜﺮ ﻣﻦ ﻋﺒﺎرة ‪ When Other‬ﻓﻲ اﻟﺠﺰء ‪. Exception‬‬
‫• ﻻ ﯾﻤﻜﻦ ﻇﮭﻮر اﻻﺳﺘﺜﻨﺎءات ﻓﻲ اﻟﺠﻤﻞ ‪ SQL‬أو اﻟﺠﻤﻞ ‪. Assignments Statements‬‬

‫‪Predefined Exceptions ‬‬

‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻻﺳﺘﺜﻨﺎءات ﺳﺎﺑﻘﺔ اﻟﺘﻌﺮﯾﻒ ‪ Predefined‬وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ‬
‫ﻗﺒﻞ إن ھﺬه اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻻﺳﺘﺜﻨﺎءات ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬ﺑﺈﻃﻼﻗﮫ ﺗﻠﻘﺎﺋﯿﺎ ‪Oracle‬‬
‫‪ . server‬وﻋﻦ ﻃﺮﯾﻖ ﻛﺘﺎﺑﺔ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﻤﻌﺎﻟﺠﺔ ھﺬه اﻻﺳﺘﺜﻨﺎءات ﻓﻲ اﻟﻘﺴﻢ ‪ Exception Section‬ﯾﻤﻜﻨﻨﺎ‬
‫ﺑﺮﻣﺠﺔ ھﺬا اﻟﺠﺰء ﻹﺻﺪار رﺳﺎﺋﻞ ﻣﻌﺒﺮة إﻟﻰ اﻟﻤﺴﺘﺨﺪم ﻋﻨﺪ ﺣﺪوث ھﺬه اﻻﺳﺘﺜﻨﺎءات وﻟﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات ﻣﻦ‬
‫اﻟﻨﻮع ‪ Predefined Exceptions‬ﻧﻘﻮم ﺑﺈﺿﺎﻓﺔ اﺳﻢ اﻻﺳﺘﺜﻨﺎء اﻟﺬي ﻧﺮﯾﺪ ﻣﻌﺎﻟﺠﺘﮫ ﻓﻲ اﻟﻌﺒﺎرة ‪When‬ﻛﻤﺎ ﯾﻠﻲ‪:‬‬
‫‪Exception‬‬
‫‪WHEN NO_DATA_FOUND‬‬ ‫‪THEN‬‬
‫;‪Statement 1‬‬
‫;‪Statement 2‬‬
‫‪WHEN TOO_MANY_ROWS‬‬ ‫‪THEN‬‬
‫;‪Statement 1‬‬
‫‪WHEN OTHERS THEN‬‬
‫;‪Statement 1‬‬
‫;‪Statement 2‬‬
‫;‪Statement 3‬‬
‫;‪END‬‬
‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﻜﻠﻤﺔ ‪ WHEN‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻻﺳﺘﺜﻨﺎء ﺛﻢ اﻟﻜﻠﻤﺔ ‪ THEN‬ﻣﺘﺒﻮﻋﺔ ﺑﻤﺠﻤﻮﻋﺔ اﻟﺠﻤﻞ اﻟﺘﻲ ﻧﺮﯾﺪ‬
‫ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ ﺣﺪوث ھﺬا اﻻﺳﺘﺜﻨﺎء ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ وﻟﻤﺰﯾﺪ ﻣﻦ اﻟﺘﻮﺿﯿﺢ ﻧﻼﺣﻆ ھﺬا اﻟﻜﻮد‪:‬‬

‫‪DECLARE‬‬
‫; ‪V_emp_id NUMBER :=&employee_id‬‬
‫;)‪V_name VARCHAR2(30‬‬
‫‪BEGIN‬‬
‫)‪Select RTRIM(first_name) | | ' ' | | RTRIM (last_name‬‬
‫‪INTO‬‬ ‫‪v_name‬‬
‫‪From employees‬‬
‫; ‪Where emp_no = V_emp_id‬‬
‫; )‪DBMS_OUTPUT.PUT_LINE ('employee name is' | | v_name‬‬
‫‪Exception‬‬
‫‪WHEN NO_DATA_FOUND THEN‬‬
‫;)'‪DBMS_OUTPUT.PUT_LINE ('there is no such employee‬‬
‫;‪END‬‬
‫‪/‬‬
‫‪ :‬ﺣﯿﺚ ﯾﻌﻤﻞ ھﺬا اﻟﻜﻮد ﻋﻠﻰ إﻇﮭﺎر رﺳﺎﻟﺔ ﻟﻠﻤﺴﺘﺨﺪم ﻹدﺧﺎل رﻗﻢ اﻟﻤﻮﻇﻒ ﺛﻢ اﺳﺘﺨﻼص‬ ‫ﺗﻮﺿﯿﺢ‬
‫اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻟﻤﻮﻇﻒ ﻣﻦ اﻟﺠﺪول ‪ Employees‬ﻟﻌﺮض اﻻﺳﻢ اﻷول واﻻﺳﻢ اﻷﺧﯿﺮ‬
‫ﻟــﮫ ﺑﺪﻻﻟﺔ رﻗﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﺗﻢ إدﺧﺎﻟﮫ وﻓﻲ ﺣﺎﻟﺔ وﺟﻮد ھﺬا اﻟﺮﻗﻢ ﻓﻲ اﻟﺠﺪول ﯾﺘﻢ ﻋﺮض اﺳﻢ اﻟﻤﻮﻇﻒ اﻟﻤﺮﺗﺒﻂ‬
‫ﺑﮭﺬا اﻟﺮﻗﻢ ‪ ،‬أﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﻋﺪم وﺟﻮد اﻟﺮﻗﻢ اﻟﺬي ﺗﻢ إدﺧﺎﻟﮫ ﻓﻲ اﻟﺠﺪول ﯾﻘﻮم اﻟﺒﺮﻧﺎﻣﺞ ﺑﺎﻻﻧﺘﻘﺎل ﻟﺘﻨﻔﯿﺬ اﻟﺠﺰء‬
‫‪ Exception‬وﻓﻲ ھﺬا اﻟﺠﺰء ﻗﻤﻨﺎ ﺑﺒﺮﻣﺠﺔ اﻻﺳﺘﺜﻨﺎء ‪ NO_DATA_FOUND‬ﺑﺤﯿﺚ ﯾﺘﻢ ﻋﺮض ھﺬه اﻟﺮﺳﺎﻟﺔ‬
‫ﻓﻲ ﺣﺎﻟﺔ ﻋﺪم اﺳﺘﺮﺟﺎع أي ﺑﯿﺎﻧﺎت ﻣﻦ اﻟﺠﺪول '‪ 'there is no such employee‬ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﻜﺘﺎﺑﺔ اﺳﻢ‬
‫اﻻﺳﺘﺜﻨﺎء ‪ NO_DATA_FOUND‬ﺑﯿﻦ اﻟﻜﻠﻤـــــــﺔ ‪ WHEN‬واﻟﻜﻠﻤـــﺔ ‪ THEN‬ﺛﻢ اﻟﺠﻤﻠﺔ أو ﻣﺠﻤﻮﻋﺔ ﻣﻦ‬
‫اﻟﺠﻤﻞ اﻟﺘﻲ ﻧﺮﯾﺪ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ إﻃﻼق ھﺬا اﻻﺳﺘﺜﻨﺎء وھﻲ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﻋﺒﺎرة ﻋﻦ ﻋﺮض ﺟﻤﻠﺔ ‪'there is no‬‬
‫'‪ such employee‬ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ اﻻﺳﺘﺜﻨﺎ ء ‪ NO_DATA_FOUND‬ﺣﯿﺚ ﯾﻮﺟﺪ اﻟﻌﺪﯾﺪ ﻣﻦ اﻻﺳﺘﺜﻨﺎءات‬
‫اﻟﺘﻲ ﺗﺴﺘﺨﺪم ﻋﺎدةً ﻓﻲ اﻟﺒﺮاﻣﺞ ‪ PL/SQL‬ﻛﻤﺎ ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٠‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Non-Predefined Exceptions‬‬

‫ﺗﺘﯿﺢ اﻟﻠﻐﺔ ‪ PL/SQL‬ﻣﻌﺎﻟﺠﺔ ھﺬا اﻟﻨﻮع ﻣﻦ اﻻﺳﺘﺜﻨﺎءات ﺑﺈﺣﺪى ﻃﺮﯾﻘﺘﯿﻦ‪:‬‬

‫‪PL/SQL‬‬

‫‪Others‬‬ ‫‪Declarative Section‬‬

‫وﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬ﺑﺈﻃﻼق أو ﻋﻤﻞ ‪ Raise‬ﻟﮭﺬا اﻻﺳﺘﺜﻨﺎء ﺗﻠﻘﺎﺋﯿﺎً وﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ‬
‫ھﺬا اﻟﻨﻮع ﻣﻦ اﻻﺳﺘﺜﻨﺎء ﻻﺑﺪ ﻣﻦ ﻣﺮور ﺑﺜﻼث ﻣﺮاﺣﻞ‪:‬‬
‫اﻷوﻟﻰ ‪ :‬ﺗﻌﺮﯾﻒ اﻻﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ ‪ Declarative section‬وذﻟﻚ ﺑﺎﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪:‬‬
‫‪Declarative section‬‬ ‫; ‪Exception_name Exception‬‬
‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻻﺳﻢ اﻟﺬي ﻧﺮﯾﺪ ﺗﺤﺪﯾﺪه ﻟﮭﺬا اﻻﺳﺘﺜﻨﺎء ‪ Exception_name‬ﯾﻠﯿﮫ اﻟﻜﻠﻤﺔ ‪Exception‬‬
‫اﻟﺜﺎﻧﯿﺔ‪ :‬ﯾﺘﻢ رﺑﻂ اﻻﺳﻢ اﻟﺬي ﻗﻤﻨﺎ ﺑﺘﻌﯿﯿﻨﮫ ﻟﮭﺬا اﻻﺳﺘﺜﻨﺎء ﺑﺎﻟﺮﺑﻂ اﻟﺨﺎص ﺑﺎﻻﺳﺘﺜﻨﺎء وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ‬
‫‪ Pragma Exception-init‬وﺗﻌﻤﻞ ھﺬه اﻟﺠﻤﻠﺔ ﻋﻠﻰ أﺧﺒﺎر اﻟﻤﺘﺮﺟﻢ ‪ Complier‬ﺑﻌﻤﻞ رﺑﻂ ﺑﯿﻦ اﺳﻢ اﻟﺬي ﺗﻢ‬
‫ﺗﻌﯿﯿﻨﮫ ﻟﻼﺳﺘﺜﻨﺎء ﻣﻊ اﻟﺮﻗﻢ اﻟﺨﺎص ﻟﮭﺬا اﻻﺳﺘﺜﻨﺎء ‪.‬‬

‫‪Compiler‬‬

‫‪Exception_name‬‬ ‫‪Error_Number‬‬

‫وذﻟﻚ ﺑﺎﺳﺘ ﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ ‪:‬‬


‫‪Pragma Exception-init‬‬ ‫;)‪(Exception_name , Error_number‬‬
‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ ‪ Pragma Exception-init‬ﯾﻠﯿﮫ اﻻﺳﻢ اﻟﺬي ﯾﺘﻢ ﺗﻌﯿﯿﻨﮫ ﻟﻼﺳﺘﺜﻨﺎء ‪Exception_name‬‬
‫واﻟﺮﻗﻢ اﻟﺨﺎص ﺑﮭﺬا اﻻﺳﺘﺜﻨﺎء ‪. Error_number‬‬
‫اﻟﺜﺎﻟﺜﺔ‪ :‬وھﻲ ﻋﺒﺎرة ﻋﻦ ﻛﺘﺎﺑﺔ اﻟﻤﻌﺎﻟﺞ ‪ Exception Handling‬اﻟﻤﻨﺎﺳﺐ ﻟﮭﺬا اﻻﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ ‪Exception‬‬
‫‪ section‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١١‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Exception‬‬
‫‪WHEN Exception_NAME THEN‬‬
‫;‪Statement 1‬‬
‫;‪Statement 2‬‬
‫‪………..‬‬
‫وﻟﺘﻮﺿﯿﺢ اﺳﺘﺨﺪام ھﺬا اﻟﻨﻮع ﻣﻦ اﻻﺳﺘﺜﻨﺎءات ﻧﻨﻈﺮ إﻟﻰ ھﺬا اﻟﻜﻮد‪:‬‬

‫ﺗﻮﺿﯿﺢ‬
‫ﺣﯿﺚ ﯾﻌﻤﻞ ھﺬا اﻟﻜﻮد ﻋﻠﻰ إﻇﮭﺎر رﺳﺎﻟﺔ ﺧﻄﺄ ﻋﻨﺪ ﻣﺤﺎوﻟﺔ ﺣﺬف اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺄي ﻗﺴﻢ ‪ Department‬ﻣﻦ‬
‫اﻟﺠﺪول ‪ Department‬ﻣﻊ وﺟﻮد ﻣﻮﻇﻔﯿﻦ ﻣﻮﺟﻮدﯾﻦ ﻓﻲ ھﺬا اﻟﻘﺴﻢ‪.‬‬
‫ﻓﻔﻲ اﻟﺠﺰء ‪ Declare‬ﻗﻤﻨﺎ ﺑﺘﻌﯿﯿﻦ اﺳﻢ ﻟﻼﺳﺘﺜﻨﺎء ﺑﻜﺘﺎﺑﺔ اﺳﻤﮫ ‪ e_emps_remaining‬ﯾﻠﯿﮫ اﻟﻜﻠﻤﺔ‬
‫‪ Exception‬ﺛﻢ ﻗﻤﻨﺎ ﺑﺮﺑﻂ اﻻﺳﺘﺜﻨﺎء ﻣﻊ اﻟﺮﻗﻢ اﻟﺨﺎص ﺑﮫ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ‪:‬‬
‫;)‪Pragma Exception-init (e_emps_remaining ,-2292‬‬
‫ﺛﻢ ﻗﻤﻨﺎ ﺑﺒﺮﻣﺠﺔ ھﺬا اﻻﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ ‪Exception‬‬
‫‪When e_emps_remaining‬‬ ‫‪then‬‬
‫‪Dbms_output.put_line('cannot remove dept'| | to_char(&p_deptno) | | '.employees‬‬
‫;)'‪exist.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٢‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪ ‬‬

‫ﺗﺘﯿﺢ ﻟﻨﺎ اﻟﻠﻐﺔ ‪ PL/SQL‬ﻋﺪد ﻣﻦ اﻟﺪوال اﻟﺘﻲ ﺗﺴﺎﻋﺪﻧﺎ ﻋﻠﻰ ﻣﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات واﻟﺘﻌﺮف ﻋﻠﯿﮭﺎ وھﻲ اﻟﺪوال‪:‬‬
‫‪-SQL CODE‬‬
‫‪- SQL ERRM (SQL Error message).‬‬
‫‪SQL CODE‬‬ ‫‪error number‬‬ ‫* وﺗﻌﻤﻞ اﻟﺪاﻟﺔ ‪ SQL CODE‬ﻋﻠﻰ اﺳﺘﺮﺟﺎع رﻗﻢ اﻻﺳﺘﺜﻨﺎء‬
‫* أﻣﺎ اﻟﺪاﻟﺔ ‪ SQL ERRM‬ﺗﻌﻤﻞ ﻋﻠﻰ إرﺟﺎع اﻟﺮﺳﺎﻟﺔ اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻻﺳﺘﺜﻨﺎء‬
‫‪SQL ERRM‬‬ ‫‪Error message‬‬
‫ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ‪:‬‬

‫ﺗﻮﺿﯿﺢ‬
‫ﻧﻼﺣﻆ إن ﺟﻤﻠﺔ ‪ SELECT‬اﻟﺘﻲ ﺗﻈﮭﺮ ﺑﻌﺪ ‪ BEGIN‬ﺗﺴﺘﺨﺪم ﻟﻌﻤﻞ اﺳﺘﺮﺟﺎع ﻟﻼﺳﻢ اﻷﺧﯿﺮ ﻟﺠﻤﯿﻊ اﻟﻤﻮﻇﻔﯿﻦ‬
‫اﻟﻤﻮﺟﻮدﯾﻦ ﻓﻲ اﻟﺠﺪول ‪ Employees‬ووﺿﻊ ﻧﺎﺗﺞ ھﺬه اﻟﺠﻤﻠﺔ ﻓﻲ اﻟﻤﺘﻐﯿﺮ ‪ V_ename‬وﺑﺎﻟﻄﺒﻊ ﺳﻮف ﺗﻌﻤﻞ ھﺬه‬
‫اﻟﺠﻤﻠﺔ ﻋﻠﻰ إﻇﮭﺎر اﺳﺘﺜﻨﺎء ﻣﻌﯿﻦ ﻟﻠﺘﻌﺒﯿﺮ ﻋﻦ ھﺬا اﻟﺨﻄﺄ وذﻟﻚ ﻻن اﻟﻤﺘﻐﯿﺮ ‪ V_ename‬ﯾﺴﺘﺨﺪم ﻟﺤﻔﻆ ﻗﯿﻤﺔ واﺣﺪة‬
‫ﺑﯿﻨﻤﺎ ﻧﺎﺗﺞ اﻟﺠﻤﻠﺔ ‪ SELECT‬ﻋﺒﺎرة ﻋﻦ ﻋﺪة ﻗﯿﻢ واﻵن ﻧﺮﯾﺪ ﻋﺮض اﺳﻢ اﻻﺳﺘﺜﻨﺎء واﻟﺮﺳﺎﻟﺔ اﻟﺨﺎﺻﺔ ﺑﮫ ﻛﻤﺎ‬
‫ﻧﻼﺣﻆ ﻓﻲ اﻟﺠﺰء ‪ Exception‬ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎء ‪ NO_DATA_FOUND‬وﻟﻤﻌﺎﻟﺠﺔ ﺑﺎﻗﻲ‬
‫اﻻﺳﺘﺜﻨﺎءات ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ OTHERS‬داﺧﻞ اﻟﻌﺒﺎرة ‪ WHEN‬ﺣﯿﺚ ﺗﻘﻮم ﺑﺎﺳﺘﻌﺎدة اﻟﻮﺿﻊ اﻟﺴﺎﺑﻖ‬
‫ﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻋﻦ ﻃﺮﯾﻖ اﻟﺠﻤﻠﺔ ‪ Rollback‬ﺛﻢ ﻧﻘﻮم ﺑﻌﺮض اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻻﺳﺘﺜﻨﺎء ﺑﺎﺳﺘﺨﺪام اﻟﺪوال‬
‫‪ SQL CODE‬و ‪ SQL ERRM‬ﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻤﺜﺎل وﻋﻨﺪ ﺗﺸﻐﯿﻞ ھﺬا اﻟﻜﻮد ﺗﻈﮭﺮ ھﺬه اﻟﺒﯿﺎﻧﺎت‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٣‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﯾﺘﻢ ﻋﺮض رﻗﻢ اﻻﺳﺘﺜﻨﺎء ‪ -1422‬واﻟﺮﺳﺎﻟﺔ اﻟﺨﺎﺻﺔ ﺑﮫ )ﺑﻌﺪ رﻗﻢ اﻻﺳﺘﺜﻨﺎء(‪.‬‬

‫‪User-defined Exceptions‬‬
‫ﻣﻦ أﺣﺪى اﻟﻤﻤﯿﺰات اﻟﺘﻲ ﺗﻤﺘﺎز اﻟﻠﻐﺔ ‪ PL/SQL‬ھﻲ إﻣﻜﺎﻧﯿﺔ اﻟﺴﻤﺎح ﻟﻠﻤﺴﺘﺨﺪﻣﯿﻦ ﺑﻌﻤﻞ اﻻﺳﺘﺜﻨﺎءات ‪Exception‬‬
‫اﻟﺨﺎﺻﺔ ﺑﮭﻢ وﻣﻌﺎﻟﺠﺘﮭﺎ وﯾﺴﻤﻰ ھﺬا اﻟﻨﻮع ﻣﻦ اﻻﺳﺘﺜﻨﺎءات ﺑﺎﻻﺳﻢ ‪:‬‬
‫‪User-defined Exceptions‬‬
‫وﯾﺘﻢ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ھﺬا اﻟﻨﻮع ﻣﻦ اﻻﺳﺘﺜﻨﺎءات ﻣﻦ ﺧﻼل ﺛﻼث ﻣﺮاﺣﻞ‪:‬‬
‫اﻟﻤﺮﺣﻠﺔ اﻷوﻟﻰ ‪ :‬وﺗﺴﺘﺨﺪم ﻟﺘﻌﺮﯾﻒ اﻻﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ‪ Declarative Section‬ﺑﺎﺳﺘﺨﺪام اﻟﺼﯿﻐﺔ ‪:‬‬
‫; ‪Exception_name Exception‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﺳﻢ اﻻﺳﺘﺜﻨﺎء ‪ Exception_name‬ﯾﻠﯿﮭﺎ اﻟﻜﻠﻤﺔ ‪. Exception‬‬
‫اﻟﻤﺮﺣﻠﺔ اﻟﺜﺎﻧﯿﺔ ‪ :‬ﯾﺘﻢ إﻃﻼق أو ﻋﻤﻞ ‪ Raise‬ﻟﻼﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ )‪ Executable Section ( Begin‬وذﻟﻚ‬
‫ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ﻛﻤﺎ ﻓﻲ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪:‬‬
‫;‪Raise Exception_name‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﺠﻤﻠﺔ ‪ Raise‬ﯾﻠﯿﮭﺎ اﻻﺳﻢ اﻟﺬي ﻗﻤﻨﺎ ﺑﺘﻌﯿﯿﻨﮫ ﻟﻼﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ ‪.Declarative‬‬
‫اﻟﻤﺮﺣﻠﺔ اﻟﺜﺎﻟﺜﺔ ‪ :‬ﯾﺘﻢ ﻓﯿﮭﺎ ﻣﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎء وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ WHEN‬ﻛﻤﺎ ﻓﻲ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪:‬‬
‫‪Exception‬‬
‫‪WHEN Exception_name THEN‬‬
‫;‪Statement 1‬‬
‫;‪Statement 1‬‬
‫…………‬
‫ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل إﺟﺒﺎر اﻟﻤﺴﺘﺨﺪم ﻋﻠﻰ إدﺧﺎل اﺳﻢ ﯾﺒﺪأ ﺑﺎﻟﺤﺮف ‪ X‬ﻓﻘﻂ ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٤‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻒ اﺳﺘﺜﻨﺎء ﻟﮫ اﻻﺳﻢ ‪ invalid_id‬ﻓﻲ اﻟﻘﺴﻢ ‪ Declare‬وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ‬ ‫ﺗﻮﺿﯿﺢ‬
‫اﻧﮫ ﯾﺠﺐ إﻃﻼق أو ﻋﻤﻞ ‪ Raise‬ﻟﻼﺳﺘﺜﻨﺎء ﻓﻲ اﻟﺠﺰء ‪ (Begin) Executable Section‬وﻟﻜﻦ ﻗﺒﻞ ﻋﻤﻞ ھﺬه‬
‫اﻟﺨﻄﻮة ﯾﺠﺐ ﺗﺤﺪﯾﺪ اﻟﺸﺮط اﻟﺬي ﺳﯿﺘﻢ أﻃﻼق اﻻﺳﺘﺜﻨﺎء ﺑﻨﺎءاً ﻋﻠﯿﮫ ‪.‬ﻟﺬﻟﻚ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ اﻟﺸﺮﻃﯿﺔ ‪ IF‬ﻻﺧﺘﺒﺎر‬
‫ھﻞ اﻟﺤﺮف اﻷول اﻟﺬي ﺗﻢ إدﺧﺎﻟﮫ ھﻮ ﺣﺮف ‪ X‬أم ﻻ ﻓﺈذا ﻛﺎن أول ﺣﺮف ﻟﻼﺳﻢ اﻟﺬي ﺗﻢ إدﺧﺎﻟﮫ ھﻮ ‪ X‬ﯾﺘﻢ إھﻤﺎل ﺗﻨﻔﯿﺬ‬
‫اﻟﺠﻤﻠﺔ ‪ IF‬وﯾﺘﻢ ﻋﺮض اﻻﺳﻢ اﻟﺬي ﻗﺎم اﻟﻤﺴﺘﺨﺪم ﺑﺈدﺧﺎﻟﮫ‪:‬‬
‫;)‪DBMS_Output.put_Line(id_value‬‬
‫أﻣﺎ إذا ﻛﺎن أول ﺣﺮف ﻟﻼﺳﻢ ھﻮ أي ﺣﺮف ﻏﯿﺮ اﻟﺤﺮف ‪ X‬ﻓﯿﺘﻢ ﺗﻨﻔﯿﺬ اﻟﺠﻤﻠﺔ ‪ IF‬وھﻲ ﻋﺒﺎرة ﻋﻦ ﻋﻤﻞ أو إﻃﻼق‬
‫ﻟﻼﺳﺘﺜﻨﺎء وﻓﻲ ھﺬه اﻟﺠﻤﻠﺔ ﯾﺘﻢ اﻟﺨﺮوج ﻣﻦ اﻟﺠﺰء ‪ ( Begin) Executable‬وﯾﺘﻢ اﻻﻧﺘﻘﺎل إﻟﻰ اﻟﺠﺰء ‪Exception‬‬
‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎء ‪ invalid_id‬داﺧﻞ اﻟﻌﺒﺎرة ‪ WHEN‬وذﻟﻚ ﻹﻇﮭﺎر ھﺬه اﻟﺠﻤﻠﺔ ﻋﻨﺪ وﻗﻮع ھﺬا‬
‫اﻻﺳﺘﺜﻨﺎء‪:‬‬
‫;)'……‪DBMS_Output.put_Line('The id must start with X‬‬
‫**************************************************************‬

‫‪   ‬‬

‫ﺗﺴﺘﺨﺪم ھﺬه اﻟﺘﻘﻨﯿﺔ ﻟﺴﻤﺎح ﻟﺒﯿﺌﺎت اﻟﺘﺸﻐﯿﻞ اﻟﻤﺨﺘﻠﻔﺔ ﻣﺜﻞ‪:‬‬


‫‪Calling Environment‬‬

‫‪Oracle Developer Tools‬‬ ‫‪iSQL‬‬ ‫‪SQL‬‬

‫ﺑﻤﻌﺎﻟﺠﺔ ھﺬه اﻻﺳﺘﺜﻨﺎءات ﺣﯿﺚ ﺗﻘﻮم ﻛﻞ ﺑﯿﺌﺔ ﻣﻦ ﺑﯿﺌﺎت اﻟﺘﺸﻐﯿﻞ ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات ﺑﻄﺮﯾﻘﺔ ﻣﺨﺘﻠﻔﺔ ﻓﻌﻨﺪ ﻗﯿﺎم‬
‫اﻟﻘﺎﻟﺐ اﻟﻔﺮﻋﻲ ‪ Sub Block‬ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎء ﯾﺘﻢ إﻧﮭﺎء اﻟﻘﺎﻟﺐ اﻟﻔﺮﻋﻲ ﺑﺼﻮرة ﻃﺒﯿﻌﯿﺔ وﯾﺘﻢ اﻧﺘﻘﺎل اﻟﺘﻨﻔﯿﺬ إﻟﻰ‬
‫اﻟﻘﺎﻟﺐ اﻟﻔﺮﻋﻲ اﻷﺑﻮي ﻟﻠﻘﺎﻟﺐ اﻟﺤﺎﻟﻲ ﺑﻌﺪ اﻟﺠﻤﻠﺔ ‪ END‬اﻟﺨﺎﺻﺔ ﺑﺎﻟﻘﺎﻟﺐ اﻟﻔﺮﻋﻲ اﻟﺤﺎﻟﻲ ﻣﺒﺎﺷﺮة ً‪ .‬أﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﻗﯿﺎم‬
‫اﻟﻠﻐﺔ ‪ PL/SQL‬ﺑﺈﻃﻼق اﻻﺳﺘﺜﻨﺎء وﻋﺪم اﺣﺘﻮاء اﻟﻘﺎﻟﺐ اﻟﺤﺎﻟﻲ ﻋﻠﻰ اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﻤﻌﺎﻟﺠﺔ ھﺬا اﻻﺳﺘﺜﻨﺎء ﻓﯿﺘﻢ‬
‫اﻧﺘﻘﺎل اﻻﺳﺘﺜﻨﺎء إﻟﻰ اﻟﻘﺎﻟﺐ اﻷﺑﻮي ﻟﻠﻘﺎﻟﺐ اﻟﺤﺎﻟﻲ ﻓﺈذا ﻟﻢ ﯾﺘﻢ إﯾﺠﺎد اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﻤﻌﺎﻟﺠﺔ ھﺬا اﻻﺳﺘﺜﻨﺎء ﯾﺘﻢ اﻻﻧﺘﻘﺎل‬
‫إﻟﻰ اﻟﻘﺎﻟﺐ اﻷﺑﻮي اﻟﺘﺎﻟﻲ وھﻜﺬا ﺣﺘﻰ ﺗﺼﻞ إﻟﻰ اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﮭﺬا اﻻﺳﺘﺜﻨﺎء ‪ .‬وﻓﻲ ﺣﺎﻟﺔ ﻋﺪم اﺣﺘﻮاء أي ﻣﻦ ھﺬه‬
‫اﻟﻘﻮاﻟﺐ ﻋﻠﻰ اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﻤﻌﺎﻟﺠﺔ ھﺬا اﻻﺳﺘﺜﻨﺎء ﻓﯿﻨﺘﺞ ﻣﺎﯾﺴﻤﻰ ‪ Unhandled Exception‬ﻓﻲ ﺑﯿﺌﺔ‬
‫اﻟﺘﺸﻐﯿﻞ ﺣﯿﺚ ﺗﻈﮭﺮ رﺳﺎﻟﺔ ﺧﻄﺄ وﯾﺘﻢ اﻟﺨﺮوج ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ ﺑﺼﻮرة ﻏﯿﺮ ﻃﺒﯿﻌﯿﺔ ‪ .‬وﯾﺠﺐ ﻣﻼﺣﻈﺔ أﻧﮫ ﻋﻨﺪ اﻧﺘﻘﺎل‬
‫اﻻﺳﺘﺜﻨﺎء إﻟﻰ اﻟﻘﺎﻟﺐ اﻷﺑﻮي ﻓﺈﻧﮫ ﯾﺘﻢ إھﻤﺎﻟﮫ ﻓﻲ ﺑﺎﻗﻲ اﻟﻜﻮد اﻟﻘﺴﻢ ‪ Executable Section‬اﻟﺨﺎص ﺑﮭﺬا اﻟﻘﺎﻟﺐ‬
‫وﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء ‪:‬‬
‫‪Raise_Application_Error‬‬
‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٥‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﯾﻤﻜﻨﻨﺎ ﺗﺠﻨﺐ اﻟﻮﺻﻮل إﻟﻰ اﻟﺤﺎﻟﺔ ‪ Unhandled Exception‬وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ إﺻﺪار ﺗﻘﺮﯾﺮ ﺑﺎﻟﺨﻄﺄ اﻟﺬي ﺣﺪث‬
‫ﻓﻲ ﺑﯿﺌﺔ اﻟﻌﻤﻞ‪ .‬ﺣﯿﺚ ﯾﻌﻤﻞ ھﺬا اﻷﺟﺮاء ﻋﻠﻰ اﻟﺘﻔﺎﻋﻞ ﻣﻊ اﻻﺳﺘﺜﻨﺎءات ﺳﺎﺑﻘﺔ اﻟﺘﻌﺮﯾﻒ ‪Predefined Exception‬‬
‫ﻋﻦ ﻃﺮﯾﻖ ﺗﻘﺪﯾﻢ رﻗﻢ ﻛﻮد ورﺳﺎﻟﺔ ﺧﻄﺄ ﻏﯿﺮ ﻗﯿﺎﺳﯿﯿﻦ‪:‬‬
‫‪Error Number‬‬
‫‪Error message‬‬
‫ﯾﺘﻢ ﺗﻌﺮﯾﻔﮭﻤﺎ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻟﻠﺘﻌﺒﯿﺮ ﻋﻦ ھﺬا اﻟﺨﻄﺄ وذﻟﻚ ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ‪:‬‬
‫;)]}‪Raise_Application_Error ( error_number,error_message[.,{true | false‬‬
‫( ﺣﯿﺚ‬ ‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ ‪ Raise_Application_Error‬ﯾﻠﯿﮭﺎ ﻋﺪد ﻣﻦ اﻟﻤﻌﻄﯿﺎت ﺑﯿﻦ ﻗﻮﺳﯿﻦ )‬
‫ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺘﻌﯿﯿﻦ رﻗﻢ اﻟﺨﻄﺄ ﻟﻠﻤﻌﻄﻰ اﻷول ‪ Error_number‬وﻻﺑﺪ أن ﯾﺘﺮا وح رﻗﻢ ھﺬا اﻟﺨﻄﺄ ﻣﺎ ﺑﯿﻦ‬
‫)‪ ( -20999 : -20000‬وﻓﻲ اﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ‪ Error_message‬ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺘﺤﺪﯾﺪ اﻟﺮﺳﺎﻟﺔ اﻟﺘﻲ ﯾﺮﯾﺪ ﺗﻌﯿﯿﻨﮭﺎ‬
‫ﻟﮭﺬا اﻟﺨﻄﺄ‪ .‬أﻣﺎ اﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ﻓﮭﻮ ﻋﺒﺎرة ﻋﻦ ﻗﯿﻤﺔ ﻣﻨﻄﻘﯿﺔ وھﻲ أﺣﺪى اﻟﻘﯿﻤﺘﯿﻦ ‪ True or false‬ﻓﻌﻨﺪ وﺿﻊ‬
‫ﻗﯿﻤﺔ ھﺬا اﻟﻤﻌﻄﻰ ‪ True‬ﯾﺘﻢ إﺿﺎﻓﺔ ھﺬه اﻟﺮﺳﺎﻟﺔ اﻟﻰ ﻗﺎﺋﻤﺔ رﺳﺎﺋﻞ اﻟﺨﻄﺄ اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﺬاﻛﺮة‪.‬وﻋﻨﺪ وﺿﻊ ﻗﯿﻤﺔ‬
‫اﻟﻤﻌﻄﻰ ‪ False‬ﯾﺘﻢ اﺳﺘﺒﺪال ﺟﻤﯿﻊ اﻟﺮﺳﺎﺋﻞ اﻟﺨﻄﺄ اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﺬاﻛﺮة ﺑﮭﺬه اﻟﺮﺳﺎﻟﺔ وﻧﺬﻛﺮ ھﻨﺎ أﻧﮫ ﯾﻤﻜﻦ اﺳﺘﺨﺪام‬
‫ھﺬا اﻹﺟﺮاء ﻓﻲ أي ﻣﻦ اﻷﻗﺴﺎم‪:‬‬
‫‪-Executable‬‬
‫‪OR‬‬
‫‪-Exception‬‬
‫ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٦‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺗﻮﺿﯿﺢ‬

‫ﯾﺘﻢ إﻇﮭﺎر رﺳﺎﻟﺔ ﺧﻄﺄ ﻓﻲ ﺣﺎﻟﺔ ﻋﺪم اﺳﺘﺮﺟﺎع أي ﺑﯿﺎﻧﺎت ﻣﻦ اﻟﺠﻤﻠﺔ ‪ SELECT‬وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ اﻻﺳﺘﺜﻨﺎء‬
‫‪ NO_DATA_FOUND‬ﺑﺮﺳﺎﻟﺔ اﻟﺨﻄﺄ اﻟﺘﻲ ﺗﻢ إﻧﺸﺎﺋﮭﺎ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء‪:‬‬
‫‪Raise_Application_Error‬‬
‫ﻓﻌﻨﺪ ﺗﺸﻐﯿﻞ اﻟﺒﺮﻧﺎﻣﺞ أو ﺗﻨﻔﯿﺬه ﺗﻈﮭﺮ اﻟﻌﺒﺎرة اﻟﺘﺎﻟﯿﺔ‪:‬‬
‫‪Enter Value for Sv_employee_id : 85‬‬
‫وذﻟﻚ ﻋﻨﺪ إدﺧﺎل رﻗﻢ ﻏﯿﺮ ﻣﻮﺟﻮد ﻟﻠﻤﻮﻇﻒ ﻓﻲ اﻟﺠﺪول وﻟﯿﻜﻦ ‪ 85‬ﺛﻢ اﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح‪ Enter‬ﻧﻼﺣﻆ ﻇﮭﻮر رﻗﻢ‬
‫ورﺳﺎﻟﺔ اﻟﺨﻄﺄ اﻟﺘﻲ ﺗﻢ ﺗﻌﯿﯿﻨﮭﺎ ﻛﻤﻌﻄﯿﺎت ﻟﻺﺟﺮاء ‪.Raise_Application_Error‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٧‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪‬‬ ‫‪Procedures ‬‬ ‫‪‬‬

‫‪ Sub-programs‬‬
‫‪ ‬‬
‫اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ‪ :‬ﻋﺒﺎرة ﻋﻦ ﻗﺎﻟﺐ ‪ PL/SQL‬ﻟﮭﺎ أﺳﻢ ﻣﺤﺪد وﺗﺴﻤﺢ ﺑﺘﻤﺮﯾﺮ اﻟﻤﻌﻄﯿﺎت ‪ Parameters‬ﻟﮭﺎ وﺗﻮﺟﺪ‬
‫ﻧﻮﻋﺎن ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ھﻤــــﺎ‪:‬‬
‫‪ -‬اﻹﺟﺮاءات ‪Procedure‬‬
‫‪ -‬اﻟﺪوال ‪Function‬‬
‫وﯾﺘﻢ اﺳﺘﺪﻋﺎء اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻣﻦ أي ﺑﯿﺌﺔ ﺗﺸﻐﯿﻞ واﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻟﮭﺎ ﻧﻔﺲ اﻟﮭﯿﻜﻞ اﻟﺒﻨﺎﺋﻲ ﻟﻘﻮاﻟﺐ اﻟﻠﻐﺔ ‪PL/SQL‬‬
‫ﺣﯿﺚ ﺗﺘﻜﻮن ﻣﻦ ﺛﻼﺛﺔ أﻗﺴﺎم وھﻲ‪:‬‬
‫‪-Declarative section‬‬
‫‪-Executable section‬‬
‫‪-Exception section‬‬
‫وﺗﺘﻤﯿﺰ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺑﺎﻟﻌﺪﯾﺪ ﻣﻦ اﻟﺨﺼﺎﺋﺺ واﻹﻣﻜﺎﻧﺎت ﻣﺜﻞ إﻣﻜﺎﻧﯿﺔ ﺗﻘﺴﯿﻢ اﻟﺒﺮﻧﺎﻣﺞ إﻟﻰ ﻗﻄﻊ ﺑﺮﻣﺠﯿﺔ ﺻﻐﯿﺮة‬
‫‪ Modularization‬واﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ إﻛﺴﺎب اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻣﯿﺰة أﺧﺮى وھﻲ إﻋﺎدة اﺳﺘﺨﺪام أي ﻗﻄﻌﺔ ﺑﺮﻣﺠﯿﺔ‬
‫ﺳﻮاءً ﻓﻲ ﻧﻔﺲ اﻟﺒﺮﻧﺎﻣﺞ أو ﻓﻲ ﺑﺮاﻣﺞ أﺧﺮى ‪ Reusability‬ﻛﻤﺎ ﺗﺘﯿﺢ أﯾﻀﺎ ﺳﮭﻮﻟﺔ اﻟﺼﯿﺎﻧﺔ وﺗﺤﺪﯾﺚ اﻟﺒﺮاﻣﺞ‬
‫‪ Maintain‬وﺗﺘﺒﻊ اﻷﺧﻄﺎء ‪ Debug‬ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ ذﻟﻚ ﻓﺈﻧﮭﺎ ﺗﺘﯿﺢ أﻣﻜﺎﻧﯿﺔ اﻛﺘﺴﺎب ﺑﻌﺾ اﻟﺼﻔﺎت اﻟﺨﺎﺻﺔ ﺑﺒﺮاﻣﺞ‬
‫أﺧﺮى وھﻮ ﻣﺎﯾﺴﻤﻰ ‪ Extensibility‬اﻟﻰ آﺧﺮه ﻣﻦ ﻣﺰاﯾﺎ اﻟﻠﻐﺎت اﻟﺒﺮﻣﺠﺔ اﻹﺟﺮاﺋﯿﺔ وﯾﻜﻤﻦ اﻟﻔﺮق ﺑﯿﻦ اﻟﺒﺮاﻣﺞ‬
‫اﻟﻔﺮﻋﯿﺔ ‪ Sub-program‬واﻟﻘﺎﻟﺐ ‪ PL/SQL Block‬ﻓﻲ أن اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻻﺑﺪ أن ﯾﻜﻮن ﻟﮭﺎ أﺳﻢ ﻣﺤﺪد‪.‬‬
‫وﯾﻨﻘﺴﻢ اﻟﺘﻜﻮﯾﻦ اﻷﺳﺎﺳﻲ ﻟﻠﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﻰ ﻗﺴﻤﯿﻦ أﺳﺎﺳﯿﻦ ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ اﻟﺘﺎﻟﻲ‪:‬‬
‫>‪<header‬‬
‫‪Sub-program Specification‬‬ ‫]‪[1‬‬
‫‪IS / AS‬‬
‫‪Declaration section‬‬
‫‪Begin‬‬
‫‪Executable section‬‬ ‫]‪Sub-program Body [2‬‬
‫‪Exception‬‬ ‫)‪(optional‬‬
‫‪Exception section‬‬
‫;‪End‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٨‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫اﻷول ‪ :‬ﯾﺤﺘﻮي ﻋﻠﻰ >‪ <header‬وﯾﺴﺘﺨﺪم ھﺬا اﻟﺠﺰء ﻟﺘﺤﺪﯾﺪ ‪:‬‬
‫ﻧﻮع اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ﺳﻮاء ﻛﺎن إﺟﺮاء ‪ Procedure‬أو وﻇﯿﻔﺔ ‪. Function‬‬ ‫‪-‬‬
‫‪ -‬اﺳﻢ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‪.‬‬
‫‪ -‬ﻗﺎﺋﻤﺔ اﻟﻤﻌﻄﯿﺎت ‪. Parameters‬‬
‫‪ -‬اﻟﻌﺒﺎرة ‪ Return‬وذﻟﻚ ﻓﻲ ﺣﺎﻟﺔ اﻟﻮﻇﺎﺋﻒ ‪ Function‬ﻓﻘﻂ ‪.‬‬
‫ﯾﻠﻲ ھﺬا اﻟﺠﺰء اﻟﻜﻠﻤﺔ ‪ IS / AS‬وھﻲ أﺳﺎﺳﯿﺔ ﻹﻧﺸﺎء اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ‪.‬‬
‫اﻟﺜﺎﻧﻲ ‪ Sub-program Body :‬وھﻮ ﻣﻘﺴﻢ إﻟﻰ ﺛﻼﺛﺔ أﻗﺴﺎم ‪:‬‬
‫‪ – [1‬اﻟﻘﺴﻢ اﻷول وھﻮ اﻟﻘﺴﻢ ‪ Declaration Section‬وﯾﻘﻊ ﺑﯿﻦ اﻟﻜﻠﻤﺔ ‪ IS / AS‬واﻟﻜﻠﻤﺔ ‪. Begin‬‬
‫‪ – [2‬اﻟﻘﺴﻢ اﻟﺜﺎﻧﻲ وھﻮ ‪ Executable Section‬وﯾﻘﻊ ﺑﯿﻦ اﻟﻜﻠﻤﺔ ‪ Begin‬واﻟﻜﻠﻤﺔ ‪ End‬وھﻮ ﻣﻦ اﻷﻗﺴﺎم‬
‫اﻷﺳﺎﺳﯿﺔ ﻟﻺﻧﺸﺎء اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻟﺬﻟﻚ ﻻﺑﺪ ﻣﻦ اﺣﺘﻮاء ھﺬا اﻟﻘﺴﻢ ﻋﻠﻰ ﺟﻤﻠﺔ ﺗﻨﻔﯿﺬﯾﺔ واﺣﺪة ﻋﻠﻰ اﻷﻗﻞ‪.‬‬
‫‪ – [3‬اﻟﻘﺴﻢ اﻟﺜﺎﻟﺚ ‪ Exception Section‬وﯾﻘﻊ ﺑﯿﻦ اﻟﻜﻠﻤﺔ ‪ Exception‬واﻟﻜﻠﻤﺔ ‪ End‬وھﻮ ﻗﺴﻢ اﺧﺘﯿﺎري ﯾﺘﻢ‬
‫ﻓﯿﮫ ﻣﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات اﻟﺘﻲ ﻗﺪ ﺗﻨﺘﺞ ﻋﻨﺪ ﺗﺸﻐﯿﻞ اﻟﺒﺮﻧﺎﻣﺞ ‪.‬‬

‫‪ ISQL * Plus‬‬

‫ﺗﻌﺘﺒﺮ اﻷداة ‪ iSQL * plus‬أﺣﺪى إﺻﺪارات اﻷداة ‪ SQL * plus‬واﻟﺘﻲ ﺗﻢ ﺑﻨﺎﺋﮭﺎ ﻟﻠﻌﻤﻞ ﻣﻦ ﺧﻼل ﻣﺘﺼﻔﺤﺎت‬
‫اﻹﻧﺘﺮﻧﺖ ﺣﯿﺚ ﺗﻤﻜﻨﻨﺎ ﻣﻦ اﻻﺗﺼﺎل ﺑﺨﺎدم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ Oracle Database server‬ﻛﻤﺎ ﺗﺴﻤﺢ ﻟﻨﺎ ﺑﺎﻟﻘﯿﺎم‬
‫ﺑﺠﻤﯿﻊ إﺟﺮاءات اﻟﺘﻲ ﯾﻤﻜﻦ ﻋﻤﻠﮭﺎ ﻣﻦ ﺧﻼل اﻷداة ‪ iSQL * plus‬ﻧﻘﻮم اوﻷً ﺑﺎﺳﺘﺨﺪام أي ﺑﺮﻧﺎﻣﺞ ﻟﻜﺘﺎﺑﺔ اﻟﻤﻠﻒ‬
‫‪ Script‬وﻟﯿﻜﻦ اﻟﺒﺮﻧﺎﻣﺞ ‪ Notepad‬ﺛﻢ ﻧﻘﻮم ﺑﺘﻌﺮﯾﻒ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ اﻟﻤﺮاد ﺗﻨﻔﯿﺬه وﻧﻘﻮم ﺑﺈﻧﺸﺎء إﺟﺮاء ﯾﻌﻤﻞ‬
‫ﻋﻠﻰ إﺿﺎﻓﺔ ﺳﺠﻞ ﻣﻜﻮن ﻣﻦ أﺳﻢ اﻟﻤﺴﺘﺨﺪم وﺗﺎرﯾﺦ اﻟﯿﻮم ﺣﺴﺐ ﺗﺎرﯾﺦ اﻟﺠﮭﺎز ﻓﻲ اﻟﺠﺪول ﻟﮫ اﺳﻢ ‪ Log_table‬ﺛﻢ‬
‫ﻧﻘﻮم ﺑﺤﻔﻆ اﻟﻤﻠﻒ ‪.‬‬
‫ﻛﻮد ﻹﻧﺸﺎء إﺟﺮاء ‪:‬‬

‫ﺛﻢ ﻧﻘﻮم ﺑﻔﺘﺢ اﻷداة ‪) iSQL * plus‬أوراﻛﻞ ‪ . ( 10g‬ﺛﻢ ﻧﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح ‪ Load Script‬ﻓﯿﺘﻢ ﻋﺮض‬
‫اﻟﺼﻔﺤﺔ ‪ Load Script‬وﺑﺎﺳﺘﺨﺪام اﻟﻤﻔﺘﺎح ‪ Browse‬ﻧﻘﻮم ﺑﺘﺤﺪﯾﺪ اﻟﻤﻠﻒ ‪ Script‬وھﻮ‬
‫‪ Log_execution.txt‬اﻟﺬي ﺗﻢ ﺣﻔﻈﮫ ﻣﺴﺒﻘﺎ ﺑـــ ‪ Notepad‬ﺛﻢ ﻧﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح ‪ Load‬ﻓﻨﻼﺣﻆ إﻧﮫ ﺗﻢ‬
‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٩‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫إﺿﺎﻓﺔ ﻣﺤﺘﻮﯾﺎت اﻟﻤﻠﻒ ﻓﻲ اﻟﺠﺰء ‪ Work Space‬وﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح ‪ Execute‬ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ وﺗﻈﮭﺮ‬
‫اﻟﺠﻤﻠﺔ ‪ . Procedure Created‬ﻛﻤﺎ ﯾﻤﻜﻦ إﻧﺸﺎء اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺑﺎﺳﺘﺨﺪام أدوات اﻟﺘﻄﻮﯾﺮ ‪Development‬‬
‫‪ Tools‬ﻣﺜﻞ اﻷداة ‪:‬‬
‫‪Oracle forms‬‬

‫‪Procedures‬‬

‫ﻋﺒﺎرة ﻋﻦ ﻧﻮع ﻣﻦ أﻧﻮاع اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺗﻌﻤﻞ ﻋﻠﻰ أداء إﺟﺮاء ﻣﻌﯿﻦ ﺣﯿﺚ ﯾﺘﻢ ﺗﺮﺟﻤﺘﮭﺎ وﺗﺨﺰﯾﻨﮭﺎ ﻓﻲ ﺧﺎدم ﻗﻮاﻋﺪ‬
‫اﻟﺒﯿﺎﻧﺎت ‪ Oracle Server‬ﻛﻤﺎ أﻧﮭﺎ ﺗﺴﻤﺢ ﺑﺎﺳﺘﻘﺒﺎل اﻟﻤﻌﻄﯿﺎت ‪ Parameters‬ﺣﯿﺚ ﯾﻤﻜﻦ اﺳﺘﺪﻋﺎﺋﮭﺎ ﻣﻦ أي ﺑﯿﺌﺔ‬
‫ﺗﺸﻐﯿﻠﯿﺔ ‪ .‬وﻣﻦ أھﻢ ﻣﺰاﯾﺎ اﻹﺟﺮاءات‪- :‬‬
‫‪ -١‬أﻋﺎدة اﻻﺳﺘﺨﺪام ‪. Reusability‬‬
‫‪ -٢‬ﺳﮭﻮﻟﺔ اﻟﺼﯿﺎﻧﺔ ‪. Maintainability‬‬
‫وﺗﺄﺧﺬ اﻹﺟﺮاءات ﻧﻔﺲ اﻟﺒﻨﺎء اﻟﮭﯿﻜﻠﻲ ﻟﻠﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺣﯿﺚ ﺗﻨﻘﺴﻢ إﻟﻰ ﻗﺴﻤﯿﻦ‪:‬‬
‫‪ -١‬اﻟﻘﺴﻢ ‪ Procedure Specification‬واﻟﺬي ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﺠﺰء >‪ <header‬ﯾﻠﯿﮫ اﻟﻜﻠﻤﺔ ‪. IS/AS‬‬
‫‪ -٢‬اﻟﻘﺴﻢ ‪ Procedure Body‬واﻟﻤﻜﻮﻧﺔ ﻣﻦ اﻷﻗﺴﺎم ‪:‬‬
‫‪-Declarative section‬‬
‫‪-Executable section‬‬
‫‪-Exception section‬‬
‫ﻛﻤﺎ ﻓﻲ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ ‪:‬‬

‫>‪<header‬‬
‫‪Sub-program Specification‬‬ ‫]‪[1‬‬
‫‪IS / AS‬‬
‫‪Declaration section‬‬
‫‪Begin‬‬
‫‪Executable section‬‬ ‫]‪Sub-program Body [2‬‬
‫‪Exception‬‬ ‫)‪(optional‬‬
‫‪Exception section‬‬
‫;‪End‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٢٠‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫وﻹﻧﺸﺎء اﻹﺟﺮاءات ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ ‪:‬‬
‫‪CREATE [OR REPLACE] PROCEDURE Procedure_name‬‬
‫])‪[(parameter 1 [Mode 1]data type 1, parameter 2 [Mode 2]data type 2,……….‬‬
‫‪IS / AS‬‬
‫; ‪PL/SQL Block‬‬ ‫ﻣﺠﻤﻮﻋﺔ اﻟﺠﻤﻞ‬
‫ﺣﯿﺚ ﺗﺒﺪأ ھﺬه اﻟﺠﻤﻠﺔ ﺑﺎﻟﻜﻠﻤﺔ ‪ Create‬ﯾﻠﯿﮭﺎ اﻟﻜﻠﻤﺔ ]‪ [OR REPLACE‬وھﻲ ﺟﻤﻠﺔ اﺧﺘﯿﺎرﯾﺔ ﺗﻌﻤﻞ ﻋﻠﻰ اﺳﺘﺒﺪال‬
‫اﻷﺟﺮاء إذا ﻛﺎن ﻣﻮﺟﻮداً ﺑﺎﻟﻔﻌﻞ ﺛﻢ اﻟﻜﻠﻤﺔ ‪ Procedure‬ﯾﻠﯿﮫ اﻻﺳﻢ اﻟﺬي ﻧﺮﯾﺪ ﺗﻌﯿﯿﻨﮫ ﻟﮭﺬا اﻷﺟﺮاء‬
‫‪ Procedure_name‬ﺛﻢ ﯾﺘﻢ ﺗﻌﺮﯾﻒ ﻣﺠﻤﻮﻋﺔ ﻣﻌﻄﯿﺎت ‪ parameters‬اﻟﺘﻲ ﻧﺮﯾﺪ ﺗﻤﺮﯾﺮھﺎ ﻟﻸﺟﺮاء ﺑﯿﻦ ) ﻗﻮﺳﯿﻦ(‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﺳﻢ اﻟﻤﻌﻄﻰ ﯾﻠﯿﮫ أﺳﻠﻮب اﻟﺘﻤﺮﯾﺮ اﻟﺬي ﻧﺮﯾﺪ ﺗﻌﯿﯿﻨﮫ ﻟﮭﺬا اﻟﻤﻌﻄﻰ ]‪ [mode 1,2‬وھﻮ أﺧﺘﯿﺎري وﯾﻤﻜﻦ‬
‫أن ﯾﻜﻮن أﺳﻠﻮب اﻟﺘﻤﺮﯾﺮ أﺣﺪى ﺛﻼﺛﺔ ﻗﯿﻢ وھــــــــــﻲ‪:‬‬
‫‪ IN-‬وھﻮ اﻷﺳﻠﻮب اﻻﻓﺘﺮاﺿﻲ ﻟﻠﻤﻌﻄﯿﺎت‬
‫‪OUT-‬‬
‫‪IN OUT-‬‬
‫وﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ ﺟﻤﯿـــــــــــــ ھﺬه اﻷﺳﺎﻟﯿﺐ ﺑﺎﻟﺘﻔﺼﯿﻞ ﻓﯿﻤﺎ ﺑﻌﺪ ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــﻊ ‪.....‬‬
‫وﺑﻌﺪ ﺗﺤﺪﯾﺪ أﺳﻠﻮب اﻟﺘﻤﺮﯾﺮ ﯾﺘﻢ ﺗﺤﺪﯾﺪ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ﻟﻠﻤﻌﻄﻰ وﯾﻤﻜﻦ أن ﯾﻜﻮن ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Data type‬ﻣﻦ اﻟﻨﻮع ‪:‬‬
‫‪Composite‬‬
‫‪OR‬‬ ‫‪Sector‬‬
‫ﻛﻤﺎ ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﺨﻮاص ‪:‬‬
‫‪% Type‬‬
‫‪% RowType‬‬
‫وﯾﺘﻢ اﻟﻔﺼﻞ ﺑﯿﻦ اﻟﻤﻌﻄﯿﺎت ﺑﺎﺳﺘﺨﺪام اﻟﻔﺎﺻﻠﺔ ﻛﻮﻣﺎ )‪ ( ,‬وﺑﻌﺪ اﻻﻧﺘﮭﺎء ﻣﻦ ﺗﻌﺮﯾﻒ ﺟﻤﯿﻊ اﻟﻤﻌﻄﯿﺎت ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﻜﻠﻤﺔ‬
‫‪ IS/AS‬ﯾﻠﯿﮭﺎ ﻣﺠﻤﻮﻋﺔ اﻟﺠﻤﻞ اﻟﺘﻲ ﯾﻤﻜﻦ اﺳﺘﺨﺪاﻣﮭﺎ ; ‪PL/SQL Block‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٢١‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Parameters  ‬‬
‫ﺗﻨﻘﺴﻢ اﻟﻤﻌﻄﯿﺎت اﻟﻰ ﻗﺴﻤﯿﻦ ‪:‬‬
‫‪ -١‬ﻣﻌﻄﯿﺎت رﺳﻤﯿﺔ ‪Formal Parameters‬‬
‫‪ -٢‬ﻣﻌﻄﯿﺎت ﻓﻌﻠﯿﺔ ‪Actual Parameters‬‬
‫واﻟﻤﻌﻄﯿﺎت اﻟﺮﺳﻤﯿﺔ ‪ :‬ھﻲ اﻟﻤﻌﻄﯿﺎت اﻟﺘﻲ ﯾﺘﻢ ﺗﺤﺪﯾﺪھﺎ ﻋﻨﺪ ﺗﻌﺮﯾﻒ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ‪ Sub-program‬ﻓﻲ ﻗﺎﺋﻤﺔ‬
‫اﻟﻤﺘﻐﯿﺮات ‪ Parameter List‬اﻟﺨﺎﺻﺔ ﺑﺎﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ‪:‬‬
‫‪Create Or Replace Procedure find_name‬‬
‫)‪(id number ,v_name varchar2‬‬
‫إن ﻛﻞ ﻣﻦ اﻟﻤﻌﻄﯿﺎت ‪ id‬و‪ V_name‬ﻋﺒﺎرة ﻋﻦ ﻣﻌﻄﯿﺎت رﺳﻤﯿﺔ وﯾﺠﺐ ﻣﻼﺣﻈﺔ أﻧﮫ ﻻﺑﺪ ﻣﻦ ﺗﺤﺪﯾﺪ ﻧﻮع اﻟﺒﯿﺎﻧﺎت‬
‫ﻟﮭﺬه اﻟﻤﻌﻄﯿﺎت وﻟﻜﻦ ﺑﺪون ﺗﺤﺪﯾﺪ ﺣﺠﻢ ﻣﺤﺪد ﻟﮭﺎ‪.‬‬
‫أﻣﺎ اﻟﻤﻌﻄﯿﺎت اﻟﻔﻌﻠﯿﺔ ‪ :‬ﻓﮭﻲ اﻟﻤﻌﻄﯿﺎت اﻟﺘﻲ ﯾﺘﻢ ﺗﻤﺮﯾﺮھﺎ ﻟﻸﺟﺮاء ﻋﻨﺪ اﺳﺘﺪﻋﺎءه ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ وﯾﻤﻜﻦ أن ﺗﻜﻮن ھﺬه‬
‫اﻟﻤﻌﻄﯿﺎت ﻋﺒﺎرة ﻋﻦ ﻣﺘﻐﯿﺮات ‪ Variables‬أو ﺗﻌﺒﯿﺮات ‪ . Expressions‬ﺣﯿﺚ ﯾﺘﻢ اﻟﺘﻌﻮﯾﺾ ﻋﻦ ﻗﯿﻢ اﻟﻤﺘﻐﯿﺮات‬
‫وﺣﺴﺎب اﻟﺘﻌﺒﯿﺮات ﺛﻢ ﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻟﻘﯿﻢ اﻟﻨﺎﺗﺠﺔ ﻣﻨﮭﺎ إﻟﻰ اﻟﻤﺘﻐﯿﺮات اﻟﺮﺳﻤﯿﺔ ‪ Formal Parameters‬وﻓﻲ اﻟﻤﺜﺎل‬
‫اﻟﺘﺎﻟﻲ‪:‬‬
‫;)‪Execute find_name (172,name‬‬
‫ﯾﺘﻢ ﺗﻌﯿﯿﻦ ﻣﻌﻄﯿﺎت ﻓﻌﻠﯿﮫ ﻟﻠﻤﻌﻄﯿﺎت اﻟﺮﺳﻤﯿﺔ ﺣﯿﺚ ﯾﺘﻢ ﺗﻤﺮﯾﺮ اﻟﻘﯿﻤﺔ ‪ ١٧٢‬ﻛﻘﯿﻤﺔ ﻟﻠﻤﻌﻄﻰ ‪ id‬وﯾﺘﻢ ﺗﻤﺮﯾﺮ ﻗﯿﻤﺔ‬
‫اﻟﻤﻌﻄﻰ ‪ name‬ﻛﻘﯿﻤﺔ ﻟﻠﻤﻌﻄﻰ ‪ V_name‬وذﻟﻚ أﺛﻨﺎء اﺳﺘﺪﻋﺎء اﻷﺟﺮاء ‪. Calling Sub-program‬‬
‫وﯾﺠﺐ أن ﻧﺄﺧﺬ ﺑﺎﻻﻋﺘﺒﺎر أﻧﮫ ﻻﺑﺪ ﻣﻦ ﻣﻄﺎﺑﻘﺔ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Data type‬اﻟﻤﻮﺟﻮد ﻓﻲ ﻛﻞ ﻣﻦ اﻟﻤﻌﻄﯿﺎت اﻟﺮﺳﻤﯿﺔ‬
‫واﻟﻔﻌﻠﯿﺔ ﻣﻌﺎً ‪.‬‬
‫وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ أﻧﮫ ﯾﻤﻜﻨﻨﺎ ﺗﻌﯿﯿﻦ أﺣﺪى اﻟﺜﻼﺛﺔ اﻷﺳﺎﻟﯿﺐ‪:‬‬
‫‪IN-‬‬
‫‪OUT-‬‬
‫‪IN OUT-‬‬
‫ﻛﺄﺳﺎﻟﯿﺐ ﻟﻠﻤﻌﻄﯿﺎت ﺣﯿﺚ ﯾﻤﻜﻨﻨﺎ ﺗﺤﺪﯾﺪ ﻃﺮﯾﻘﺔ ﻧﻘﻞ اﻟﻘﯿﻢ ﻣﻦ واﻟﻰ ﺑﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ ﻣﻦ ﺧﻼل اﻟﻤﻌﻄﯿﺎت ﻓﺎﻷﺳﻠﻮب ‪:‬‬
‫‪ : IN‬ھﻮ أﺳﻠﻮب اﻓﺘﺮاﺿﻲ ﻟﻠﻤﻌﻄﯿﺎت ﺑﻤﻌﻨﻰ أﻧﮫ أﺳﻠﻮب اﻟﺬي ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮫ ﺗﻠﻘﺎﺋﯿﺎً ﻓﻲ ﺣﺎﻟﺔ ﻋﺪم ﺗﺤﺪﯾﺪ أي أﺳﻠﻮب‬
‫آﺧﺮ وﯾﻌﻤﻞ ھﺬا اﻷﺳﻠﻮب ﻋﻠﻰ ﻧﻘﻞ اﻟﻘﯿﻢ ﻣﻦ ﺑﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ اﻟﻰ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬
‫‪SQL‬‬ ‫‪Sub-program‬‬
‫‪iSQL‬‬
‫وﯾﻌﻤﻞ اﻟﻤﻌﻄﻰ اﻟﺮﺳﻤﻲ ﻓﻲ ھﺬا اﻷﺳﻠﻮب ﻛﻘﯿﻤﺔ ﺛﺎﺑﺘﺔ‬
‫‪Formal parameter‬‬ ‫‪Constant‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٢٢‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫أﻣﺎ اﻟﻤﻌﻄﻰ اﻟﻔﻌﻠﻲ ﻓﯿﻤﻜﻦ أن ﯾﻜﻮن ﻗﯿﻤﺔ ﺑﺴﯿﻄﺔ‬
‫‪Titeral Value‬‬ ‫ﻗﯿﻤﺔ ﺑﺴﯿﻄﺔ‬

‫‪Expression‬‬ ‫ﺗﻌﺒﯿﺮ‬
‫‪Actual parameter‬‬

‫‪Constant‬‬ ‫ﺛﺎﺑﺖ‬

‫‪Initialized variable‬‬ ‫ﻣﺘﻐﯿﺮ‬

‫وﯾﻤﻜﻦ أﯾﻀﺎ ﺗﻌﯿﯿﻦ ﻗﯿﻤﺔ اﻓﺘﺮاﺿﯿﺔ ﻟﮫ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ‪-:‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﯾﺘﻢ ﺗﻌﯿﯿﻦ‬


‫اﻷﺳﻠﻮب ‪ IN‬ﻟﻠﻤﻌﻄﻰ‬
‫‪ P_id‬وﯾﺴﺘﺨﺪم ھﺬا‬
‫اﻹﺟﺮاء ﻟﻌﻤﻞ ﺗﻌﺪﯾﻞ‬
‫ﻟﺮاﺗﺐ اﻟﻤﻮﻇﻒ اﻟﺬي ﯾﺘﻢ‬
‫ﺗﻤﺮﯾﺮ رﻗﻤﮫ ﻛﻤﻌﻄﻰ ﻟﮭﺬا‬
‫اﻷﺟﺮاء وﻟﻼﺳﺘﺪﻋﺎء ھﺬا‬
‫اﻷﺟﺮاء ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ اﻷﻣﺮ‬
‫‪:‬‬
‫;)‪Execute Raise_salary (100‬‬

‫ﯾﻠﯿﮫ اﺳﻢ اﻹﺟﺮاء ﺛﻢ ﺗﻤﺮﯾﺮ رﻗﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﻧﺮﯾﺪ اﻟﺘﻌﺪﯾﻞ راﺗﺒﮫ ﻛﻤﻌﻄﻰ ﻟﮭﺬا اﻹﺟﺮاء‪.‬وﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح‬
‫‪ Enter‬ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻷﺟﺮاء ﻓﺘﻈﮭﺮ اﻟﺮﺳﺎﻟﺔ ‪PL/SQL Procedure successfully Completed:‬‬
‫واﻟﺘﻲ ﺗﺪل ﻋﻠﻰ اﻧﮫ ﺗﻢ ﺗﻨﻔﯿﺬ اﻷﺟﺮاء ‪ .‬وﻟﻼﺳﺘﺪﻋﺎء اﻷﺟﺮاء ﻣﻦ ﺧﻼل إﺟﺮاء آﺧﺮ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﺳﻢ اﻷﺟﺮاء ﯾﻠﯿﮫ‬
‫;)‪Raise_salary(100‬‬ ‫اﻟﻤﻌﻄﯿﺎت ﻣﺒﺎﺷﺮةً ﺑﺪون اﺳﺘﺨﺪام ‪ EXECUTE‬ھﻜﺬا ‪:‬‬
‫اﻷﺳﻠﻮب ‪ : OUT‬ﯾﺘﻢ ﺗﺤﺪﯾﺪه ﻋﻨﺪ إﻧﺸﺎء اﻹﺟﺮاء وﯾﺴﺘﺨﺪم ﻟﻨﻘﻞ اﻟﻘﯿﻢ ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ إﻟﻰ ﺑﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ‬

‫‪Sub‬‬ ‫‪SQL‬‬

‫‪program‬‬ ‫‪iSQL‬‬

‫وﯾﻌﻤﻞ اﻟﻤﻌﻄﻰ اﻟﺮﺳﻤﻲ ‪ Formal Parameter‬ﻟﮭﺬا اﻷﺳﻠﻮب ﻛﻤﺘﻐﯿﺮ ﻷﯾﺘﻢ ﺗﺤﺪﯾﺪ اﻟﻘﯿﻤﺔ اﻻﺑﺘﺪاﺋﯿﺔ ﻟﮫ‬
‫‪ . Uninitialized Variable‬أﻣﺎ اﻟﻤﻌﻄﻰ اﻟﻔﻌﻠﻲ ‪ Actual Parameter‬ﻓﻼﺑﺪ وأن ﯾﻜﻮن ﻣﺘﻐﯿﺮ وﯾﺠﺐ ﻣﻼﺣﻈﺔ‬
‫أﻧﮫ ﻻﯾﻤﻜﻦ ﺗﻌﯿﯿﻦ ﻗﯿﻤﺔ اﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﻌﻄﯿﺎت ‪ Parameters‬ﻓﻲ ھﺬا اﻷﺳﻠﻮب ﻓﻤﺜﻼ ﻓﻲ اﻟﻜﻮد اﻟﺘﺎﻟﻲ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٢٣‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء إﺟﺮاء ﻟﻼﺳﺘﺮﺟﺎع اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﺳﻢ اﻟﻤﻮﻇﻒ وراﺗﺒﮫ واﻟﻌﻤﻮﻟﺔ اﻟﺨﺎﺻﺔ ﺑﮫ وذﻟﻚ ﺑﺪﻻﻟﺔ رﻗﻢ‬
‫اﻟﻤﻮﻇﻒ وﯾﺤﺘﻮي ھﺬا اﻹﺟﺮاء ﻋﻠﻰ ﻋﺪد ﻣﻦ اﻟﻤﻌﻄﯿﺎت وﻛﻤﺎ ﻧﺮى أﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻷﺳﻠﻮب ‪ OUT‬ﻣﻊ اﻟﻤﻌﻄﯿﺎت‬
‫اﻟﺨﺎﺻﺔ ﺑﺎﺳﻢ اﻟﻤﻮﻇﻒ ‪ P_name‬وراﺗﺒﮫ ‪ P_salary‬واﻟﻌﻤﻮﻟﺔ اﻟﺨﺎﺻﺔ ﺑﮫ ‪. P_comm‬‬
‫وﻟﺘﻨﻔﯿﺬ وﻋﺮض اﻟﺒﯿﺎﻧﺎت اﻟﻨﺎﺗﺠﺔ ﻣﻦ ھﺬا اﻹﺟﺮاء ﻧﻘﻮم أوﻻً ﺑﺘﻌﺮﯾﻒ ﺛﻼﺛﺔ ﻣﺘﻐﯿﺮات ﻣﻦ اﻟﻨﻮع ‪Host Variable‬‬
‫ﺛﻢ ﻧﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻷﺟﺮاء ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ ‪:‬‬
‫)‪Variable g_name varchar2(30‬‬
‫‪Variable g_sal number‬‬ ‫ﺗﻌﺮﯾﻒ ﺛﻼﺛﺔ ﻣﺘﻐﯿﺮات‬

‫‪Variable g_comm number‬‬


‫ﻛﻮد اﻟﺘﻨﻔﯿﺬ ‪:‬‬
‫;)‪EXECUTE query_emp(171,:g_name,:g_sal,:g_comm‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻷﻣﺮ ‪ EXECUTE‬ﯾﻠﯿﮫ اﺳﻢ اﻹﺟﺮاء ‪ query_emp‬ﺛﻢ ﻣﺠﻤﻮﻋﺔ اﻟﻤﻌﻄﯿﺎت اﻟﺘﻲ ﺗﺮﯾﺪ ﺗﻤﺮﯾﺮھﺎ‬
‫ﻟﮭﺬا اﻹﺟﺮاء ) ( ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻟﻤﺘﻐﯿﺮات ﻟﺘﺨﺰﯾﻦ اﻟﻨﺘﺎﺋﺞ اﻟﻤﺨﺮﺟﺔ ﻣﻦ اﻹﺟﺮاء وإذا أردﻧﺎ ﻋﺮض ﻗﯿﻤﺔ أي‬
‫ﻣﻦ ھﺬه اﻟﻤﺘﻐﯿﺮات ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ ‪ Print‬ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻟﻌﺮض اﺳﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﺗﻢ اﺳﺘﺮﺟﺎﻋﮫ ﺑﺎﺳﺘﺨﺪام‬
‫اﻹﺟﺮاء اﻟﺴﺎﺑﻖ ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬه اﻟﺠﻤﻠﺔ ‪:‬‬
‫;‪Print g_name‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻷﻣﺮ ‪ Print‬ﯾﻠﯿﮫ اﺳﻢ اﻟﻤﺘﻐﯿﺮ اﻟﺬي ﻧﺮﯾﺪ ﻋﺮض ﻗﯿﻤﺘﮫ‪.‬‬
‫أﻣﺎ اﻷﺳﻠﻮب ‪ : IN OUT‬ﻓﮭﻮ ﯾﺸﺒﮫ إﻟﻰ ﺣﺪ ﻛﺒﯿﺮ اﻷﺳﻠﻮب اﻟﺴﺎﺑﻖ إﻻ‪ ‬أﻧﮫ ﯾﺴﺘﺨﺪم ﻟﻨﻘﻞ ﻗﯿﻢ ﻛﻼً ﻣﻦ ﺑﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ‬
‫‪Sub-program‬‬ ‫‪SQL‬‬ ‫واﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ‬
‫‪iSQL‬‬
‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٢٤‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫وﻓﻲ ھﺬا اﻷﺳﻠﻮب ﯾﻤﻜﻦ ﺗﻌﯿﯿﻦ ﻗﯿﻤﺔ اﺑﺘﺪاﺋﯿﺔ ﻟﻠﻤﻌﻄﯿﺎت اﻟﺮﺳﻤﯿﺔ‬
‫‪Formal parameter‬‬ ‫‪initialized variable‬‬
‫ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ‪:‬‬

‫ﻓﻔﻲ اﻟﻤﺜﺎل ﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻷﺳﻠﻮب ﻓﻲ اﻟﻤﻌﻄﻰ ‪ P_phone_no‬وذﻟﻚ ﻹﻧﺸﺎء إﺟﺮاء ﯾﺴﺘﺨﺪم ﻟﺘﺤﻮﯾﻞ رﻗﻢ ﻣﻜﻮن ﻣﻦ‬
‫‪(999)999-9999‬‬ ‫ﻋﺸﺮة أرﻗﺎم إﻟﻰ رﻗﻢ ھﺎﺗﻒ ﺑﺎﻟﺘﻨﺴﯿﻖ اﻟﺘﺎﻟﻲ ‪:‬‬
‫وﻹﻧﺸﺎء ھﺬا اﻹﺟﺮاء ﻧﻘﻮم ﺑﺘﺸﻐﯿﻞ ھﺬا اﻹﺟﺮاء ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح ‪ Enter‬ﻓﯿﺘﻢ إﻧﺸﺎء اﻹﺟﺮاء ﻓﺘﻈﮭﺮ اﻟﺮﺳﺎﻟﺔ ‪:‬‬
‫‪Procedure Created‬‬
‫وﻟﻼﺳﺘﺪﻋﺎء ھﺬا اﻹﺟﺮاء ﻧﻘﻮم ﺑﺈﻧﺸﺎء ﻣﺘﻐﯿﺮ ﻣﻦ اﻟﻨﻮع ‪-: Host Variable‬‬
‫;)‪Variable g_phone_no Varchar2(15‬‬
‫وﻟﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ ﻟﻠﻤﺘﻐﯿﺮ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺠﻤﻠﺔ ‪:‬‬
‫‪Begin‬‬
‫;'‪:g_phone_no:='3567057920‬‬
‫‪End; /‬‬
‫وﻻﺳﺘﻌﺮاض ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ ‪ g_phone_no‬ﻧﻘﻮم ﺑﻄﺒﺎﻋﺔ ﻗﯿﻤﺔ ھﺬا اﻟﻤﺘﻐﯿﺮ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪: Print‬‬
‫; ‪Print g_phone_no‬‬
‫ﻓﯿﺘﻢ ﻋﺮض اﻟﻘﯿﻤﺔ ‪:‬‬
‫‪G_phone_no‬‬
‫‪3567057920‬‬
‫واﻵن ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻷﺟﺮاء ‪ Formal_phone‬ﻟﺘﺤﻮﯾﻞ ﺗﻨﺴﯿﻖ ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ ‪ g_phone_no‬إﻟﻰ اﻟﺘﻨﺴﯿﻖ اﻟﺬي‬
‫ﻗﻤﻨﺎ ﺑﺘﺤﺪﯾﺪه ﻟﻸﺟﺮاء ‪:‬‬
‫;)‪EXECUTE formal_phone (:g_phone_no‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٢٥‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫وذﻟﻚ ﺑﻜﺘﺎﺑﺔ اﻷﻣﺮ ‪ EXECUTE‬ﯾﻠﯿﮫ اﺳﻢ اﻷﺟﺮاء ﺛﻢ ﻧﻘﻮم ﺑﺘﻤﺮﯾﺮ اﻟﻤﺘﻐﯿﺮ ‪ g_phone_no‬ﻟﮭﺬا اﻹﺟﺮاء وﺑﺎﺳﺘﺨﺪام‬
‫; ‪Print g_phone_no‬‬ ‫اﻷﻣﺮ ‪: Print‬‬
‫ﻧﻼﺣﻆ ﻇﮭﻮر رﻗﻢ اﻟﮭﺎﺗﻒ ﻛﺎﻟﺘﺎﻟﻲ‪:‬‬
‫‪G_phone_no‬‬
‫‪(356)705-7920‬‬

‫‪‬‬

‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ اﻟﻄﺮق اﻟﻤﺴﺘﺨﺪﻣﺔ ﻟﺘﻤﺮﯾﺮ اﻟﻤﻌﻄﯿﺎت إﻟﻰ اﻹﺟﺮاءات ﻛﻤﺎ ﺳﻨﺘﻌﺮف أﯾﻀﺎ ﻋﻠﻰ‬
‫ﻛﯿﻔﯿﺔ اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ ‪ DEFAULT‬ﺣﯿﺚ ﺗﺴﺘﺨﺪم ھﺬه اﻟﺨﺎﺻﯿﺔ ﻟﺘﻌﯿﯿﻦ ﻗﯿﻢ اﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﻌﻄﯿﺎت اﻟﺘﻲ ﯾﺘﻢ ﺗﻌﯿﯿﻨﮭﺎ‬
‫ﻟﻸﺳﻠﻮب ‪ IN‬ﻟﮭﺎ ﺣﯿﺚ ﯾﻤﻜﻦ ﻗﺒﻮل ھﺬه اﻟﻘﯿﻢ اﻻﻓﺘﺮاﺿﯿﺔ أو اﺳﺘﺒﺪاﻟﮭﺎ ﺑﻘﯿﻢ أﺧﺮى أﺛﻨﺎء اﺳﺘﺪﻋﺎء اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬
‫ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ‪:‬‬
‫ﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻟﻘﯿﻢ ‪ unknown‬و ‪NEW‬‬
‫‪ York‬ﻛﻘﯿﻢ اﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﻌﻄﯿﺎت‬
‫‪ P_name‬و ‪ P_loc‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام‬
‫اﻟﻜﻠﻤﺔ ‪ Default‬ﻓﻌﻨﺪ ﺗﺸﻐﯿﻞ ھﺬا اﻷﺟﺮاء‬
‫ﺑﺪون ﺗﻤﺮﯾﺮ ﻗﯿﻢ أﺧﺮى ﻟﮭﺬه اﻟﻤﻌﻄﯿﺎت‬
‫ﺳﻮف ﯾﺘﻢ إﺿﺎﻓﺔ اﻟﻘﯿﻢ اﻻﻓﺘﺮاﺿﯿﺔ اﻟﺬي ﺗﻢ‬
‫ﺗﻌﯿﯿﻨﮭﺎ ﻟﻤﻌﻄﯿﺎت ھﺬا اﻻﺟﺮاء ﻓﻲ اﻟﺠﺪول‬
‫‪ Dept‬ﺗﻠﻘﺎﺋﯿﺎً ﺣﯿﺚ ﯾﺘﻢ إﺿﺎﻓﺔ اﻟﻘﯿﻤﺔ‬
‫‪ unknown‬ﻓﻲ اﻟﻌﻤﻮد ‪Dname‬‬
‫واﻟﻘﯿﻤﺔ ‪ NEW York‬ﻓﻲ اﻟﻌﻤﻮد ‪Loc‬‬

‫ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ اﻟﺘﺎﻟﻲ‪:‬‬


‫‪Deptno‬‬ ‫‪Dname‬‬ ‫‪Loc‬‬
‫‪10‬‬ ‫‪Accounting‬‬ ‫‪New York‬‬
‫‪20‬‬ ‫‪Research‬‬ ‫‪Dallas‬‬
‫‪30‬‬ ‫‪Sales‬‬ ‫‪Chicago‬‬
‫‪40‬‬ ‫‪Operations‬‬ ‫‪Boston‬‬
‫‪50‬‬ ‫‪Unknown‬‬ ‫‪New York‬‬

‫وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ أﻧﮫ ﻻ ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ ‪ Default‬ﻟﺘﻌﯿﯿﻦ ﻗﯿﻢ اﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﻌﻄﯿﺎت اﻟﺘﻲ ﺗﺴﺘﺨﺪم‬
‫اﻷﺳﺎﻟﯿﺐ ]‪. [Out , IN OUT‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٢٦‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻛﻤﺎ ﺗﺴﻤﺢ ﻟﻨﺎ اﻟﻠﻐﺔ ‪ PL/SQL‬ﺑﺘﻤﺮﯾﺮ ﻗﯿﻢ اﻟﻤﻌﻄﯿﺎت ‪ parameters‬ﺑﻄﺮﯾﻘﺘﯿﻦ‪:‬‬
‫اﻟﻄﺮﯾﻘ ﺔ اﻷوﻟ ﻰ ‪ :‬ﯾ ﺘﻢ ﺗﻤﺮﯾ ﺮ اﻟﻤﻌﻄﯿ ﺎت اﻟﻔﻌﻠﯿ ﺔ ‪ Actual parameters‬أﺛﻨ ﺎء اﺳ ﺘﺪﻋﺎء اﻟﺒﺮﻧ ﺎﻣﺞ اﻟﻔﺮﻋ ﻲ ﺑ ﻨﻔﺲ‬
‫ﺗﺮﺗﯿﺐ اﻟﻤﻌﻄﯿﺎت اﻟﺮﺳﻤﯿﺔ ‪ Formal parameters‬وﺗﺴﻤﻰ ھﺬه اﻟﻄﺮﯾﻘﺔ ﺑﺎﻻﺳﻢ ‪Positional notation:‬‬
‫ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﺗﻢ اﺳﺘﺨﺪام اﻟﻤﺘﻐﯿﺮات ‪ P_name‬و ‪ P_loc‬ﻛﻤﻌﻄﯿﺎت ﻟﻺﺟﺮاء ‪add_dept‬‬
‫‪P_name‬‬
‫‪add_dept‬‬
‫‪P_loc‬‬
‫ﻓﻌﻨﺪ اﺳﺘﺪﻋﺎء ھﺬا اﻹﺟﺮاء وﺗﻤﺮﯾﺮ اﻟﻤﻌﻄﯿﺎت ﻟﮫ ﻣﺒﺎﺷﺮه ﻛﻤﺎ ﻓﻲ اﻟﻜﻮد اﻟﺘﺎﻟﻲ‪:‬‬
‫;)'‪EXECUTE add_dept('Operation','London‬‬
‫ﯾﺘﻢ ﺗﻌﯿﯿﻦ ﻗﯿﻢ اﻟﻤﻌﻄﯿﺎت ﻋﻨﺪ اﺳﺘﺪﻋﺎء اﻷﺟﺮاء ﺑﻨﻔﺲ ﺗﺮﺗﯿﺐ إدﺧﺎل ھﺬه اﻟﻤﻌﻄﯿﺎت ﻋﻨﺪ ﺗﻌﺮﯾﻔﮭﺎ داﺧﻞ اﻹﺟﺮاء‪.‬‬
‫اﻟﻄﺮﯾﻘﺔ اﻟﺜﺎﻧﯿﺔ ‪ :‬ﻓﮭﻲ ﺗﻤﺮﯾﺮ ﻗﯿﻢ اﻟﻤﻌﻄﯿﺎت ﺑﻄﺮﯾﻘﺔ ﻋﺸﻮاﺋﯿﺔ أﺛﻨﺎء ﻋﻤﻠﯿﺔ اﻻﺳﺘﺪﻋﺎء وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ رﺑﻂ ﻛﻞ ﻗﯿﻤﺔ‬
‫ﺑﺎﺳﻢ اﻟﻤﻌﻄﻰ اﻟﺬي ﻧﺮﯾﺪ ﺗﻤﺮﯾﺮ ھﺬه اﻟﻘﯿﻢ إﻟﯿﮫ وذﻟﻚ ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﺮﻣﺰ => وﯾﻄﻠﻖ ﻋﻠﻰ ھﺬه اﻟﻄﺮﯾﻘﺔ اﻻﺳﻢ‬
‫‪ Named notation‬ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﺗﻤﺮﯾﺮ ﻗﯿﻢ اﻟﻤﻌﻄﯿﺎت ﻟﻺﺟﺮاء ‪ add_dept‬ﺑﺎﺳﺘﺨﺪام اﻟﻄﺮﯾﻘﺔ‬
‫‪ Named notation‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد ‪:‬‬
‫;)'‪EXECUTE add_dept(P_loc>= 'London', P_name >='Operation‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﺳﻢ اﻟﻤﻌﻄﻰ ‪ P_loc‬و ‪ P_name‬ﺛﻢ ﯾﻠﯿﮫ ھﺬا اﻟﺮﻣﺰ => ﺛﻢ اﻟﻘﯿﻤﺔ اﻟﺬي ﻧﺮﯾﺪ ﺗﻤﺮﯾﺮھﺎ اﻟﻰ ھﺬا‬
‫اﻟﻤﻌﻄﻰ وﻓﻲ ھﺬا اﻟﺤﺎﻟﺔ ﻓﺎﻧﮫ ﻻﯾﺸﺘﺮط اﻟﺘﺮﺗﯿﺐ ﻋﻨﺪ ﺗﻤﺮﯾﺮ اﻟﻘﯿﻢ ﻟﻠﻤﻌﻄﯿﺎت ﻛﻤﺎ ﯾﻤﻜﻦ أﯾﻀﺎ دﻣﺞ اﻟﻄﺮﯾﻘﺘﯿﻦ ﻣﻌﺎ ﻟﺘﻤﺮﯾﺮ‬
‫ﻗﯿﻢ اﻟﻤﻌﻄﯿﺎت وﺗﺴﻤﻰ ھﺬه اﻟﻄﺮﯾﻘﺔ ﺑﺎﻻﺳﻢ ‪ Combination notation‬ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ‪:‬‬
‫;)'‪EXECUTE add_dept('London', P_name >='Operation‬‬
‫ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻟﻄﺮﯾﻘﺔ ‪ Named notation‬ﻓﻲ ﺗﻌﯿﯿﻦ ﻗﯿﻤﺔ ﻟﻠﻤﻌﻄﻰ ‪ P_name‬واﺳﺘﺨﺪام اﻟﻄﺮﯾﻘﺔ ‪Positional‬‬
‫‪ notation‬ﻟﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ ﻟﻠﻤﻌﻄﻰ ‪ ( 'London') P_loc‬ﻋﻨﺪ اﺳﺘﺨﺪام ھﺬه اﻟﻄﺮﯾﻘﺔ ﻟﺘﻤﺮﯾﺮ ﻗﯿﻢ اﻟﻤﻌﻄﯿﺎت ﻻﺑﺪ ﻣﻦ‬
‫اﺳﺘﺨﺪام اﻟﻄﺮﯾﻘﺔ ‪ Positional notation‬ﻗﺒﻞ اﻟﻄﺮﯾﻘﺔ ‪ Named notation‬وﻓﻲ ﺣﺎﻟﺔ ﻋﻜﺲ ﺗﺮﺗﯿﺐ اﻹدﺧﺎل‬
‫ﺗﻘﻮم ‪ Oracle‬ﺑﺈﻇﮭﺎر رﺳﺎﻟﺔ ﺧﻄﺄ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٢٧‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Local_Sub-program‬‬

‫ﺗﺘﯿﺢ ﻟﻨﺎ اﻟﻠﻐﺔ ‪ PL/SQL‬إﻣﻜﺎﻧﯿﺔ ﺗﻌﺮﯾﻒ اﻹﺟﺮاءات داﺧﻞ اﻟﻘﺎﻟﺐ اﻟﻠﻐﺔ ‪ PL/SQL‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺗﺴﻤﻰ ﺑﺎﻹﺟﺮاءات‬
‫اﻹﻗﻠﯿﻤﯿﺔ وﺗﻌﻤﻞ اﻹﺟﺮاءات اﻹﻗﻠﯿﻤﯿﺔ ﻋﻠﻰ ﺗﺒﺴﯿﻂ اﻷﻛﻮاد ووﺿﻮﺣﮭﺎ ﺣﯿﺚ ﺗﻜﺘﺴﺐ ﻧﻔﺲ وﻇﺎﺋﻒ وﺧﺼﺎﺋﺺ اﻟﺒ ﺮاﻣﺞ‬
‫اﻟﻔﺮﻋﯿﺔ ﺑﺪﻻً ﻣﻦ إﻧﺸﺎءھﺎ ﺑﻄﺮﯾﻘﺔ ﻣﺴﺘﻘﻠﺔ وﯾﺘﻢ اﺳﺘﺨﺪام ھﺬا اﻟﻨﻮع ﻣ ﻦ اﻟﺒ ﺮاﻣﺞ اﻟﻔﺮﻋﯿ ﺔ ﻓ ﻲ ﻧﻔ ﺲ اﻟﻘﺎﻟ ﺐ وﻻﯾﻤﻜ ﻦ‬
‫اﺳﺘﺪﻋﺎءه ﻓﻲ أي ﻗﺎﻟﺐ آﺧﺮ ﺣﯿﺚ ﯾﺘﻢ ﺗﻌﺮﯾﻒ اﻹﺟﺮاءات اﻹﻗﻠﯿﻤﯿﺔ داﺧﻞ اﻟﻘﺴﻢ ‪ Declarative Section‬وھﻮ ﻗﺎﻟﺐ‬
‫اﻟﻠﻐﺔ ‪ PL/SQL‬وﯾﺠﺐ أن ﯾﺮاﻋﻰ ﻋﻨﺪ ﺗﻌﺮﯾﻒ اﻹﺟﺮاءات اﻹﻗﻠﯿﻤﯿﺔ أن ﺗﻜﻮن آﺧﺮ ﻋﻨ ﺼﺮ ﻣ ﻦ ﻋﻨﺎﺻ ﺮ اﻟﻤﻌﺮﻓ ﺔ ﻓ ﻲ‬
‫ھﺬا اﻟﻘﺴﻢ ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ‪:‬‬

‫ﻓﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﯾﻘﻮم ﺑﻄﺒﺎﻋﺔ اﺳﻢ اﻟﻤﻮﻇﻒ وﺗﺨﺰﯾﻦ رﻗﻢ اﻟﻤﻮﻇﻒ وﺗﺎرﯾﺦ اﻟﯿﻮم وﺳﺎﻋﺔ اﻻﻧﺼﺮاف ﺣﯿﺚ ﯾﺘﻢ‬
‫ﺗﻌﺮﯾﻒ اﻹﺟﺮاء ‪ Log_exec‬اﻟﺬي ﯾﻌﻤﻞ ﻋﻠﻰ ﺗﺨﺰﯾﻦ رﻗﻢ اﻟﻤﻮﻇﻒ ‪ User_id‬اﻟﺬي ﯾﺘﻢ ﺗﻤﺮﯾﺮه ﻟﻺﺟﺮاء‬
‫‪ leave_emp2‬ﺑﺎﻹﺿﺎﻓﺔ ﻟﻠﺘﺎرﯾﺦ اﻟﻮﻗﺖ اﻟﺤﺎﻟﻲ ﻟﻠﺠﺪول ‪ Log_table‬وذﻟﻚ ﻓﻲ ﻧﮭﺎﯾﺔ اﻟﻘﺴﻢ ‪Declarative‬‬
‫‪ section‬اﻟﺨﺎﺻﺔ ﺑﺎﻹﺟﺮاء ‪. leave_emp2‬‬
‫أﻣﺎ اﻹﺟﺮاء ‪ leave_emp2‬ﻓﯿﻌﻤﻞ ﻋﻠﻰ ﻃﺒﺎﻋﺔ اﺳﻢ اﻟﻤﻮﻇﻒ ﺛﻢ ﺗﻨﻔﯿﺬ اﻹﺟﺮاء ‪. Log_exec‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٢٨‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Delete Procedures‬‬

‫ﺳﻮف ﻧﺘﻌﻠﻢ ﻓﻲ ھﺬا اﻟﺪرس ﻋﻞ ﻛﯿﻔﯿﺔ ﺣﺬف اﻹﺟﺮاءات ﻣﻦ اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬وﻟﺤﺬف اﻹﺟﺮاء ﻧﻘﻮم‬

‫ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ‪:‬‬

‫;‪Drop Procedure procedure_name‬‬

‫ﺣﯿﺚ ﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ‪ Drop procedure‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻹﺟﺮاء ‪ procedure_name‬اﻟﺬي ﻧﺮﯾﺪ ﺣﺬﻓﮫ ﻓﺈذا أردﻧﺎ‬

‫ﺣﺬف إﺟﺮاء ﻟﮫ اﻻﺳﻢ ‪ leave_emp2‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد ‪:‬‬

‫;‪Drop procedure leave_emp2‬‬

‫وﺑﺘﻨﻔﯿﺬ ھﺬا اﻟﻜﻮد ﺗﻈﮭﺮ اﻟﺮﺳﺎﻟﺔ اﻟﺘﻲ ﺗﺨﺒﺮﻧﺎ ﺑﺄﻧﮫ ﺗﻢ ﺣﺬف اﻹﺟﺮاء‬

‫‪Procedure dropped‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٢٩‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪‬‬ ‫‪Functions ‬‬ ‫‪‬‬

‫‪Functions‬‬
‫اﻟﻮﻇﺎﺋﻒ ‪ :‬ھﻲ أﺣﺪ أﻧﻮاع اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ‪ Sub-program‬واﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ اﺳﺘﺮﺟﺎع ﻗﯿﻤﺔ ‪Compute Value‬‬
‫ﻛﻨﺎﺗﺞ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ وھﻲ ﻣﻦ اﻟﻘﺎﻟﺐ اﻟﺘﻲ ﯾﺘﻢ ﺗﻌﯿﯿﻦ أﺳﻤﺎء ﻟﮭﺎ ‪ Named Block‬واﻟﺘﻲ ﺗﺴﻤﺢ ﻟﮭﺎ ﺑﺘﻤﺮﯾﺮ ﻣﻌﻄﯿﺎت‬
‫‪ Parameters‬وﻋﺎدةً ﻣﺎ ﯾﺘﻢ ﺗﺨﺰﯾﻦ اﻟﻮﻇﺎﺋﻒ ﻓﻲ ﺧﺎدم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ Oracle server‬ﻟﺬﻟﻚ ﺗﺴﻤﻰ ﺑﺎﻟﻮﻇﺎﺋﻒ‬
‫اﻟﻤﺨﺰﻧﺔ ‪ Stored functions‬ﻣﻤﺎ ﯾﺘﯿﺢ ﻟﻨﺎ إﻣﻜﺎﻧﯿﺔ اﺳﺘﺨﺪام ﺑﺼﻮرة ﻣﺘﻜﺮرة ﺣﯿﺚ ﯾﻤﻜﻦ اﺳﺘﺪﻋﺎءھﺎ ﻓﻲ أي ﺑﺮﻧﺎﻣﺞ‬
‫آﺧﺮ ﻛﻤﺎ ﯾﻤﻜﻦ ﺗﺤﺪﯾﺜﮭﺎ وﺻﯿﺎﻧﺔ اﻟﺒﺮاﻣﺞ ﺑﺴﮭﻮﻟﺔ واﻟﮭﯿﻜﻞ اﻟﺒﻨﺎﺋﻲ ﻟﻠﻮﻇﺎﺋﻒ ﯾﺸﺒﮫ اﻟﮭﯿﻜﻞ اﻟﺒﻨﺎﺋﻲ ﻟﻺﺟﺮاءات ﺗﻤﺎﻣﺎ ً ﻓﯿﻤﺎ‬
‫ﻋﺪا أن اﻟﻮﻇﺎﺋﻒ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻌﺒﺎرة ‪ Return‬ﺣﯿﺚ ﯾﺘﻜﻮن ﺑﻨﺎء اﻟﻮﻇﯿﻔﺔ ﻋﻠﻰ ﻗﺴﻤﯿﻦ رﺋﯿﺴﯿﯿﻦ ‪-:‬‬
‫‪Specification Part‬‬ ‫‪Header‬‬ ‫‪ – ١‬اﻟﻘﺴــــــــــــــــــــــــــــﻢ‬
‫واﻟﺬي ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮫ ﻟﺘﺤﺪﯾﺪ اﺳﻢ اﻟﻮﻇﯿﻔﺔ ‪ Function Name‬وﻗﺎﺋﻤﺔ اﻟﻤﻌﻄﯿﺎت ‪ Parameters‬ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ‬
‫اﻟﻌﺒﺎرة ‪. Return‬‬
‫‪ – ٢‬اﻟﻘﺴـــــــــــــــــــــــــــــﻢ ‪Function Body‬‬
‫وﯾﻨﻘﺴﻢ إﻟﻰ ﺛﻼﺛﺔ أﻗﺴﺎم ‪:‬‬
‫‪1] Declarative Section‬‬
‫‪2] Executable Section‬‬
‫‪3] Exception Section‬‬
‫واﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻹﻧﺸﺎء اﻟﻮﻇﺎﺋﻒ ‪ Functions‬ﻓﻲ اﻟﻠﻐﺔ ‪ PL/SQL‬ھﻲ ﻛﺎﻟﺘﺎﻟﻲ‪:‬‬

‫ﺑﺪون ﺗﺤﺪﯾﺪ ﺣﺠﻢ ﻟﮭﺬه اﻟﺒﯿﺎﻧﺎت‬

‫ﻣﺠﻤﻮﻋﺔ اﻟﺠﻤﻞ اﻟﺘﻲ ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮭﺎ‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣٠‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ‪:‬‬

‫ﻓﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﯾﺴﺘﺨﺪم اﻟﻜﻮد ﻹﻧﺸﺎء وﻇﯿﻔﺔ ﻟﮭﺎ أﺳﻢ ‪ ger_first_name‬ﺣﯿﺚ ﺗﻌﻤﻞ ﻋﻠﻰ اﺳﺘﺮﺟﺎع اﺳﻢ‬
‫اﻟﻤﻮﻇﻒ ﺑﺪﻻﻟﺔ رﻗﻢ اﻟﻤﻮﻇﻒ ‪ P_id‬واﻟﺬي ﯾﺘﻢ ﺗﻤﺮﯾﺮه ﻛﻤﻌﻄﻰ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ وﻧﻼﺣﻆ ھﺬا إن اﻟﻜﻠﻤﺔ ‪ Return‬ﺗﻈﮭﺮ‬
‫ﻣﺮﺗﯿﻦ داﺧﻞ اﻟﻜﻮد ﻣﺮة ﻓﻲ اﻟﻘﺴﻢ ‪ Header‬ﺣﯿﺚ ﯾﺘﻢ ﺗﻌﯿﯿﻦ ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﺘﻘﻮم ھﺬه اﻟﻮﻇﯿﻔﺔ ﺑﺎﺳﺘﺮﺟﺎﻋﮫ‬
‫واﻟﻤﺮة اﻟﺜﺎﻧﯿﺔ ﺑﻌﺪ اﻻﺳﺘﻌﻼم ﻋﻦ اﻟﻘﺴﻢ ‪ Function Body‬وذﻟﻚ ﻟﺘﻤﺮﯾﺮ اﻟﻘﯿﻤﺔ اﻟﻨﺎﺗﺠﺔ ﻣﻦ اﻟﻮﻇﯿﻔﺔ‬
‫‪ V_first_name‬إﻟﻰ اﻟﻤﺴﺘﺨﺪم وھﻲ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﻋﺒﺎرة ﻋﻦ أﺳﻢ اﻟﻤﻮﻇﻒ وﻟﺘﻨﻔﯿﺬ ھﺬا اﻟﻜﻮد ﻧﻀﻐﻂ ﻋﻠﻰ‬
‫واﻟﺘﻲ ﺗﺪل ﻋﻠﻰ أﻧﮫ ﺗﻢ إﻧﺸﺎء اﻟﻮﻇﯿﻔﺔ‬ ‫اﻟﻤﻔﺘﺎح ‪ Enter‬ﻓﺘﻈﮭﺮ ﻟﻨﺎ اﻟﺮﺳﺎﻟﺔ ‪Function Created :‬‬
‫واﻵن ﻧﻘﻮم ﺑﺘﻌﺮﯾﻒ ﻣﺘﻐﯿﺮ ﻟﺘﺨﺰﯾﻦ اﻟﻘﯿﻤﺔ اﻟﻨﺎﺗﺠﺔ ﻣﻦ اﻟﻮﻇﯿﻔﺔ ﺑﮫ‪ .‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺠﻤﻠـــــــــــﺔ‪:‬‬
‫;)‪Variable get_name varchar2(10‬‬
‫وﻟﻼﺳﺘﺪﻋﺎء اﻟﻮﻇﯿﻔﺔ اﻟﺬي ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎدھﺎ داﺧﻞ اﻟﻜﻮد ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﺘﻌﺒﯿــــــــﺮ ‪:‬‬
‫;)‪EXECUTE :get_name :=get_first_name(100‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻷﻣﺮ ‪ EXECUTE‬ﯾﻠﯿﮭﺎ أﺳﻢ اﻟﻤﺘﻐﯿﺮ ‪ get_name‬اﻟﺬي ﻧﺮﯾﺪ ﺗﺨﺰﯾﻦ ﻧﺎﺗﺞ اﻟﻮﻇﯿﻔﺔ ﺛﻢ اﻟﻌﻼﻣﺔ‬
‫ﯾﺴﺎوي = ﯾﻠﯿﮭﺎ أﺳﻢ اﻟﻮﻇﯿﻔﺔ اﻟﺬي ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ‪ get_first_name‬ﯾﻠﯿﮭﺎ رﻗﻢ اﻟﻤﻮﻇﻒ )‪ (100‬اﻟﺬي ﻧﺮﯾﺪ ﺗﻤﺮﯾﺮه‬
‫ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ﺛﻢ ﻧﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح ‪ Enter‬ﻓﯿﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻜﻮد وﺗﻈﮭﺮ ھﺬه اﻟﺮﺳﺎﻟﺔ ‪:‬‬
‫‪PL/SQL procedure successfully completed‬‬
‫واﻟﺘﻲ ﺗﺪل ﻋﻠﻰ أﻧﮫ ﺗﻢ ﺗﻨﻔﯿﺬ اﻟﻮﻇﯿﻔﺔ ﺑﻨﺠﺎح ‪.‬‬
‫وﻟﻌﺮض اﻟﻘﯿﻤﺔ اﻟﻨﺎﺗﺠﺔ ﻣﻦ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ ‪ Print‬ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ‪:‬‬
‫;‪Print get_name‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣١‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪SQL‬‬
‫ﻓﺎﻻﺳﺘﺨﺪام وﻇﺎﺋﻒ ‪ Function‬ﻣﻊ اﻟﻠﻐﺔ ‪ SQL‬أﻣﺪت اﻟﻠﻐﺔ ﺑﻤﺠﻤﻮﻋﺔ ﻣﻦ اﻷدوات اﻟﺘﻲ إﺿﺎﻓﺔ ﻟﮭﺎ ﻣﻦ اﻟﻌﺪﯾﺪ ﻣﻦ‬
‫اﻟﺤﻠﻮل واﻹﻣﻜﺎﻧﺎت اﻟﺘﻲ ﻟﻢ ﺗﻜﻦ ﻣﺘﻮاﺟﺪة ﺑﺼﻔﺔ أﺳﺎﺳﯿﺔ ﻓﻲ اﻟﻠﻐﺔ ﺣﯿﺚ ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﻮﻇﺎﺋﻒ اﻟﺘﻲ ﯾﺘﻢ ﺗﻌﺮﯾﻔﮭﺎ ﻣﻦ‬
‫ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻓﻲ أي ﻣﻮﺿﻊ ﯾﻤﻜﻦ أن ﺗﺴﺘﺨﺪم ﺑﮫ اﻟﺪوال اﻟﺨﺎﺻﺔ ﺑﺎﻟﻠﻐﺔ ‪ SQL‬ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل اﻟﻜﻮد اﻟﺘﺎﻟﻲ‪-:‬‬

‫ﯾﻘﻮم ﺑﺈﻧﺸﺎء وﻇﯿﻔﺔ ﻟﮭﺎ اﻻﺳﻢ ‪ Tax‬وﯾﺘﻢ ﺗﻤﺮﯾﺮ ﻣﻌﻄﻰ واﺣﺪ ‪ P_value‬ﻓﻘﻂ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت‬
‫‪ Number‬وﺗﻌﻤﻞ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻋﻠﻰ ﺿﺮب ﻣﻘﺪار اﻟﻀﺮﯾﺒﺔ ﻓﻲ اﻟﻘﯿﻤﺔ اﻟﺘﻲ ﯾﺘﻢ ﺗﻤﺮﯾﺮھﺎ ]‪ [P_value‬ﻟﮭﺬه‬
‫اﻟﻮﻇﯿﻔﺔ وﻛﻤﺎ ﻧﺮى ﻓﻲ اﻟﻜﻮد أﻧﮫ ﯾﻤﻜﻦ اﺳﺘﺪﻋﺎء اﻟﻮﻇﯿﻔﺔ ‪ tax‬داﺧﻞ اﻟﺠﻤﻠﺔ ‪ Select‬ﺣﯿﺚ ﯾﺘﻢ ﺗﻤﺮﯾﺮ ﻗﯿﻤﺔ اﻟﺤﻘﻞ‬
‫‪ Salary‬ﻛﻤﻌﻄﻰ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ‪ Tax‬وذﻟﻚ ﻟﺤﺴﺎب ﻣﻘﺪار اﻟﻀﺮﯾﺒﺔ اﻟﺨﺎﺻﺔ ﺑﺮواﺗﺐ اﻟﻤﻮﻇﻔﯿﻦ وﯾﻤﻜﻦ اﺳﺘﺨﺪام‬
‫اﻟﻮﻇﺎﺋﻒ ‪ Function‬ﻓﻲ ﻛﻼ ﻣﻦ اﻟﻌﺒﺎرات ‪-:‬‬
‫‪- Where‬‬
‫‪-Having‬‬
‫‪- Connect By‬‬
‫‪- Start with‬‬
‫‪- Order By‬‬
‫‪- Group By‬‬
‫ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ اﺳﺘﺨﺪاﻣﮭﺎ ﻣﻊ اﻟﺠﻤﻠﺔ ‪ Insert‬ﻓﻲ اﻟﻌﺒﺎرة ‪ ، Values‬واﻟﺠﻤﻠﺔ ‪ Update‬ﻣﻊ اﻟﻌﺒﺎرة ‪ Set‬ﻓﻔﻲ اﻟﻜﻮد‬
‫اﻟﺘﺎﻟﻲ‪-:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣٢‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﯾﺘﻢ اﺳﺘﺨﺪام ﺟﻤﻠﺔ ‪ tax‬ﻓﻲ ﻛﻼً ﻣﻦ اﻟﻌﺒﺎرات ‪:‬‬
‫‪-Select‬‬
‫‪-Where‬‬
‫‪-Order by‬‬

‫‪SQL‬‬
‫ﻋﻨﺪ اﺳﺘﺪﻋﺎء اﻟﻮﻇﺎﺋﻒ ﻓﻲ أي ﺗﻌﺒﯿﺮ ‪ SQL‬ﯾﺠﺐ اﺳﺘﺨﺪام اﻟﻄﺮﯾﻘﺔ ‪ Position Notation‬ﻟﺘﻤﺮﯾﺮ ﻗﯿﻢ ﻣﻌﻄﯿﺎت‬
‫‪. Parameters‬‬
‫‪Position Notation‬‬ ‫‪Parameters‬‬ ‫‪Data type‬‬ ‫‪SQL‬‬
‫وﻛﺬﻟﻚ ﻻﺑﺪ أن ﯾﻜﻮن ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﻤﺴﺘﺨﺪم ﻟﺘﻌﺮﯾﻒ اﻟﻤﻌﻄﯿﺎت ھﻮ ﻧﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻠﻐﺔ ‪SQL‬‬
‫ﻛﻤﺎ ﯾﺠﺐ ﻋﺪم اﺳﺘﺨﺪام أي ﻣﻦ أﺳﺎﻟﯿﺐ اﻟﺘﻤﺮﯾﺮ ‪ OUT Or INOUT‬ﻣﻊ أي ﻣﻦ ﻣﻌﻄﯿﺎت اﻟﻮﻇﺎﺋﻒ اﻟﺘﻲ ﯾﺠﺐ‬
‫اﺳﺘﺨﺪاﻣﮭﺎ ﻓﻲ ﺗﻌﺒﯿﺮات اﻟﻠﻐﺔ ‪ PL/SQL‬ﻛﻤﺎ ﻻﯾﻤﻜﻦ اﺳﺘﺪﻋﺎء اﻟﻮﻇﺎﺋﻒ ﻣﻊ اﻟﻘﯿﺪ ‪ Check‬اﻟﺨﺎﺻﺔ ﺑﺎﻟﺠﻤﻞ ‪:‬‬
‫‪-Create table‬‬
‫‪-Alter table‬‬
‫وﻟﻜﻲ ﯾﺘﻢ اﻟﺴﻤﺎح ﻟﻠﻤﺴﺘﺨﺪم ﺑﺎﺳﺘﺨﺪام اﻟﻮﻇﺎﺋﻒ ﻓﻲ ﺗﻌﺒﯿﺮات اﻟﻠﻐﺔ ‪ SQL‬ﯾﺠﺐ أن ﯾﻜﻮن ﻟﮫ ﺣﻖ اﻻﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ‬
‫‪ EXECUTE‬وﻋﻨﺪ اﺳﺘﺪﻋﺎء اﻟﻮﻇﺎﺋﻒ ﻓﻲ ﺗﻌﺒﯿﺮات اﻟﻠﻐﺔ ‪ SQL‬ﻻﺑﺪ ﻣﻦ ﻗﯿﺎم ﺧﺎدم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪Oracle‬‬
‫‪ server‬ﻣﻦ اﻟﺘﺄﻛﺪ ﻣﻦ ﻋﺪم اﺣﺘﻮاء ھﺬه اﻟﻮﻇﺎﺋﻒ ﻋﻠﻰ أي أﺿﺮار ﺟﺎﻧﺒﯿﺔ ‪ Side Effects‬ﺑﻤﻌﻨﻰ أﻧﮫ ﻻ ﯾﺘﻢ اﻟﺴﻤﺎح‬
‫ﻟﻠﻮﻇﺎﺋﻒ ﺑﺈﺟﺮاء أي ﺗﻌﺒﯿﺮات ﻋﻠﻰ ﺟﺪاول ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﺣﯿﺚ ﻻﯾﻤﻜﻦ ﻟﻠﻮﻇﺎﺋﻒ ﺑﺎﻟﻘﯿﺎم ﺑﺘﻌﺪﯾﻞ ﻋﻠﻰ ﺟﺪاول ﻗﻮاﻋﺪ‬
‫اﻟﺒﯿﺎﻧﺎت ﻋﻨﺪ اﺳﺘﺪﻋﺎءھﺎ ﻓﻲ اﻟﺠﻤﻞ‪-:‬‬
‫‪Select، Update ، Delete‬‬
‫وﻋﻨﺪ اﺳﺘﺨﺪام اﻟﻮﻇﺎﺋﻒ ﻣﻊ اﻟﺠﻤﻞ ‪ Update‬أو ‪ Delete‬ﻻﯾﻤﻜﻦ إﺟﺮاء اﺳﺘﻌﻼم أو ﺗﻌﺪﯾﻞ ﻋﻠﻰ ﺟﺪاول ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت‬
‫اﻟﺘﻲ ﯾﺘﻢ ﻣﻌﺎﻟﺠﺘﮭﺎ ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺠﻤﻞ ﻛﻤﺎ ﻻﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﻮﻇﺎﺋﻒ ﻓﻲ ﺗﻨﻔﯿﺬ أي ﺟﻤﻠﺔ ﻣﻦ اﻟﻘﻮاﻋﺪ اﻟﺘﺎﻟﯿﺔ‪-:‬‬
‫• اﻟﺘﺤﻜﻢ ﻓﻲ اﻹﺟﺮاءات ‪Transaction Control‬‬
‫• اﻟﺘﺤﻜﻢ ﻓﻲ اﻟﻔﺘﺮة اﻟﺰﻣﻨﯿﺔ‪Session Control‬‬
‫• اﻟﺘﺤﻜﻢ ﻓﻲ اﻟﻨﻈﺎم ‪System Control‬‬
‫• وأﯾﻀﺎ ﻻﯾﻤﻜﻦ ﺗﻨﻔﯿﺬ أي ﺟﻤﻠﺔ ﻣﻦ ﺟﻤﻞ اﻟﺘﻌﺮﯾﻒ ‪Data Definition Language‬‬
‫‪Data Definition Language‬‬ ‫‪Commit‬‬
‫وذﻟﻚ ﻷﻧﮭﺎ ﺗﻌﻤﻞ ﻋﻠﻰ ﺗﺜﺒﯿﺖ اﻹﺟﺮاءات ﺗﻠﻘﺎﺋﯿﺎً ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Commit‬ﻛﻤﺎ ﻻ ﯾﻤﻜﻦ أﯾﻀﺎ اﺳﺘﺨﺪام أي وﻇﯿﻔﺔ‬
‫ﺗﺤﺘﻮي ﻋﻠﻰ وﻇﯿﻔﺔ أﺧﺮى ﺗﻘﻮم ﺑﻜﺴﺮ ھﺬه اﻟﻘﻮاﻋﺪ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣٣‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪‬‬

‫‪Function‬‬ ‫‪Procedure‬‬

‫ﻟﺤﺬف اﻟﻮﻇﺎﺋﻒ ﻣﻦ ﺧﺎدم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ Oracle server‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ ‪:‬‬
‫;‪Drop Function function_name‬‬
‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑــ ‪ Drop Function‬ﯾﻠﯿﮭﺎ أﺳﻢ اﻟﻮﻇﯿﻔﺔ اﻟﻤﺮاد ﺣﺬﻓﮭﺎ ‪ function_name‬ﺣﯿﺚ ﯾﺠﺐ ﻣﻌﺮﻓﺔ‬
‫أن اﻟﺠﻤﻠﺔ ‪ Drop Function‬ﺗﻌﻤﻞ أﯾﻀﺎ ﻋﻠﻰ إﻟﻐﺎء ﺟﻤﯿﻊ اﻻﻣﺘﯿﺎزات اﻟﻤﺘﻌﻠﻘﺔ ﺑﮭﺬه اﻟﻮﻇﯿﻔﺔ ﻓﺈذا أردﻧﺎ ﺣﺬف‬
‫اﻟﻮﻇﯿﻔﺔ ‪ tax‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد ‪-:‬‬
‫;‪Drop Function tax‬‬
‫‪Create OR Replace‬‬ ‫ﻛﻤﺎ ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪-:‬‬
‫ﻛﻮﺳﯿﻠﺔ ﻣﻜﺎﻓﺌﺔ ﻟﻌﻤﻠﯿﺔ اﻟﺤﺬف ﺣﯿﺚ ﺗﻌﻤﻞ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻋﻠﻰ ﺣﺬف اﻟﻮﻇﯿﻔﺔ وإﻋﺎدة إﻧﺸﺎءھﺎ ﻣﺮة أﺧﺮى وﺗﻌﻤﻞ ﺟﻤﻠﺔ‬
‫‪ Replace‬ﻋﻠﻰ ﻧﻘﻞ ﺟﻤﯿﻊ اﻻﻣﺘﯿﺎزات اﻟﻤﺘﻌﻠﻘﺔ ﺑﮭﺬه اﻟﻮﻇﯿﻔﺔ إﻟﻰ ﻣﺴﺘﺨﺪﻣﯿﻦ آﺧﺮﯾﻦ ﺑﺪون أي ﺗﻐﯿﯿﺮ‪.‬‬
‫اﻟﻔﺮق ﺑﯿﻦ اﻹﺟﺮاءات واﻟﻮﻇﺎﺋﻒ؟‬
‫اﻹﺟﺮاءات ‪ : Procedures‬ﺗﺴﺘﺨﺪم ﻟﺘﺨﺰﯾﻦ ﺳﻠﺴﻠﺔ ﻣﻦ اﻷﻋﻤﺎل اﻟﺘﻲ ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻓﯿﻤﺎ ﺑﻌﺪ وﯾﻤﻜﻦ أن ﺗﺤﺘﻮي‬
‫اﻹﺟﺮاءات ﻋﻠﻰ اﻟﻌﺪﯾﺪ ﻣﻤﻦ اﻟﻤﻌﻄﯿﺎت ‪ Parameters‬اﻟﺘﻲ ﺗﺴﻤﺢ ﺑﻨﻘﻞ اﻟﻘﯿﻢ ﻣﻦ واﻟﻰ ﺑﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ ﻛﻤﺎ أن‬
‫اﻹﺟﺮاءات ﻻ ﺗﻘﻮم ﺑﺎﺳﺘﺮﺟﺎع ﻗﯿﻢ ﻟﺒﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ‪.‬‬
‫اﻟﻮﻇﺎﺋﻒ‪ : Functions‬ﺗﺴﺘﺨﺪم ﻟﺤﺴﺎب ﻗﯿﻢ ﻣﻌﯿﻨﺔ ‪ Compute Value‬واﻟﺘﻲ ﻻﺑﺪ ﻣﻦ إﻋﺎدﺗﮭﺎ ﻟﺒﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ‬
‫وﯾﻤﻜﻦ أن ﺗﺤﺘﻮي اﻟﻮﻇﺎﺋﻒ ﻋﻠﻰ اﻟﻤﻌﻄﯿﺎت أو ﻻ ﺗﺤﺘﻮي ﻋﻠﻰ أي ﻣﻌﻄﻰ ‪ Parameter‬ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ ﺗﻠﻚ اﻟﻔﺮوق‬
‫ﯾﻮﺟﺪ اﻟﻌﺪﯾﺪ ﻣﻦ اﻻﺧﺘﻼﻓﺎت اﻷﺧﺮى ﻛﻤﺎ ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣٤‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪‬‬ ‫‪      ‬‬ ‫‪‬‬

‫‪Privileges‬‬
‫ﺗﻨﻘﺴﻢ اﻻﻣﺘﯿﺎزات إﻟﻰ ﻗﺴﻤﯿﻦ ‪:‬‬
‫‪ -١‬اﻣﺘﯿﺎزات اﻟﻨﻈﺎم ‪System Privileges‬‬
‫‪ -٢‬اﻣﺘﯿﺎزات اﻟﻌﻨﺎﺻﺮ ‪Object Privileges‬‬
‫وﺗﻌﺘﺒﺮ اﻣﺘﯿﺎزات اﻟﻨﻈﺎم ھﻲ اﻻﻣﺘﯿﺎزات اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺴﺘﺨﺪﻣﯿﻦ واﻟﺘﻲ ﯾﺘﻢ ﻣﻨﺤﮭﺎ ﻟﮭﻢ ﺑﻮاﺳﻄﺔ أي ﻣﻦ اﻟﻤﺴﺘﺨﺪﻣﯿﻦ‬
‫‪ System‬أو ‪ Sys‬ﻓﻘﻂ وھﻲ أﻛﺜﺮ ﻣﻦ ‪ 80‬اﻣﺘﯿﺎز وﺑﺼﻔﺔ ﻋﺎﻣﺔ ﻓﺈن أي اﻣﺘﯿﺎز ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﻜﻠﻤﺔ ‪ Create‬أو‬
‫‪ Any‬ھﻮ ﻋﺒﺎرة ﻋﻦ اﻣﺘﯿﺎزات اﻟﻨﻈﺎم ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل اﻟﻜﻮد اﻟﺘﺎﻟﻲ‪:‬‬
‫; ‪Grant Alter any Table to Alsaeedi‬‬
‫ھﻮ ﻋﺒﺎرة ﻋﻦ اﻣﺘﯿﺎز اﻟﻨﻈﺎم ﯾﺘﻢ ﻣﻨﺤﮫ ﺑﻮاﺳﻄﺔ أي ﻣﻦ اﻟﻤﺴﺘﺨﺪﻣﯿﻦ ‪ System‬أو ‪ Sys‬ﺣﯿﺚ ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ‬
‫‪ Any‬ﺑﻌﺪ اﺳﻢ اﻻﻣﺘﯿﺎز ‪. Alter‬‬
‫أﻣﺎ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻼﻣﺘﯿﺎزات اﻟﻌﻨﺎﺻﺮ ﻓﮭﻲ ﺧﺎﺻﺔ ﺑﻌﻨﺎﺻﺮ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Schema‬ﻣﺜﻞ ‪:‬‬
‫]‪ [Sequences,view,index,Table‬وداﺋﻤﺎ ﻣﺎ ﺗﺘﻀﻤﻦ اﺳﻢ اﻟﻌﻨﺼﺮ وﯾﺘﻢ ﻣﻨﺢ ھﺬه اﻻﻣﺘﯿﺎزات ﻣﻦ ﻗﺒﻞ ﻣﺎﻟﻚ ھﺬه‬
‫اﻟﻌﻨﺎﺻﺮ ‪ Owner‬ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻟﻤﻨﺢ اﻣﺘﯿﺎز اﻟﺘﻌﺪﯾﻞ ﻟﻠﻤﺴﺘﺨﺪم ‪ Alsaeedi‬ﻋﻠﻰ ﺟﺪول اﻟﻤﻮﻇﻔﯿﻦ ﻓﻲ ﻗﺎﻋﺪة‬
‫اﻟﺒﯿﺎﻧﺎت وﻟﺘﻜﻦ ‪ Company‬ﯾﺘﻢ ﻣﻨﺢ ھﺬه اﻻﻣﺘﯿﺎزات ﻣﻦ ﺧﻼل اﻟﻤﺴﺘﺨﺪم ﻛﻤﺎ ﻓﻲ اﻟﻜﻮد‪:‬‬
‫;‪Grant Alter On employees to Alsaeedi‬‬
‫وھﻨﺎ ﯾﺠﺐ أن ﻧﺬﻛﺮ ﻹﻧﺸﺎء اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻻﺑﺪ ﻣﻦ اﻣﺘﻼك اﻻﻣﺘﯿﺎز ‪ Create procedure‬وذﻟﻚ ﻟﺴﻤﺎح ﻟﻠﻤﺴﺘﺨﺪم‬
‫ﺑﺘﻌﺪﯾﻞ وﺣﺬف اﻟﺒﺮاﻣﺞ ‪ PL/SQL‬ﺑﺪون اﻟﺤﺎﺟﺔ ﻷي اﻣﺘﯿﺎزات إﺿﺎﻓﯿﺔ‪.‬‬
‫وﻓﻲ ﺣﺎﻟﺔ اﺣﺘﻮاء ھﺬه اﻟﺒﺮاﻣﺞ ﻋﻠﻰ ﻋﻨﺎﺻﺮ ﻣﻦ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أﺧﺮى ﻓﻼﺑﺪ أن ﯾﻜﻮن ﻟﻚ اﻣﺘﯿﺎز اﻟﻮﺻﻮل اﻟﻰ ھﺬه‬
‫اﻟﻌﻨﺎﺻﺮ ﺑﻄﺮﯾﻘﺔ ﻣﺒﺎﺷﺮة وﻟﯿﺲ ﻣﻦ ﺧﻼل ﻣﺠﻤﻮﻋﺔ ﻋﻨﺎﺻﺮ اﻣﺘﯿﺎزات ‪ Roll‬وﯾﺠﺐ ﻣﻼﺣﻈﺔ اﻧﮫ ﻋﻨﺪ اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ‬
‫‪ Any‬ﻋﻨﺪ ﻣﻨﺢ اﻻﻣﺘﯿﺎز ﻓﺄﻧﮫ ﯾﻤﻜﻨﻚ ‪-:‬‬
‫‪Create‬‬ ‫إﻧﺸﺎء‬
‫‪Alter‬‬ ‫أو ﺗﻌﺪﯾﻞ‬
‫أو ﺣﺬف‬
‫‪Delete‬‬
‫أو ﺗﺸﻐﯿﻞ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ‬
‫‪EXECUTE‬‬
‫اﻟﺘﻲ ﺗﻤﺘﻠﻜﮭﺎ أو اﻟﻤﻮﺟﻮدة ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أﺧﺮى ﻛﻤﺎ ﯾﺠﺐ اﻟﻤﻼﺣﻈﺔ أﻧﮫ ﺑﺘﻨﻔﯿﺬ أي ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ ‪PL/SQL‬‬
‫‪ Sub-program‬ﻻﺗﻤﺘﻠﻜﮫ ﻓﯿﺠﺐ أن ﯾﻜﻮن ﻟﺪﯾﻚ اﻻﻣﺘﯿﺎز ‪ EXECUTE‬ﻋﻠﻰ ھﺬه اﻟﻌﻨﺎﺻﺮ وذﻟﻚ ﻓﻲ ﺣﺎﻟﺔ ﻋﺪم‬
‫اﻣﺘﻼك ‪. EXECUTE Any‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣٥‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Granting Access To Data‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ اﻟﻄﺮق اﻟﻤﺨﺘﻠﻔﺔ ﻟﻠﺴﻤﺎح ﻟﻠﻤﺴﺘﺨﺪﻣﯿﻦ ﻟﻠﻮﺻﻮل إﻟﻰ اﻟﺒﯿﺎﻧﺎت ﻛﻤﺎ ﺳﻨﺘﻌﺮف ﻋﻠﻰ اﻟﻤﻘﺼﻮد ﺑﺎﻟﺤﻘﻮق‬
‫‪ identifier 's Rights‬و ‪. Invoker's Rights‬‬
‫وﯾﺘﻢ اﻟﺴﻤﺎح ﻟﻠﻤﺴﺘﺨﺪﻣﯿﻦ ﻟﻠﻮﺻﻮل إﻟﻰ اﻟﺒﯿﺎﻧﺎت ﺑﺈﺣﺪى ﻃﺮﯾﻘﺘﯿﻦ وھﻤﺎ ‪:‬‬
‫‪ -١‬اﻟﻄﺮﯾﻘﺔ اﻟﻤﺒﺎﺷﺮة ‪Direct Access‬‬
‫‪ -٢‬اﻟﻄﺮﯾﻘﺔ ﻏﯿﺮ اﻟﻤﺒﺎﺷﺮة ‪Indirect Access‬‬
‫وﻟﺘﻌﺮف ﻋﻠﻰ ھﺬه اﻟﻄﺮق ﻟﻠﻮﺻﻮل إﻟﻰ اﻟﺒﯿﺎﻧﺎت ﻧﻔﺮض إﻧﻨﺎ ﻧﺮﯾﺪ اﻟﺴﻤﺎح ﻛﻼً ﻣﻦ اﻟﻤﺴﺘﺨﺪم ‪ Scott‬و ‪Alsaeedi‬‬
‫ﺑﺈﻣﻜﺎﻧﯿﺔ اﺳﺘﻌﺮاض اﻟﺠﺪول اﻟﻤﻮﻇﻔﯿﻦ ‪ Employees‬اﻟﻤﻮﺟﻮدة ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Company‬ﻓﻌﻨﺪ ﻗﯿﺎﻣﻨﺎ ﺑﻤﻨﺢ‬
‫اﻻﻣﺘﯿﺎز ‪ Select‬ﻋﻠﻰ اﻟﻌﻨﺼﺮ اﻟﻤﻮﻇﻔﯿﻦ ‪ Employees‬ﻟﻠﻤﺴﺘﺨﺪم ‪ Scott‬ﻓﻔﻲ ھﺬه اﻟﺤﺎﻟﺔ ﯾﺴﺘﻄﯿﻊ اﻟﻤﺴﺘﺨﺪم‬
‫‪ Scott‬ﺑﺎﻻﺳﺘﻌﻼم ﻋﻠﻰ اﻟﺠﺪول اﻟﻤﻮﻇﻔﯿﻦ ‪ Employees‬اﻟﻤﻮﺟﻮدة ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪-: Company‬‬
‫;‪Grant Select On Employees To Scott‬‬
‫وﺗﺴﻤﻰ ﻃﺮﯾﻘﺔ اﻟﻮﺻﻮل ﻟﻠﺒﯿﺎﻧﺎت ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺑﺎﻟﻄﺮﯾﻘﺔ اﻟﻤﺒﺎﺷﺮة ‪. Direct Access‬‬
‫واﻵن أذا ﻓﺮﺿﻨﺎ إن اﻟﻤﺴﺘﺨﺪم ‪ Scott‬ﻗﺎم ﺑﺈﻧﺸﺎء اﻹﺟﺮاء ‪ Query_emp‬واﻟﺬي ﯾﻌﻤﻞ ﻋﻠﻰ ﻋﺮض ﺑﯿﺎﻧﺎت ﻣﻌﯿﻨﺔ‬
‫ﻣﻦ اﻟﺠﺪول ‪ Employees‬ﻓﻔﻲ ھﺬه اﻟﺤﺎﻟﺔ ﯾﺘﻢ ﺗﺨﺰﯾﻦ ھﺬا اﻹﺟﺮاء ﻓﻲ اﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺴﺘﺨﺪم ‪Scott‬‬
‫وﺑﻤﺎ إن اﻟﻤﺴﺘﺨﺪم أو اﻟﻤﺒﺮﻣﺞ ‪ Scott‬ھﻮ ﻣﺎﻟﻚ ھﺬا اﻹﺟﺮاء ﻓﺬﻟﻚ ﻓﺈن ﻟﮫ اﻟﺤﻖ ﻓﻲ ﻣﻨﺢ اﻣﺘﯿﺎز اﻟﺘﺸﻐﯿﻞ ھﺬا اﻹﺟﺮا ء‬
‫ﻷي ﻣﺴﺘﺨﺪم آﺧﺮ وھﺬا ﻣﺎ ﯾﺴﻤﻰ ﺑﺎﻟﺤﻘﻮق ‪ identifier 's Rights‬واﻵن أذا ﻗﺎم اﻟﻤﺒﺮﻣﺞ ‪ Scott‬ﺑﻤﻨﺢ ﺣﻖ‬
‫اﻟﺘﺸﻐﯿﻞ ‪ Query_emp‬ﻟﻠﻤﺴﺘﺨﺪم ‪ Alsaeedi‬ﻣﺜﻼ ﻛﻤﺎ ﻓﻲ اﻟﻜﻮد اﻟﺘﺎﻟﻲ‪:‬‬
‫;‪Grant EXECUTE On Query_emp To Alsaeedi‬‬
‫وﺑﻤﺎ أن اﻟﻤﺒﺮﻣﺞ ‪ Scott‬ﯾﺘﺼﻞ اﺗﺼﺎل ﻣﺒﺎﺷﺮاً ﺑﺎﻟﺠﺪول ‪ Employees‬ﻋﻦ ﻃﺮﯾﻖ اﻻﻣﺘﯿﺎز اﻟﻤﻤﻨﻮح ﻟﮫ ﻣﻦ ﻗﺒﻞ‬
‫اﻟﻘﺎﻋﺪة ‪ Company‬ﺑــــ‪ Select‬ﻓﯿﻤﻜﻦ ﻟﻠﻤﺴﺘﺨﺪم ‪ Alsaeedi‬اﺳﺘﻌﺮاض ﺑﯿﺎﻧﺎت اﻟﺠﺪول ‪ Employees‬ﻋﻦ‬
‫ﻃﺮﯾﻖ ﺗﺸﻐﯿﻞ اﻹﺟﺮاء ‪ Query_emp‬وﺗﺴﻤﻰ ھﺬه اﻟﻄﺮﯾﻖ ﻟﻠﻮﺻﻮل إﻟﻰ ھﺬه اﻟﺒﯿﺎﻧﺎت ﺑﺎﻻﺗﺼﺎل اﻟﻐﯿﺮ اﻟﻤﺒﺎﺷﺮ‬
‫‪ Indirect Access‬ﺣﯿﺚ ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ‪ Alsaeedi‬ﺑﺎﻟﻮﺻﻮل ﺑﺎﻟﺒﯿﺎﻧﺎت اﻟﺠﺪول ‪ Employees‬اﻟﻤﻮﺟﻮد‬
‫ﺑﺎﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Company‬ﻣﻦ ﺧﻼل ﻣﺴﺘﺨﺪم آﺧﺮ ھﻮ ‪. Scott‬‬
‫أﻣﺎ ﺑﺎﻟﻨﺴﺒﺔ ﻟﺤﻘﻮق اﻟﻤﺴﺘﺨﺪﻣﯿﻦ ‪ Invoker's Rights‬ﻓﺘﺴﺘﺨﺪم ﻟﻠﺘﺄﻛﺪ ﻣﻦ إن ﺟﻤﯿﻊ اﻟﺠﻤﻞ اﻟﻤﻮﺟﻮدة ﺑﺎﻹﺟﺮاءات‬
‫ﺳﻮف ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻃﺒﻘﺎً ﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺴﺘﺨﺪم وﻟﯿﺴﺖ اﻟﺨﺎﺻﺔ ﺑﻤﻨﺸﺊ ھﺬا اﻹﺟﺮاء ﻓﺈذا ﻓﺮﺿﻨﺎ ﻋﻠﻰ‬
‫ﺳﺒﯿﻞ اﻟﻤﺜﺎل أن ﻛﻼ ﻣﻦ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻟﻠﻤﺴﺘﺨﺪﻣﯿﻦ ‪ Scott‬و‪ Alsaeedi‬ﺗﺤﺘﻮي ﻋﻠﻰ ﺟﺪول ﻟﮫ ﻧﻔﺲ اﻻﺳﻢ ھﻮ‬
‫‪ Dept‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﻓﺈذا ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء إﺟﺮاء ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻟـــ‪ Scott‬ﻟﻼﺳﺘﻌﻼم ﻋﻦ اﻟﺠﺪول ‪ Dept‬ﺛﻢ ﻗﻤﻨﺎ‬
‫ﺑﺎﺳﺘﺨﺪام ھﺬا اﻹﺟﺮاء ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Alsaeedi‬ﻧﻼﺣﻆ أﻧﮫ ﺗﻢ ﻋﺮض ﺑﯿﺎﻧﺎت اﻟﺠﺪول ‪ Dept‬اﻟﻤﻮﺟﻮد ﺑﻘﺎﻋﺪة‬
‫اﻟﺒﯿﺎﻧﺎت ‪ Scott‬وﻟﯿﺲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Alsaeedi‬وذﻟﻚ ﻷﻧﮫ ﯾﺘﻢ ﺗﺸﻐﯿﻞ اﻹﺟﺮاء وﻓﻘﺎً ﻹﻋﺪادات اﻟﺤﻔﺎظ ﻋﻠﻰ‬
‫اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﻢ إﻧﺸﺎء اﻹﺟﺮاء ﺑﮭﺎ وإذا أردﻧﺎ ﺗﻨﻔﯿﺬ اﻹﺟﺮاء ﺑﺤﯿﺚ ﯾﺘﻢ اﺳﺘﺨﺪام إﻋﺪادات‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣٦‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫اﻟﺤﻔﺎظ ﻋﻠﻰ اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺴﺘﺨﺪم اﻟﺤﺎﻟﻲ ﺑﺤﯿﺚ ﯾﺘﻢ ﻋﺮض ﺑﯿﺎﻧﺎت اﻟﺠﺪول ‪ Dept‬اﻟﻤﻮﺟﻮد ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت‬
‫‪ Alsaeedi‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪-:‬‬
‫‪Authid Current_user‬‬
‫ﻋﻨﺪ ﺗﻌﺮﯾﻒ اﻹﺟﺮاء ﺗﻌﻤﻞ ھﺬه اﻟﺠﻤﻠﺔ ﻋﻠﻰ ﺗﻨﻔﯿﺬ اﻹﺟﺮاءات ﻃﺒﻘﺎً ﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﻤﺴﺘﺨﺪم اﻹﺟﺮاء وﻟﯿﺴﺖ‬
‫ﺑﻤﻨﺸﺊ ھﺬا اﻹﺟﺮاء ‪.‬‬

‫‪‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ إدارة اﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ ﻓﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ PL/SQL‬أو ‪Procedure‬‬
‫أو اﻟﺘﻄﺒﯿﻘﺎت ‪ .‬وﻹدارة ھﺬه اﻟﻌﻨﺎﺻﺮ ﻻﺑﺪ ﻣﻦ ﻣﻌﺮﻓﺔ ﺑﻌﺾ اﻟﻤﻌﻠﻮﻣﺎت ﻋﻨﮭﺎ وھﺬه اﻟﻤﻌﻠﻮﻣﺎت ﻋﺒﺎرة ﻋﻦ ‪:‬‬
‫• ﻣﻌﻠﻮﻣﺎت ﻋﺎﻣﺔ ﻋﻦ اﻟﻌﻨﺎﺻﺮ ‪General Information‬‬
‫• ﻣﻌﻠﻮﻣﺎت ﻋﻦ اﻻﻛﻮاد اﻷﺳﺎﺳﯿﺔ ﻟﮭﺬه اﻟﻌﻨﺎﺻﺮ ‪Source Code‬‬
‫• ﻣﻌﻠﻮﻣﺎت ﻋﻦ اﻟﻤﻌﻄﯿﺎت ‪Parameters‬‬
‫• ﻣﻌﻠﻮﻣﺎت ﻋﻦ اﻷﺧﻄﺎء اﻟﺘﻲ ﺗﻤﺖ ﺧﻼل ﻋﻤﻠﯿﺔ اﻟﺘﻨﻔﯿﺬ ‪Compilation Error‬‬
‫• ﻣﻌﻠﻮﻣﺎت ﺧﺎﺻﺔ ﺑﻜﯿﻔﯿﺔ ﺗﺘﺒﻊ اﻷﺧﻄﺎء أﺛﻨﺎء ﻣﺮﺣﻠﺔ اﻟﺘﻨﻔﯿﺬ‬
‫وﻹﯾﺠﺎد ﻣﺜﻞ ھﺬه اﻟﻤﻌﻠﻮﻣﺎت ﯾﺘﻢ اﺳﺘﺨﺪام ﺑﻌﺾ اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ ‪ View‬اﻟﻤﻮﺟﻮدة ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻋﻠﻰ ﺳﺒﯿﻞ‬
‫اﻟﻤﺜﺎل ﻟﻠﻮﺻﻮل إﻟﻰ اﻟﻤﻌﻠﻮﻣﺎت اﻟﻌﺎﻣﺔ اﻟﺨﺎﺻﺔ ﺑﺎﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ ﻓﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﺠﺪول‬
‫اﻟﺘﺨﯿﻠﻲ ‪ USER_Objects‬ﻓﺎﻟﻌﺮض اﻷرﻗﺎم اﻟﺘﺴﻠﺴﻠﯿﺔ واﻷﺳﻤﺎء اﻟﺨﺎﺻﺔ ﺑﺠﻤﯿﻊ اﻹﺟﺮاءات واﻟﺪوال اﻟﻤﺨﺰﻧﺔ ﻓﻲ‬
‫ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Scott‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد ‪-:‬‬
‫‪Select Object_id , Object_name‬‬
‫‪From User_Objects‬‬
‫;)'‪Where Object_type IN('PROCEDURE','FUNCTION‬‬
‫ﺣﯿﺚ ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﺠﺪول ‪ User_Objects‬ﻟﻼﺳﺘﺮﺟﺎع ﻛﻼ ﻣﻦ اﻷﻋﻤﺪة ‪ Object_id‬و ‪Object_name‬‬
‫وﺗﺴﺘﺨﺪم اﻟﺠﻤﻠﺔ ‪ Where‬ﻟﻌﻤﻞ ﺗﺼﻔﯿﺔ ﻟﻠﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻹﺟﺮاءات واﻟﻮﻇﺎﺋﻒ ﻓﻘﻂ وذﻟﻚ ﺑﻤﻌﻠﻮﻣﯿﺔ ﻧﻮع اﻟﻌﻨﺼﺮ‬
‫‪ Object_type‬ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ اﻟﺤﺼﻮل ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت إﺿﺎﻓﯿﺔ ﻋﻦ ھﺬه اﻟﻌﻨﺎﺻﺮ ﻣﻦ ﺧﻼل اﻟﺠﺪول ‪User_Objects‬‬
‫وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺤﻘﻮل اﻟﻤﺨﺘﻠﻔﺔ ﻓﻲ ھﺬا اﻟﺠﺪول وﻟﻌﺮض ﺗﻔﺎﺻﯿﻞ اﻟﺤﻘﻮل اﻟﻤﻮﺟﻮدة ﺑﮭﺬا اﻟﺠﺪول ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام‬
‫اﻷﻣﺮ ‪ . Desc User_Objects :‬أﻣﺎ اﻟﺠﺪول ‪ User_Source‬ﻓﯿﻘﻮم ﺑﺘﺨﺰﯾﻦ اﻟﻤﻌﻠﻮﻣﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻷﻛﻮاد‬
‫اﻷﺳﺎﺳﯿﺔ ب ‪ Source Code‬ﻟﻠﻌﻨﺎﺻﺮ وﯾﺤﺘﻮي ھﺬا اﻟﺠﺪول ﻋﻠﻰ اﻷﻋﻤﺪة ‪ Name‬و ‪ Text‬و ‪ Type‬و‬
‫‪ Line‬واﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت ﻋﻦ أﺳﻢ وﻧﻮع اﻟﻌﻨﺼﺮ واﻟﻜﺘﺎﺑﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻻ ﻛﻮاد اﻷﺳﺎﺳﯿﺔ ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ ﻋﺪد‬
‫أﺳﻄﺮ ھﺬه اﻟﻜﺘﺎﺑﺎت ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻋﺮض اﻟﻜﻮد اﻷﺳﺎﺳﻲ ﻟﻺﺟﺮاء ‪ LOG_EXECUTION‬اﻟﺬي‬
‫ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ ﻣﻦ ﻗﺒﻞ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد ‪-:‬‬
‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣٧‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Select Text‬‬
‫‪From User_Source‬‬
‫'‪Where name='LOG_EXECUTION‬‬
‫;‪Order by Line‬‬
‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻟﺠﺪول ‪ User_Source‬ﻟﻼﺳﺘﺮﺟﺎع اﻟﻜﻮد اﻟﺨﺎص ﺑﺎﻹﺟﺮاء ‪LOG_EXECUTION‬‬
‫واﻟﺬي ﯾﺘﻢ ﺗﺨﺰﯾﻨﮫ ﻓﻲ اﻟﻌﻤﻮد ‪ Text‬ﻛﻤﺎ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Order by‬ﻟﺘﺮﺗﯿﺐ اﻟﻨﺘﺎﺋﺞ ﺣﺴﺐ رﻗﻢ اﻟﺴﻄﺮ اﻟﺬي‬
‫ﯾﺘﻢ ﺗﺨﺰﯾﻨﮫ ﻓﻲ اﻟﻌﻤﻮد ‪. Line‬‬

‫‪‬‬
‫ﻓﻲ ﺑﻌﺾ اﻷﺣﯿﺎن ﻗﺪ ﻧﺤﺘﺎج إﻟﻰ ﻋﺮض اﻷﺧﻄﺎء اﻟﺘﻲ ﺣﺪﺛﺖ أﺛﻨﺎء ﻋﻤﻠﯿﺔ ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ وﻟﻌﻤﻞ ذﻟﻚ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام‬
‫اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ‪ User_Errors‬واﻟﺬي ﯾﻌﻤﻞ ﻋﻠﻰ ﺗﺨﺰﯾﻦ اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﺒﯿﺎﻧﺎت ﻛﻤﺎ ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ ‪-:‬‬

‫وﻟﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﺳﺘﻌﺮاض اﻟﻤﻌﻠﻮﻣﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻷﺧﻄﺎء اﻟﺘﻲ ﻗﺪ ﺗﺤﺪث أﺛﻨﺎء ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ ﻧﻘﻮم ﺑﺘﺸﻐﯿﻞ ھﺬا‬
‫اﻟﻜﻮد ‪-:‬‬

‫ﻓﻌﻨﺪ اﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح ‪ Enter‬ﺗﻈﮭﺮ ﻟﻨﺎ ﻋﺪة أﺧﻄﺎء ﻧﺘﯿﺠﺔ ﺗﺸﻐﯿﻞ ھﺬا اﻟﻜﻮد وﻟﻌﺮض اﻟﺘﻔﺎﺻﯿﻞ اﻟﺨﺎﺻﺔ ﺑﮭﺬه‬
‫اﻷﺧﻄﺎء واﻟﺴﻄﺮ اﻟﻤﺴﺒﺐ ﻓﻲ ﻇﮭﻮر ھﺬا اﻟﺨﻄﺄ وﻣﻮﺿﻊ اﻟﺨﻄﺄ داﺧﻞ ھﺬا اﻟﺴﻄﺮ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد‪-:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣٨‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ‪ User_Errors‬ﻻﺳﺘﻌﺮاض ﻛﻼ ﻣﻦ رﻗﻢ اﻟﺴﻄﺮ ‪ Line‬اﻟﺬي ﯾﺤﺘﻮي ﻋﻠﻰ‬
‫اﻟﺨﻄﺄ وﻣﻮﻗﻊ اﻟﺨﻄﺄ ‪ Position‬ﯾﻔﺼﻞ ﺑﯿﻨﮭﻤﺎ اﻟﻌﻼﻣﺔ '‪ '/‬ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ اﻟﻜﺘﺎﺑﺎت اﻟﺘﻲ ﺗﺼﻒ ھﺬا اﻟﺨﻄﺄ ‪Text‬‬
‫واﻟﺘﻲ ﯾﺘﻢ ﺗﺨﺰﯾﻨﮭﺎ ﻓﻲ اﻟﻌﻤﻮد ‪ text‬وﻋﻨﺪ ﺗﺸﻐﯿﻞ ھﺬا اﻟﻜﻮد ‪ Enter‬ﻧﻼﺣﻆ ﻋﺮض ﺟﻤﯿﻊ اﻷﺧﻄﺎء اﻟﺘﻲ ﺣﺪﺛﺖ ﻋﻨﺪ‬
‫‪Show Errors‬‬ ‫ﺗﻨﻔﯿﺬ ھﺬا اﻹﺟﺮاء ‪ .‬ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ أﯾﻀﺎ اﺳﺘﺨﺪام اﻷﻣﺮ ‪:‬‬
‫ﻟﻤﻌﺮﻓﺔ اﻷﺧﻄﺎء اﻟﺘﻲ ﺗﺤﺪث ﻷي ﻋﻨﺼﺮ ﻣﻦ اﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ ﻓﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻓﺎﻻﺳﺘﻌﺮاض اﻟﺨﻄﺄ اﻟﺘﻲ ﺣﺪﺛﺖ ﻋﻨﺪ‬
‫ﺗﺸﻐﯿﻞ اﻹﺟﺮاء ‪ LOG_EXECUTION‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد ‪-:‬‬
‫;‪SHOW ERRORS PROCEDURE Log_execution‬‬
‫ﻓﻨﻼﺣﻆ ﻧﻔﺲ اﻟﻨﺘﺎﺋﺞ اﻟﺴﺎﺑﻘﺔ ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ اﻟﺘﺎﻟﻲ ‪:‬‬

‫وﻟﻌﺮض ﺗﻔﺎﺻﯿﻞ أي ﻣﻌﻄﯿﺎت ﺧﺎﺻﺔ ﻣﻦ اﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ ﺑﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ ‪:‬‬
‫‪Desc Object_name‬‬
‫ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻋﺮض ﺗﻔﺎﺻﯿﻞ اﻟﻤﻌﻄﯿﺎت اﻟﺘﻲ ﯾﺘﻢ ﺗﻤﺮﯾﺮھﺎ ﻟﻺﺟﺮاء ‪ LOG_EXECUTION‬ﻧﻘﻮم‬
‫‪Desc LOG_EXECUTION‬‬ ‫ﺑﻜﺘﺎﺑﺔ اﻟﻜﻠﻤﺔ ‪-:‬‬
‫وﺑﺘﺸﻐﯿﻞ ھﺬا اﻟﻜﻮد ﻧﻼﺣﻆ اﻧﮫ ﺗﻢ ﻋﺮض ﺛﻼﺛﺔ أﻋﻤﺪة ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٣٩‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Debugging                 ‬‬
‫ﺗﺴﻤﺢ ﻟﻨﺎ اﻟﻠﻐﺔ ‪ PL/SQL‬ﺑﺈﻣﻜﺎﻧﯿﺔ ﻋﻤﻞ ﺗﻨﻘﯿﺢ أو‪ Debugging‬ﻟﻠﺒﺮﻧﺎﻣﺞ وذﻟﻚ ﻟﻠﻮﻗﻮف ﻋﻠﻰ اﻷﺧﻄﺎء اﻟﺘﻲ ﯾﻤﻜﻦ‬
‫أن ﯾﺤﺘﻮﯾﮭﺎ وﺧﺼﻮﺻﺎً اﻷﺧﻄﺎء اﻟﻤﻨﻄﻘﯿﺔ ‪ Logical Errors‬وﯾﺘﻢ ذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ‬
‫‪ DBMS_OUTPUT Package‬وﺗﺤﺘﻮي ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻋﻠﻰ اﻹﺟﺮاء ‪PUT_LINE‬‬
‫‪DBMS_OUTPUT Package‬‬ ‫‪PUT_LINE‬‬
‫واﻟﺬي ﯾﻤﻠﻜﮫ اﻟﻤﺴﺘﺨﺪم ‪ Sys‬ﺣﯿﺚ ﯾﻤﻜﻨﻨﺎ اﺳﺘﺨﺪام إﺟﺮاءات ھﺬه اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﻟﻌﺮض اﻟﻘﯿﻢ واﻟﺮﺳﺎﺋﻞ ﻣﻦ‬
‫ﻗﻮاﻟﺐ اﻟﻠﻐﺔ ‪ PL/SQL‬وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ ﺗﺨﺰﯾﻦ ھﺬه اﻟﻘﯿﻢ واﻟﺮﺳﺎﺋﻞ ﻓﻲ اﻟﺬاﻛﺮة ‪ Buffer‬ﺛﻢ اﻟﺴﻤﺎح ﺑﻌﺮض ھﺬه‬
‫اﻟﻘﯿﻢ واﻟﺮﺳﺎﺋﻞ ﻣﻦ اﻟﺬاﻛﺮة ﻟﻠﺘﺄﻛﺪ ﻣﻦ أن ﻧﺘﺎﺋﺞ اﻟﺒﺮﻧﺎﻣﺞ ﺗﻈﮭﺮ ﺑﺼﻮرة ﺻﺤﯿﺤﺔ وﺣﺴﺐ اﻟﺘﺴﻠﺴﻞ اﻟﺼﺤﯿﺢ ﻟﻠﺨﻄﻮات‬
‫ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ھﺬا اﻟﻜﻮد ‪:‬‬

‫]‪1‬‬
‫]‪2‬‬
‫]‪3‬‬
‫]‪4‬‬
‫]‪5‬‬
‫]‪6‬‬
‫]‪7‬‬
‫]‪8‬‬
‫]‪9‬‬
‫]‪1‬‬
‫]‪10‬‬
‫]‪11‬‬

‫ھﺬا اﻟﻜﻮد ﯾﺴﺘﺨﺪم ﻹﯾﺠﺎد اﻟﻤﻀﺮوب ‪ Factorial‬ﻟﻠﺮﻗﻢ اﻟﺬي ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺈدﺧﺎﻟﮫ ﻋﻨﺪ ﺗﺸﻐﯿﻞ اﻟﺒﺮﻧﺎﻣﺞ‬
‫وﻣﻀﺮوب أي رﻗﻢ ھﻮ ﻋﺒﺎرة ﻋﻦ ﺣﺎﺻﻞ ھﺬا اﻟﺮﻗﻢ ﻓﻲ ﻣﻀﺮوب اﻟﺮﻗﻢ اﻟﺬي ﯾﺴﺒﻘﮫ ‪  :‬‬

‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء ﺣﻠﻘﺔ ﺗﻜﺮارﯾﺔ ﻓﻲ اﻟﺴﻄﺮ ‪ 5‬ﻹﯾﺠﺎد ﻣﻀﺮوب اﻟﺮﻗﻢ اﻟﺬي ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺈدﺧﺎﻟﮫ ‪ ،‬وﺗﺴﺘﺨﺪم ھﺬه اﻟﻤﻌﺎدﻟﺔ ﻓﻲ اﻟﺴﻄﺮ ‪6‬‬
‫داﺧﻞ اﻟﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﻟﺤﺴﺎب ﻣﻀﺮوب اﻟﺮﻗﻢ ‪ i‬داﺧﻞ اﻟﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﻓﻔﻲ اﻟﺪورة اﻷوﻟﻰ ﻟﻠﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﺗﻜﻮن ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ ‪i=1‬‬
‫وﺑﺎﻟﺘﺎﻟﻲ ﯾﺘﻢ ﺣﺴﺎب ﻣﻀﺮوب ‪ 1‬وھﻮ ‪ 1‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺣﯿﺚ أن اﻟﻘﯿﻤﺔ اﻻﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﺘﻐﯿﺮ ‪ Factorial = 1‬وﻓﻲ اﻟﺪورة اﻟﺜﺎﻧﯿﺔ‬
‫ﻟﻠﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﺗﺼﺒﺢ ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ ‪ i=2‬وﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺳﻮف ﯾﺘﻢ ﺣﺴﺎب اﻟﻤﻀﺮو ب ‪ 2‬وھﻮ ﻋﺒﺎرة ﻋﻦ ﺿﺮب ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ‬
‫‪ i=2*1‬وﯾﺘﻢ ﺗﻜﺮار ﺗﻨﻔﯿﺬ اﻟﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﺑﻨﻔﺲ اﻟﻄﺮﯾﻘﺔ إﻟﻰ أن ﺗﺼﻞ ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ ‪ i‬إﻟﻰ اﻟﻘﯿﻤﺔ اﻟﺘﻲ ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺈدﺧﺎﻟﮭﺎ ﻛﻤﺎ ﻓﻲ‬
‫اﻟﺴﻄﺮ‪ 7‬ﻓﯿﺘﻢ اﻟﺨﺮوج ﻣﻦ اﻟﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﻓﻲ اﻟﺴﻄﺮ‪ 9‬وﻟﺘﺘﺒﻊ ﺧﻄﻮات اﻟﻘﯿﻤﺔ اﻟﺘﻜﺮارﯾﺔ ﺑﺤﯿﺚ ﺗﻈﮭﺮ رﺳﺎﻟﺔ ﺗﺸﯿﺮ إﻟﻰ رﻗﻢ اﻟﺬي ﯾﺘﻢ‬
‫إﯾﺠﺎد اﻟﻤﻀﺮوب ﻟﮫ ﻓﻲ ھﺬه اﻟﺨﻄﻮة وﻗﯿﻤﺔ ﻣﻀﺮوب ھﺬا اﻟﺮﻗﻢ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ‪. 8‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤٠‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪‬‬ ‫‪Packages    ‬‬ ‫‪‬‬

‫‪Bodiless Body‬‬

‫ھﻲ ﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺎت ﺑﺮﻣﺠﯿﺔ ﻻ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻘﺴﻢ ‪ Body‬ﻓﮭﻲ ﺗﻌﺘﻤﺪ ﻋﻠﻰ اﻟﻘﺴﻢ ‪ Specification‬ﻓﻘﻂ ﻓﻲ‬
‫ﺗﻌﺮﯾﻒ اﻟﻤﺘﻐﯿﺮات واﻟﺜﻮاﺑﺖ واﻻﺳﺘﺜﻨﺎ ءات ‪:‬‬
‫‪Variable‬‬
‫‪Constants‬‬
‫‪Exceptions‬‬
‫وﻻ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻘﺴﻢ ‪ Body‬وذﻟﻚ ﻟﻌﺪم اﺣﺘﻮاﺋﮭﺎ ﻋﻠﻰ ﺑﺮاﻣﺞ ﻓﺮﻋﯿﺔ وﯾﺴﺘﺨﺪم ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﺠﻤﻮﻋﺎت‬
‫اﻟﺒﺮﻣﺠﯿﺔ ﻋﺎدة ً ﻓﻲ ﺗﻌﺮﯾﻒ ﺑﻌﺾ اﻟﻤﺘﻐﯿﺮات واﻟﺜﻮاﺑﺖ اﻟﻌﺎﻣﺔ‪-:‬‬
‫‪Public Constants and variable‬‬
‫اﻟﺘﻲ ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮭﺎ ﺑﻄﺮﯾﻘﺔ ﻣﺘﻜﺮرة ﻣﻦ ﻗﺒﻞ أﻛﺜﺮ ﻣﻦ ﻣﺴﺘﺨﺪم ﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ‪-:‬‬

‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻒ ﻣﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ ﻟﮭﺎ اﻻﺳﻢ ‪ global_consts‬وﻗﺪ ﻗﻤﻨﺎ ﻓﻲ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ ﺑﺘﻌﺮﯾﻒ ﻋﺪة ﺛﻮاﺑﺖ‬
‫ﻟﺘﺨﺰﯾﻦ ﻗﯿﻢ اﻟﻨﺴﺐ اﻟﺘﺤﻮﯾﻠﯿﺔ ﺑﯿﻦ وﺣﺪات اﻟﻘﯿﺎس اﻟﻤﺨﺘﻠﻔﺔ ﻟﻠﻤﺴﺎﻓﺎت ‪:‬‬
‫‪Mile_2_kilo‬‬
‫‪Kilo_2_mile‬‬
‫‪Yard_2_meter‬‬
‫‪Meter_2_yard‬‬
‫ﻛﻤﺎ ﻧﻼﺣﻆ أن ھﺬه اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﻻ ﺗﺘﻄﻠﺐ ﺗﻌﺮﯾﻒ اﻟﻘﺴﻢ ‪ Body‬وذﻟﻚ ﻻن ﺟﻤﯿﻊ اﻟﻌﻨﺎﺻﺮ اﻟﻤﻮﺟﻮدة ﻓﻲ‬
‫اﻟﻘﺴﻢ ﻋﺒﺎرة ﻋﻦ ﺛﻮاﺑﺖ وﯾﻤﻜﻨﻨﺎ اﺳﺘﺪﻋﺎء إي ﻣﻦ اﻟﺜﻮاﺑﺖ اﻟﻌﺎﻣﺔ اﻟﺘﻲ ﺗﻢ ﺗﻌﺮﯾﻔﮭﺎ ﻓﻲ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ اﻟﺴﺎﺑﻘﺔ‬
‫ﻓﻲ ﺑﺮاﻣﺞ ﻓﺮﻋﯿﺔ ﻣﺴﺘﻘﻠﺔ ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ‪-:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤١‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻟﺜﺎﺑﺖ ‪ Meter_2_yard‬اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ global_consts‬وذﻟﻚ ﻓﻲ‬
‫اﻹﺟﺮاء ‪ meter_2_yard‬اﻟﺬي ﯾﻘﻮم ﺑﺘﺤﻮﯾﻞ اﻟﻤﺴﺎﻓﺔ ﻣﻦ اﻟﻤﺘﺮ إﻟﻰ اﻟﯿﺎرد ‪.‬‬

‫‪Package Specification   ‬‬


‫ﺗﻨﻘﺴﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ Package‬إﻟﻰ ﻗﺴﻤﯿﻦ ‪:‬‬
‫‪Package Body‬‬ ‫‪-١‬‬
‫‪Package Specification‬‬ ‫‪-٢‬‬
‫وﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﻧﺸﺎء اﻟﻘﺴﻢ ‪ Package Specification‬ﺣﯿﺚ ﯾﺴﺘﺨﺪم ھﺬا اﻟﻘﺴﻢ ﻟﺘﻌﺮﯾﻒ ﺟﻤﯿﻊ‬
‫اﻟﻤﻜﻮﻧﺎت ﻛﻌﻨﺎﺻﺮ ﻋﺎﻣﺔ ‪ Public‬ﺑﺤﯿﺚ ﯾﻤﻜﻦ اﺳﺘﺪﻋﺎء إي ﻣﻦ ھﺬه اﻟﻌﻨﺎﺻﺮ ﺧﺎرج اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻓﻲ أي ﺑﯿﺌﺔ‬
‫ﺗﺸﻐﯿﻞ ﻟﻠﺨﺎدم أوراﻛﻞ ‪ Oracle server‬واﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﺘﻌﺮﯾﻒ اﻟﻘﺴﻢ ‪ Package Specification‬ھﻲ‬
‫ﻛﺎﻟﺘﺎﻟﻲ‪-:‬‬

‫ﺣﯿﺚ ﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ ‪ Create‬وھﻲ اﻟﺠﻤﻠﺔ اﻟﺘﻲ ﺗﺴﺘﺨﺪم ﻹﻧﺸﺎء اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﯾﻠﯿﮭﺎ اﻟﻜﻠﻤﺎت‬
‫]‪ [OR REPLACE‬وﺗﻌﻤﻞ ھﺬه اﻟﻜﻠﻤﺎت ﻋﻠﻰ ﻋﻤﻞ اﺳﺘﺒﺪال ﻟﺘﻌﺮﯾﻒ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﺑﺎﻟﺘﻌﺮﯾﻔﺎت اﻟﺠﺪﯾﺪة‬
‫وذﻟﻚ ﻓﻲ ﺣﺎﻟﺔ وﺟﻮد ﻣﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ ﻟﮭﺎ ﻧﻔﺲ اﻻﺳﻢ وھﺬه اﻟﻜﻠﻤﺎت ھﻲ ﻛﻠﻤﺎت اﺧﺘﯿﺎرﯾﺔ ‪ Optional‬ﺛﻢ اﻟﻜﻠﻤﺔ‬
‫‪ Package‬ﯾﻠﯿﮭﺎ أﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ Package_name‬ﺛﻢ اﻟﻜﻠﻤﺔ ‪ IS / AS‬ﯾﻠﯿﮭﺎ اﻟﺘﻌﺮﯾﻔﺎت اﻟﺨﺎﺻﺔ‬
‫ﺑﻤﻜﻮﻧﺎت اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﻣﻦ ﺑﺮاﻣﺞ ﻓﺮﻋﯿﺔ وﻣﺘﻐﯿﺮات وﻏﯿﺮھﺎ ﻣﻦ اﻟﻌﻨﺎﺻﺮ اﻷﺧﺮى ﺛﻢ اﻟﻜﻠﻤﺔ ‪ END‬ﯾﻠﯿﮭﺎ‬
‫‪. Package_name‬‬ ‫أﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤٢‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ‪-:‬‬

‫ﺣﯿﺚ ﯾﺘﻢ ﺗﻌﺮﯾﻒ ﻛﻼً ﻣﻦ اﻹﺟﺮاء ‪ Find_ename‬واﻟﻮﻇﯿﻔﺔ ‪ Check_salary‬ﻓﻲ اﻟﻘﺴﻢ ‪Specification‬‬


‫ﻟﻠﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ manage_employees‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Create Or Replace Package‬ﺣﯿﺚ‬
‫ﯾﻌﻤﻞ اﻹﺟﺮاء ‪ Find_ename‬ﻋﻠﻰ إﯾﺠﺎد أﺳﻢ اﻟﻤﻮﻇﻒ وراﺗﺒﮫ أﻣﺎ اﻟﻮﻇﯿﻔﺔ ‪ Check_salary‬ﺗﻘﻮم ﺑﻔﺤﺺ اﻟﺮاﺗﺐ‬
‫اﻟﺨﺎص ﺑﺎﻟﻤﻮﻇﻒ وﯾﺠﺐ ﻣﻼﺣﻈﺔ إن ﺟﻤﯿﻊ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ واﻟﻤﺘﻐﯿﺮات اﻟﺘﻲ ﯾﺘﻢ ﺗﻌﺮﯾﻔﮭﺎ ﻓﻲ اﻟﻘﺴﻢ‬
‫‪ Specification‬ﺗﻜﻮن ﻣﻦ اﻟﻨﻮع ‪ Public‬ﺑﺤﯿﺚ ﯾﻤﻜﻦ اﺳﺘﺨﺪاﻣﮭﺎ ﺧﺎرج اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ اﻟﻤﻌﺮﻓﺔ ﺑﮭﺎ‪.‬‬

‫‪Package Body    ‬‬

‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﻧﺸﺎء اﻟﻘﺴﻢ اﻟﺜﺎﻧﻲ ﻣﻦ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ وھﻮ اﻟﻘﺴﻢ ‪ Body‬ﺣﯿﺚ ﯾﺘﻢ‬
‫ﺗﺨﺰﯾﻦ ﻛﻼ ً ﻣﻦ ‪ Specification ، Body‬ﺑﺼﻮرة ﻣﻨﻔﺼﻠﺔ ﻋﻠﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻟﺬﻟﻚ ﻓﻘﺪ ﻗﻤﻨﺎ ﺑﺘﻨﺎول ھﺬه اﻷﻗﺴﺎم‬
‫ﺑﺼﻮرة ﻣﻨﻔﺼﻠﺔ ﻟﻤﺰﯾﺪ ﻣﻦ اﻟﺘﻮﺿﯿﺢ وﻧﺬﻛﺮه ھﻨﺎ أﻧﮫ ﻻﺑﺪ ﻣﻦ إﻧﺸﺎء ھﺬه اﻷﻗﺴﺎم ﺑﻄﺮﯾﻘﺔ ﻣﻨﻔﺼﻠﺔ ﻓﻲ ﺑﺮﻧﺎﻣﺞ‬
‫‪ SQL*PLUS‬أو ‪ iSQL*PLUS‬وﯾﺤﺘﻮي اﻟﻘﺴﻢ ‪ Body‬ﻋﻠﻰ اﻟﻜﻮد اﻟﺘﻨﻔﯿﺬي اﻟﺨﺎص ﺑﺎﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﺘﻲ ﺗﻢ‬
‫ﺗﻌﺮﯾﻔﮭﺎ ﻓﻲ اﻟﻘﺴﻢ ‪ Specification‬ﻛﻤﺎ ﯾﻤﻜﻦ أن ﺗﺤﺘﻮي أﯾﻀﺎ ﻋﻠﻰ ﻋﻨﺎﺻﺮ أﺧﺮى ﻟﻢ ﯾﺘﻢ ﺗﻌﺮﯾﻔﮭﺎ ﻓﻲ اﻟﻘﺴﻢ‬
‫‪ Specification‬وﺑﺎﻟﺘﺎﻟﻲ ﺗﻜﻮن ھﺬه اﻟﻌﻨﺎﺻﺮ ﻣﻦ اﻟﻌﻨﺎﺻﺮ اﻟﺨﺎﺻﺔ ‪ Private‬أي ﻻﯾﻤﻜﻦ اﺳﺘﺪﻋﺎءھﺎ إﻻ ً داﺧﻞ‬
‫ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻓﻘﻂ وﯾﺘﻢ إﻧﺸﺎء اﻟﻘﺴﻢ ‪ Body‬ﺑﺎﺳﺘﺨﺪام اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤٣‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﻨﻔﺲ اﻟﺠﻤﻠﺔ اﻟﺨﺎﺻﺔ ﺑﺈﻧﺸﺎء اﻟﺠﺰء ‪ Specification‬ﯾﻠﯿﮭﺎ اﻟﻜﻠﻤﺔ ‪ Body‬ﺛﻢ اﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ‬
‫اﻟﺒﺮﻣﺠﯿﺔ اﻟﺘﻲ ﺗﻢ ﺗﻌﯿﯿﻨﮭﺎ ﻓﻲ اﻟﺠﺰء ‪ Specification‬ﺛﻢ اﻟﻜﻠﻤﺔ ‪ IS / AS‬ﯾﻠﯿﮭﺎ ﻣﺠﻤﻮﻋﺔ اﻷﻛﻮاد اﻟﺘﻨﻔﯿﺬﯾﺔ‬
‫اﻟﺨﺎﺻﺔ ﺑﺎﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ‪ Subprogram bodies‬اﻟﺘﻲ ﺗﻢ ﺗﻌﺮﯾﻔﮭﺎ ﺑﺎﻟﻘﺴﻢ ‪ Specification‬ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ‬
‫اﻟﻌﻨﺎﺻﺮ اﻟﺨﺎﺻﺔ ‪ Private type and item declaration‬وﯾﺘﻢ إﻧﮭﺎء اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﺑﺎﻟﻜﻠﻤﺔ ‪END‬‬
‫ﯾﻠﯿﮭﺎ أﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ . Package_name‬ﻓﺈذا أردﻧﺎ اﺳﺘﻜﻤﺎل اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ‬
‫‪ manage_employees‬اﻟﺬي ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻔﮭﺎ ﻓﻲ اﻟﺠﺰء اﻟﺴﺎﺑﻖ ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد ‪:‬‬

‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﻜﺘﺎﺑﺔ اﻟﺠﺰء اﻟﺘﻨﻔﯿﺬي ﻟﻺﺟﺮاء ‪ Find_name‬واﻟﺬي ﯾﻘﻮم ﺑﺎﺳﺘﺮﺟﺎع أﺳﻢ اﻟﻤﻮﻇﻒ وراﺗﺒﮫ ﺑﻤﻌﻠﻮﻣﯿﺔ رﻗﻢ‬
‫ھﺬا اﻟﻤﻮﻇﻒ ﺛﻢ ﯾﻘﻮم ﺑﻜﺘﺎﺑﺔ اﻟﻜﻮد اﻟﺘﺎﻟﻲ‪-:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤٤‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﯾﺤﺘﻮي ھﺬا اﻟﻜﻮد ﻋﻠﻰ اﻟﺠﺰء اﻟﺘﻨﻔﯿﺬي ﻟﻠﻮﻇﯿﻔﺔ ‪ Check_salary‬ﺗﻘﻮم ھﺬه اﻟﻮﻇﯿﻔﺔ ﺑﻔﺤﺺ اﻟﺮاﺗﺐ اﻟﺨﺎص‬
‫ﺑﺎﻟﻤﻮﻇﻒ ﻓﺈذا ﻛﺎن ھﺬا اﻟﺮاﺗﺐ ‪ >2000‬ﯾﻜﻮن ﻧﺎﺗﺞ ھﺬه اﻟﻮﻇﯿﻔﺔ ‪ True‬أﻣﺎ أذا ﻛﺎﻧﺖ أﻗﻞ ﻣﻦ‪ <2000‬ﯾﻜﻮن اﻟﻨﺎﺗﺞ‬
‫‪ False‬وﯾﺠﺐ أن ﻧﺬﻛﺮ ھﻨﺎ أﻧﮫ ﻓﻲ ﺣﺎﻟﺔ اﺳﺘﺨﺪام ﻋﻨﺎﺻﺮ ﺧﺎﺻﺔ ‪ Private Object‬ﻓﻲ ھﺬا اﻟﺠﺰء ﻓﻼﺑﺪ ﻣﻦ‬
‫ﺗﻌﺮﯾﻔﮭﺎ ﻗﺒﻞ اﻟﻌﻨﺎﺻﺮ اﻟﻌﺎﻣﺔ ‪.‬‬

‫‪Packages  ‬‬


‫ﺑﻌﺪ ﺗﺨﺰﯾﻦ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﻓﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﯾﻤﻜﻦ اﺳﺘﺪﻋﺎء ﻋﻨﺎﺻﺮ ھﺬه اﻟﻤﺠﻤﻮﻋﺎت داﺧﻞ أو ﺧﺎرج‬
‫اﻟﻤﺠﻤﻮﻋﺎت اﻟﺨﺎﺻﺔ ﻟﮭـﺎ وذﻟﻚ ﺑﻨﺎء ﻋﻠﻰ ﻛﻮن ھﺬه اﻟﻌﻨﺎﺻﺮ ﻋﻨﺎﺻﺮ ﺧﺎﺻﺔ ‪ Private‬أو ﻋﻨﺎﺻﺮ ﻋﺎﻣﺔ ‪Public‬‬
‫ﻓﻌﻨﺪ اﺳﺘﺪﻋﺎء اﻟﻌﻨﺎﺻﺮ داﺧﻞ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ اﻟﺨﺎﺻﺔ ﺑﮭﺎ ﻓﺈن ذﻟﻚ ﻻ ﯾﺘﻄﻠﺐ ﻛﺘﺎﺑﺔ اﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ‬
‫ﻗﺒﻞ أﺳﻤﺎء ھﺬه اﻟﻌﻨﺎﺻﺮ ‪.‬‬
‫ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل إذا أردﻧﺎ اﺳﺘﺪﻋﺎء اﻟﻮﻇﯿﻔﺔ‬
‫‪Validate_comm‬‬ ‫‪reset_comm‬‬
‫ﻟﻠﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ Comm_package‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد ‪-:‬‬

‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ أﺳﻢ اﻟﻮﻇﯿﻔﺔ ‪ Validate_comm‬ﺑﺪون اﻟﺘﻘﯿّﺪ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ اﻟﺨﺎﺻﺔ ﺑﮭﺎ أﻣﺎ إذا أردﻧﺎ‬
‫اﺳﺘﺪﻋﺎء أي ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ ﻟﻤﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ ﻓﻲ ﺑﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ ‪ SQL*PLUS‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ‪-:‬‬
‫‪EXECUTE Package_name.subprogram_name‬‬
‫ﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻷﻣﺮ ‪ EXECUTE‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ Package_name‬ﺛﻢ اﻟﺮﻣﺰ دوت ]‪ [.‬ﯾﻠﯿﮫ‬
‫اﺳﻢ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ‪ Subprogram_name‬اﻟﺬي ﻧﺮﯾﺪ اﺳﺘﺪﻋﺎءه ‪ .‬ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل أذا أردﻧﺎ اﺳﺘﺪﻋﺎء‬
‫اﻹﺟﺮاء ‪ reset_comm‬ﺧﺎرج اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ Comm_pcakage‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد ‪-:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤٥‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫;)‪EXECUTE Comm_package.reset_comm(0.10‬‬
‫ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ اﺳﺘﺪﻋﺎء اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﺨﺎﺻﺔ ﺑﻤﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ ﻣﻌﯿﻨﺔ ﻣﻦ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أﺧﺮى وذﻟﻚ ﺑﺎﺳﺘﺨﺪام‬
‫ھﺬه اﻟﺼﯿﻐﺔ ‪:‬‬
‫; ‪EXECUTE Schema_name.package_name.Subprogram_name‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻷﻣﺮ ‪ EXECUTE‬ﺛﻢ أﺳﻢ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Schema_name‬اﻟﻤﻮﺟﻮد ﺑﮭﺎ ھﺬه اﻟﻤﺠﻤﻮﻋﺎت‬
‫اﻟﺒﺮﻣﺠﯿﺔ ﯾﻠﯿﮭﺎ اﻟﺮﻣﺰ دوت ]‪ [.‬ﺛﻢ اﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ Package_name‬ﯾﻠﯿﮫ اﻟﺮﻣﺰ دوت ]‪ [.‬ﺛﻢ اﺳﻢ‬
‫اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ‪ Subprogram_name‬اﻟﺬي ﻧﺮﯾﺪ اﺳﺘﺪﻋﺎءه‪.‬‬
‫ﻓﺈذا أردﻧﺎ اﺳﺘﺪﻋﺎء اﻹﺟﺮاء ‪ reset_comm‬اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ comm_package‬اﻟﻤﻮﺟﻮدة‬
‫ﺑﺎﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت وﻟﺘﻜﻦ ‪ Company‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد ‪-:‬‬
‫;)‪EXECUTE Company.Comm_package.reset_comm(0.10‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻷﻣﺮ ‪ EXECUTE‬ﯾﻠﯿﮭﺎ أﺳﻢ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Company‬اﻟﻤﻮﺟﻮد ﺑﮭﺎ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ‬
‫‪.‬‬ ‫‪ Comm_package‬ﺛﻢ اﻟﺮﻣﺰ دوت ]‪ [.‬ﯾﻠﯿﮫ اﺳﻢ اﻹﺟﺮاء اﻟﺬي ﻧﺮﯾﺪ اﺳﺘﺪﻋﺎءه وھﻮ ‪reset_comm‬‬

‫‪Forward declarationOverloading‬‬

‫ﺗﻌﺘﺒﺮ ھﺬه اﻟﺨﺎﺻﯿﺔ ‪ Overloading‬ﻣﻦ أھﻢ اﻟﺨﺼﺎﺋﺺ اﻟﺘﻲ ﺗﻮﻓﺮھﺎ ﻟﻨﺎ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ Package‬ﺣﯿﺚ‬
‫ﺗﻤﻜﻨﻨﺎ ھﺬه اﻟﺨﺎﺻﯿﺔ ﻣﻦ إﻧﺸﺎء اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺑﻨﻔﺲ اﻻﺳﻢ ﻓﻔﻲ ﺑﻌﺾ اﻷﺣﯿﺎن ﯾﻮﺟﺪ ﻋﺪد ﻣﻦ اﻹﺟﺮاءات‬
‫ﻟﮭﺎ ﻧﻔﺲ اﻟﻮﻇﯿﻔﺔ وﻟﻜﻦ ﺑﻌﺪد ﻣﺨﺘﻠﻒ ﻣﻦ اﻟﻤﻌﻄﯿﺎت وﻣﻦ اﻟﻤﻨﻄﻘﻲ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ أن ﺗﺄﺧﺬ ﺟﻤﯿﻊ ھﺬه اﻹﺟﺮاءات ﻧﻔﺲ‬
‫اﻻﺳﻢ ﺣﯿﺚ ﺗﻘﻮم اﻟﻠﻐﺔ ‪ PL/SQL‬ﺑﺎﻟﺘﻌﺮف ﻋﻠﻰ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ اﻟﺬي ﺳﻮف ﯾﺘﻢ ﺗﻨﻔﯿﺬه ﻃﺒﻘﺎً ﻟﻠﻤﻌﻄﯿﺎت اﻟﺘﻲ ﯾﺘﻢ‬
‫ﺗﻤﺮﯾﺮھﺎ ﻟﻠﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ وﯾﺠﺐ ﻣﻼﺣﻈﺔ أن ھﺬه اﻟﺨﺎﺻﯿﺔ ﯾﻤﻜﻦ أن ﺗﻌﻤﻞ ﻋﻠﻰ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ‪Sub-program‬‬
‫اﻟﺨﺎﺻﺔ ﺑﻤﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ ‪ Package‬أو اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻹﻗﻠﯿﻤﯿﺔ ‪ Local_Sub_Program‬أي اﻟﻤﻮﺟﻮدة‬
‫داﺧﻞ اﻟﻘﺎﻟﺐ ‪ PL/SQL Block‬أو ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ آﺧﺮ وﻟﻜﻦ ﻻ ﺗﻌﻤﻞ ھﺬه اﻟﺨﺎﺻﯿﺔ ﻋﻠﻰ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﻤﺴﺘﻘﻠﺔ‬
‫‪ Stand-alone Subprogram‬ﻛﻤﺎ ﻻ ﺗﻌﻤﻞ أﯾﻀﺎ ﻋﻠﻰ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﺘﻲ ﺗﻤﺘﻠﻚ ﻣﻌﻄﯿﺎت ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت‬
‫اﻟﻤﺨﺘﻠﻔﺔ وﻟﻜﻦ ﻣﻦ ﻧﻔﺲ اﻟﻔﺌﺔ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل إذا ﻛﺎن ﻟﺪﯾﻨﺎ إﺟﺮاءﯾﻦ ‪:‬‬
‫اﻷول ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﻤﻌﻄﻰ ‪ A‬وﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Number‬واﻟﺜﺎﻧﻲ ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﻤﻌﻄﻰ ‪ B‬وﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت‬
‫‪ Decimal‬ﻓﻼ ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ ‪ Overloading‬ﻣﻊ ھﺬﯾﻦ اﻻﺟﺮاﺋﯿﻦ وذﻟﻚ ﻷن ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Number‬و‬
‫‪ Decimal‬ﻣﻦ ﻧﻮع اﻟﻔﺌﺔ ﻛﻤﺎ ﻻ ﯾﻤﻜﻦ اﺳﺘﺨﺪام ھﺬه اﻟﺨﺎﺻﯿﺔ ﻣﻊ اﻟﻮﻇﺎﺋﻒ اﻟﺘﻲ ﺗﺨﺘﻠﻒ ﻓﻘﻂ ﻓﻲ ﻧﻮع اﻟﺒﯿﺎﻧﺎت‬
‫اﻟﺨﺎﺻﺔ ﺑﺎﻟﻘﯿﻢ اﻟﻤﺴﺘﺮﺟﻌﺔ ﻣﻨﮭﺎ ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤٦‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ‪:‬‬

‫ﺣﯿﺚ ﯾﺘﻢ ﺗﻌﺮﯾﻒ ﺛﻼﺛﺔ ﺑﺮاﻣﺞ ﻓﺮﻋﯿﺔ ﺑﻨﻔﺲ اﻻﺳﻢ ھﻮ ‪ Value_Ok‬وﻛﻤﺎ ﻧﻼﺣﻆ أن اﻟﻮﻇﯿﻔﺔ اﻷوﻟﻰ ﺗﺄﺧﺬ اﻟﻤﻌﻄﻰ‬
‫‪ Date_in‬واﻟﺬي ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Date‬واﻟﻮﻇﯿﻔﺔ اﻟﺜﺎﻧﯿﺔ ﺗﺄﺧﺬ اﻟﻤﻌﻄﻰ ‪ Number_in‬واﻟﺬي ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت‬
‫‪ Number‬أﻣﺎ اﻹﺟﺮاء اﻟﺜﺎﻟﺚ ﯾﺄﺧﺬ اﻟﻤﻌﻄﻰ ‪ Number_in‬واﻟﺬي ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪. Number‬‬
‫ﻛﻤﺎ ﺗﺘﯿﺢ ﻟﻨﺎ اﻟﻠﻐﺔ ‪ PL/SQL‬أﯾﻀﺎ إﻣﻜﺎﻧﯿﺔ اﺳﺘﺨﺪام اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ‪ Sub-program‬ﻗﺒﻞ ﺗﻮﺻﯿﻔﮭﺎ وذﻟﻚ ﻣﻦ‬
‫ﺧﻼل اﻟﺨﺎﺻﯿﺔ ‪ Forward Declaration‬ﺣﯿﺚ ﺗﺘﯿﺢ ﻟﻨﺎ ھﺬه اﻟﺨﺎﺻﯿﺔ ﺑﺎﻟﻌﺪﯾﺪ ﻣﻦ اﻷﻣﻮر ﻣﺜﻞ ‪:‬‬
‫• ﺗﻌﺮﯾﻒ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺑﻄﺮﯾﻘﺔ ﻣﻨﻄﻘﯿﺔ أو ﻣﺮﺗﺒﺔ ﺗﺮﺗﯿﺐ ھﺠﺎﺋﻲ‬
‫• ﺗﻌﺮﯾﻒ اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﻤﺘﺪاﺧﻠﺔ‬
‫• ﺗﺠﻤﯿﻊ اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﺒﺮاﻣﺞ ﻓﻲ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ‬
‫وﺗﻌﺘﻤﺪ ھﺬه اﻟﺨﺎﺻﯿﺔ ﻋﻠﻰ اﻟﺘﻌﺮﯾﻒ اﻟﻤﺴﺒﻖ ﻗﺒﻞ اﺳﺘﺨﺪام اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ﻓﻲ ﺑﺮﻧﺎﻣﺞ آﺧﺮ ﺛﻢ ﯾﺘﻢ إﺿﺎﻓﺔ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ‬
‫ﺑﻌﺪ ذﻟﻚ وﻛﻤﺎ ﻧﺮى ﻓﻲ ھﺬا اﻟﻜﻮد‪:‬‬
‫ﯾﺘﻢ ﺗﻌﺮﯾﻒ اﻹﺟﺮاء ‪ Calc_rating‬ﻓﻲ ﺑﺪاﯾﺔ‬
‫اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﺛﻢ ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮫ ﻓﻲ‬
‫اﻹﺟﺮاء ‪ award_bonus‬ﺛﻢ ﯾﺘﻢ ﻋﻤﻞ‬
‫ﺗﻮﺻﯿﻒ ﻟﮫ ﺑﻌﺪ ذﻟﻚ‬

‫وﯾﺠﺐ ﻣﻼﺣﻈﺔ أﻧﮫ ﻻﺑﺪ أن ﯾﻜﻮن ﻛﻼً ﻣﻦ‬


‫اﻟﺘﻌﺮﯾﻒ اﻟﻤﺴﺒﻖ ‪Forward declaration‬‬
‫واﻟﺘﻮﺻﯿﻒ ‪ Definition‬ﻓﻲ ﻧﻔﺲ اﻟﻮﺣﺪة‬
‫اﻟﺒﺮﻣﺠﯿﺔ ﺳﻮاء ً ﻛﺎﻧﺖ ﻣﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ أو‬
‫ﻗﺎﻟﺐ ‪ PL/SQL‬أو أي ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ آﺧﺮ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤٧‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪SQL   ‬‬
‫ﯾﺘﻢ اﺳﺘﺨﺪام وﻇﺎﺋﻒ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ داﺧﻞ اﻟﻜﻮد ‪ SQL‬ﺑﻨﻔﺲ اﻟﻄﺮﯾﻘﺔ اﺳﺘﺨﺪام اﻟﺪوال اﻟﺨﺎﺻﺔ ﺑﺎﻟﻠﻐﺔ ‪SQL‬‬
‫اﻻ‪ ‬أﻧﮫ ﯾﺠﺐ ﻣﺮاﻋﺎة اﻟﻨﻘﺎط اﻟﺘﺎﻟﯿﺔ‪:‬‬
‫• اﻟﻮﻇﺎﺋﻒ ‪ Functions‬اﻟﺘﻲ ﯾﺘﻢ اﺳﺘﺪﻋﺎءھﺎ ﻣﻦ ﺧﻼل اﻻﺳﺘﻌﻼﻣﺎت ‪ Queries‬أ و اﻟﺠﻤﻞ ‪ DML‬ﯾﺠﺐ اﻷ‬
‫ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﺠﻤﻞ اﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ إﻧﮭﺎء اﻹﺟﺮاء ‪ Transaction‬اﻟﺤﺎﻟﻲ‬

‫‪DML‬‬
‫ــــــــــــــــــــــــ‬
‫ــــــــــــــــــــــــــ‬
‫ــــــــــــــــــــــــــ‬

‫‪Transaction‬‬

‫‪Functions‬‬ ‫‪Create‬‬ ‫‪Alter‬‬ ‫‪Rollback to‬‬


‫‪save point‬‬

‫‪Queries‬‬
‫ــــــــــــــــــ‬
‫ـــــــــــــــــــ‬
‫وﻣﺎ إﻟﻰ ذﻟﻚ ﻣﻦ ھﺬه اﻟﺠﻤﻞ ‪.‬‬
‫ــــــــــــــــــــــــ‬
‫ــــــــــــــــــــــــــ‬

‫• ﻛﻤﺎ ﯾﺠﺐ ﻋﺪم ﺗﻨﻔﯿﺬ أي ﺟﻤﻠﺔ ‪ DML‬أو أي ﺟﻤﻞ أﺧﺮى ﺗﻌﻤﻞ ﻋﻠﻰ اﻟﺘﻌﺪﯾﻞ ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻛﻤﺎ ﻻ ﯾﺠﺐ‬
‫ﻟﻠﻮﻇﺎﺋﻒ اﻟﺘﻲ ﯾﺘﻢ اﺳﺘﺪﻋﺎءھﺎ ﻣﻦ ﻗﺒﻞ اﻟﺠﻤﻞ ‪ DML‬أن ﺗﻘﻮم ﺑﻘﺮاءة أو ﺗﻌﺪﯾﻞ ﺟﺪول ﻣﻦ ﺟﺪاول ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت‬
‫ﯾﺘﻢ ﺗﻌﺪﯾﻠﮫ ﻣﻦ ﻗﺒﻞ ﺟﻤﻠﺔ ‪ DML‬أﺧﺮى ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل اﻟﻜﻮد اﻟﺘﺎﻟﻲ‪:‬‬
‫‪Specification‬‬
‫ﻗﺴﻢ‬
‫‪Body‬‬
‫ﻗﺴﻢ‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤٨‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺗﻮﺿﯿﺢ‬

‫ﯾﺴﺘﺨﺪم ﻹﻧﺸﺎء ﻣﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ ﻟﮭﺎ اﻻﺳﻢ ‪ taxes_pack‬واﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻮﻇﯿﻔﺔ ‪ tax‬ﻛﻤﺎ ﻧﺮى ﻓﻲ اﻟﻘﺴﻢ‬
‫‪ Specification‬ﻟﮭﺬه اﻟﻤﺠﻤﻮﻋﺔ ‪ .‬وﻓﻲ اﻟﻘﺴﻢ ‪ Body‬ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﻜﻮد اﻟﺘﻨﻔﯿﺬي ﻟﻠﻮﻇﯿﻔﺔ وھﻮ ﻋﺒﺎرة ﻋﻦ ﺣﺎﺻﻞ‬
‫)‪ (P_value * V_rate‬وھﻲ ﻋﺒﺎرة ﻋﻦ‬ ‫ﺿﺮب اﻟﻘﯿﻤﺔ اﻟﺘﻲ ﯾﺘﻢ ﺗﻤﺮﯾﺮھﺎ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ﻓﻲ اﻟﻘﯿﻤﺔ )‪(V_rate‬‬
‫ﻗﯿﻤﺔ ﺛﺎﺑﺘﺔ وھﻲ ‪ 0.08‬وﻻﺳﺘﺨﺪام ھﺬه اﻟﻮﻇﯿﻔﺔ ﻓﻲ اﻟﻠﻐﺔ ‪ SQL‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد‪-:‬‬

‫وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻜﻮد أﻧﮫ ﻻﺳﺘﺪﻋﺎء اﻟﻮﻇﯿﻔﺔ ‪ tax‬اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ taxes_pack‬داﺧﻞ اﻟﺠﻤﻠﺔ‬
‫‪ Select‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ اﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ taxes_pack‬ﯾﻠﯿﮭﺎ اﻟﺮﻣﺰ دوت]‪ [.‬ﺛﻢ اﺳﻢ اﻟﻮﻇﯿﻔﺔ ‪.. tax‬‬

‫ﻣﻼﺣﻈﺎت ﻋﻠﻰ ھﺬا اﻟﻔﺼﻞ ‪-:‬‬

‫اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪ Packages‬ﻋﺒﺎرة‬ ‫‪-‬‬


‫ﻋﻦ ﻣﺠﻤﻮﻋﺔ ﻣﺘﺮاﺑﻄﺔ ﻣﻦ اﻷدوات واﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ واﻟﻤﺘﻐﯿﺮات واﻟﻤﺆﺷﺮات واﻟﺜﻮاﺑﺖ اﻟﻤﻮﺟﻮدة ﻓﻲ وﻋﺎء‬
‫واﺣﺪ‪.‬‬
‫‪ -‬ﯾﻄﻠﻖ ﻋﻠﻰ إﻣﻜﺎﻧﯿﺔ إﻧﺸﺎء أﻛﺜﺮ ﻣﻦ ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ ﺑﻨﻔﺲ اﻻﺳﻢ داﺧﻞ ﻧﻔﺲ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﺑﺎﻻﺳﻢ‬
‫‪. Overloading‬‬
‫‪ -‬ﯾﺴﺘﺨﺪم اﻟﻘﺴــــﻢ ‪ Package Specification‬ﻟﺘﻌﺮﯾﻒ ﺟﻤﯿﻊ اﻟﻤﻜﻮﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪.‬‬
‫‪ -‬ﺟﻤﯿﻊ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ واﻟﻤﺘﻐﯿﺮات اﻟﺘﻲ ﯾﺘﻢ ﺗﻌﺮﯾﻔﮭﺎ ﻓﻲ اﻟﻘﺴﻢ ‪ Specification‬ﺗﻜﻮن ﻣﻦ اﻟﻨﻮع ‪. Public‬‬
‫‪ -‬اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪ Bodiless Package‬ﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺎت ﺑﺮﻣﺠﯿﺔ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻘﺴﻢ‬
‫‪ Specification‬ﻓﻘﻂ ‪.‬‬
‫‪ -‬ﻻ ﯾﻤﻜﻦ أن ﺗﺤﺘﻮي اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪ Bodiless Packages‬ﻋﻠﻰ ﺑﺮاﻣﺞ ﻓﺮﻋﯿﺔ ﺑﺪاﺧﻠﮭﺎ ‪.‬‬
‫‪ -‬ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪ Bodiless Packages‬ﻋﺎدة ً ﻓﻲ ﺗﻌﺮﯾﻒ ﺑﻌﺾ اﻟﻤﺘﻐﯿﺮات واﻟﺜﻮاﺑﺖ اﻟﻌﺎﻣﺔ‬
‫‪ Public Constants And Variable‬اﻟﺘﻲ ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮭﺎ ﺑﻄﺮﯾﻘﺔ ﻣﺘﻜﺮرة ﻣﻦ ﻗﺒﻞ أﻛﺜﺮ ﻣﻦ ﻣﺴﺘﺨﺪم ﻓﻲ ﻧﻔﺲ‬
‫اﻟﻮﻗﺖ ‪.‬‬
‫‪ -‬ﺗﺘﯿﺢ ﻟﻨﺎ اﻟﻠﻐﺔ ‪ PL/SQL‬إﻣﻜﺎﻧﯿﺔ اﺳﺘﺨﺪام اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻗﺒﻞ ﺗﻮﺻﯿﻔﮭﺎ ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٤٩‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪‬‬ ‫‪      ‬‬ ‫‪‬‬

‫‪  ‬‬


‫ﻗﺎﻣـــﺖ ﺷﺮﻛﺔ ‪ Oracle‬ﺑﺈﻧﺸﺎء ﺑﻌﺾ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ اﻟﺠﺎھﺰة ‪ Supplied Packages‬واﻟﺘﻲ ﺗﺪﻋﻢ اﻟﻜﺜﯿﺮ‬
‫ﻣﻦ اﻟﺨﺼﺎﺋﺺ اﻟﺘﻲ ﺗﻤﻜﻨﻨﺎ ﻣﻦ دﻣﺞ أﻛﻮاد اﻟﻠﻐﺔ ‪ SQL‬داﺧﻞ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻟﻠﻐﺔ ‪. PL/SQL‬‬
‫ﻛﻤﺎ ﺗﻤﺪ اﻟﻠﻐﺔ ‪ PL/SQL‬ﺑﺒﻌﺾ وﻇﺎﺋﻒ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وﺳﻮف ﻧﺘﻨﺎول ﺑﺎﻟﺸﺮح ﻓﻲ ھﺬا اﻟﺠﺰء ﺑﻌﺾ ھﺬه‬
‫اﻟﻤﺠﻤﻮﻋﺎت وذﻟﻚ ﻣﺜﻞ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪-:‬‬
‫‪-DBMS_SQL‬‬
‫‪-DBMS_DDL‬‬
‫‪-DBMS_JOB‬‬
‫‪-DBMS_OUTPUT‬‬
‫‪-UTL_FILE‬‬
‫ﻗﺒﻞ اﻟﺸﺮح ﻓﻲ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_SQL‬ﻻﺑﺪ ﻣﻦ اﻟﺘﻌﺮف ﻋﻠﻰ اﻷﻛﻮاد اﻟﻤﺘﻌﺪدة ﻟﻼﺳﺘﺨﺪام أو‬
‫‪ Dynamic SQL‬وھﻮ ﻋﺒﺎرة ﻋﻦ ﺟﻤﻞ ‪ SQL‬ﺗﺤﺘﻮي ﻋﻠﻰ ﺑﻌﺾ اﻟﻤﺘﻐﯿﺮات اﻟﺘﻲ ﯾﻤﻜﻦ أن ﺗﺘﻐﯿﺮ أﺛﻨﺎء اﻟﺘﻨﻔﯿﺬ ﻓﮭﻲ‬
‫ﻋﺒﺎرة ﻋﻦ أﻛﻮاد ﯾﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ ﻟﻼﺳﺘﺨﺪام ﻟﻠﻌﺪﯾﺪ ﻣﻦ اﻷﻏﺮاض ﻛﻤﺎ ﺗﺘﯿﺢ ﻟﻨﺎ إﻣﻜﺎﻧﯿﺔ اﺳﺘﺨﺪام ﻛﻼ ﻣﻦ اﻟﺠﻤﻞ‪-:‬‬
‫‪DDL‬‬
‫‪DCL‬‬ ‫‪PL/SQL‬‬

‫‪Session Control Language‬‬


‫وﯾﻤﻜﻦ ﻛﺘﺎﺑﺔ ھﺬا اﻟﻨﻮع ﻣﻦ اﻷﻛﻮاد ﺑﺈﺣﺪى ﻃﺮﯾﻘﺘﯿﻦ ‪-:‬‬
‫‪Native Dynamic SQL‬‬ ‫‪ -‬اﺳﺘﺨﺪام اﻟﻜﻮد‬
‫‪DBMS_SQL‬‬ ‫‪ -‬اﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ‬
‫ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل إذا أردﻧﺎ أﻧﺸﺎء إﺟﺮاء ﻹﺿﺎﻓﺔ ﻣﻜﺎﻓﺄة ﻣﺎﻟﯿﺔ ﻋﻠﻰ رواﺗﺐ اﻟﻤﻮﻇﻔﯿﻦ ﻋﻠﻰ اﻟﺠﺪول ‪ EMP‬وﯾﻤﻜﻨﻨﺎ‬
‫إﻧﺠﺎز ﻣﺜﻞ ھﺬه اﻟﻤﮭﻤﺔ ﺑﺄي ﻣﻦ اﻟﻄﺮﯾﻘﺘﯿﻦ اﻟﺴﺎﺑﻘﺘﯿﻦ وﻟﻌﻤﻞ ذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﻄﺮﯾﻘﺔ اﻷوﻟﻰ وھﻲ اﻟﻄﺮﯾﻘﺔ اﻟﻤﻌﺘﺎدة‬
‫ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜـــــــــــــــــــــــــﻮد‪-:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥٠‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﯾﺘﻢ ﺗﻤﺮﯾﺮ اﺳﻢ اﻟﻤﻮﻇﻒ ‪ Emp_name‬وﻣﻘﺪار اﻟﺰﯾﺎدة ﻓﻲ اﻟﺮاﺗﺐ أﺛﻨﺎء اﻟﺘﻨﻔﯿﺬ ‪ raise_in‬وﻛﻤﺎ‬ ‫ﺗﻮﺿﯿﺢ‬

‫ﻧﻼﺣﻆ ﻓﻲ اﻟﻜﻮد ﯾﺘﻢ ﺟﻤﻊ اﻟﻘﯿﻤﺔ اﻟﺘﻲ ﯾﺘﻢ ﺗﻤﺮﯾﺮھﺎ ﻣﻦ ﺧﻼل اﻟﻤﻌﻄﻰ ‪ raise_in‬ﻋﻠﻰ ﻗﯿﻤﺔ اﻟﺮاﺗﺐ‬
‫‪ Sal‬ﻓﻲ اﻟﺠﻤﻠﺔ اﻟﺘﺎﻟﯿﺔ ‪ Sal = Sal + raise_in :‬وﯾﺘﻢ ﺗﺤﺪﯾﺪ اﺳﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﯾﺘﻢ ﻣﻨﺤﮫ ھﺬه اﻟﻤﻜﺎﻓﺄة ﻣﻦ‬
‫ﺧﻼل اﻟﻤﻌﻄﻰ ‪ Emp_name‬ﻛﻤﺎ ﻓﻲ اﻟﺠﻤﻠﺔ ‪ Where ename = emp_name :‬ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪Where‬‬
‫أﻣﺎ ﺑﺎﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻓﻼﺑﺪ ﻣﻦ ﻋﻤﻞ اﻟﺨﻄﻮات اﻵﺗﯿﺔ ‪- :‬‬
‫أوﻻ ً ‪ :‬ﻧﻘﻮم ﺑﺤﺠﺰ ﻣﻜﺎن ﻓﻲ اﻟﺬاﻛﺮة ‪ Memory‬وذﻟﻚ ﻟﺘﺨﺰﯾﻦ اﻟﺠﻤﻞ ‪ SQL‬اﻟﻤﺮاد ﺗﻨﻔﯿﺬھﺎ وذﻟﻚ ﻣﻦ ﺧﻼل أو ﺗﻌﯿﯿﻦ‬
‫أو ﻓﺘﺢ اﻟﻤﺆﺷﺮات وﯾﺘﻢ ذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻮﻇﯿﻔﺔ ‪ Open_Cursor‬ﺣﯿﺚ ﺗﻘﻮم ﺑﺎﺳﺘﺮﺟﺎع اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ‪ID‬‬
‫‪ Number‬اﻟﺨﺎص ﺑﮭﺬا اﻟﻤﺆﺷﺮ‪:‬‬
‫‪Open_Cursor‬‬ ‫‪ID Number‬‬
‫ﺛﺎﻧﯿﺎً ‪ :‬ﻧﻘﻮم ﺑﺈﺟﺮاء ﻋﻤﻠﯿﺔ ﻓﺤﺺ ﻟﻠﺠﻤﻞ وﻓﻲ ھﺬه اﻟﺨﻄﻮة ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬ﺑﺈﺟﺮاء اﻟﻔﺤﺺ‬
‫ﻟﻸﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﺎﻟﺠﻤﻞ ‪ SQL‬ﻟﻠﺘﺄﻛﺪ ﻣﻦ ﺻﺤﺘﮭﺎ وﯾﺘﻢ ذﻟﻚ ﻣﻦ ﺧﻼل اﻹﺟﺮاء ‪ Parse‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ ‪-:‬‬

‫وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت اﻟﻤﻌﻄﻰ اﻷول ﻋﺒﺎرة ﻋﻦ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ﻟﻠﻤﺆﺷﺮ اﻟﺤﺎﻟﻲ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة‬
‫ﻋﻦ اﻟﺠﻤﻠﺔ ‪ SQL‬اﻟﻤﺮاد ﻓﺤﺼﮭﺎ ﻗﺒﻞ اﻟﺘﻨﻔﯿﺬ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ﻋﺒﺎرة ﻋﻦ اﻟﻨﻤﻂ اﻟﻤﺴﺘﺨﺪم ﻓﻲ ﻣﻌﺎﻟﺠﺔ اﻟﺠﻤﻞ ‪SQL‬‬
‫وھﻨﺎك ﺛﻼﺛﺔ أﻧﻤﺎط ‪-:‬‬
‫‪-V6‬‬ ‫ﺧﺎص ﺑﺎﻹﺻﺪار اﻟﺴﺎدس ﻣﻦ أوراﻛﻞ‬
‫‪-V7‬‬ ‫ﺧﺎص ﺑﺎﻹﺻﺪار اﻟﺴﺎﺑﻊ ﻣﻦ أوراﻛﻞ‬

‫‪-Native‬‬ ‫ﺧﺎص ﺑﺎﻹﺻﺪار اﻟﺤﺎﻟﻲ ﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﻤﺘﺼﻠﺔ ﺑﺎﻟﺒﺮﻧﺎﻣﺞ أي ﻛﺎﻧﺖ‬


‫ﺛﺎﻟﺜﺎ ‪ :‬ﺗﻘﯿﯿــــﺪ اﻟﻤﺘﻐﯿﺮات ‪ Bind_Variable‬ﺣﯿﺚ ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬ﺑﺎﻟﺤﺼﻮل ﻋﻠﻰ‬
‫اﻟﻤﻌﻠﻮﻣﺎت اﻟﻼزﻣﺔ ﻟﺘﻨﻔﯿﺬ اﻟﺠﻤﻞ ﻣﻦ ﺧﻼل اﻟﻤﺘﻐﯿﺮات ‪ Bind_Variable‬وﺗﺘﻢ ھﺬه اﻟﺨﻄﻮة ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء‬
‫‪ Bind_Variable‬واﻟﺬي ﯾﻌﻤﻞ ﻋﻠﻰ إرﺳﺎل ﻗﯿﻢ اﻟﻤﻌﻄﯿﺎت اﻟﺘﻲ ﻟﮭﺎ اﻟﻨﻤﻂ ‪ In Parameter‬إﻟﻰ اﻟﻤﺆﺷﺮ‬
‫‪ Cursor‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ ‪-:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥١‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت اﻟﻤﻌﻄﻰ اﻷول ﻋﺒﺎرة ﻋﻦ رﻗﻢ اﻟﻤﺆﺷﺮ ‪ Cursor_ID‬واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ‬
‫اﺳﻢ اﻟﻤﺘﻐﯿﺮ اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﺠﻤﻠﺔ ‪ SQL‬اﻟﻤﻜﺘﻮﺑﺔ ﻓﻲ اﻹﺟﺮاء ‪ Parse‬ﻟﻠﺘﻨﻔﯿﺬ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ھﻮ ﻋﺒﺎرة ﻋﻦ ﻧﻮع‬
‫اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﻟﮭﺬا اﻟﻤﺘﻐﯿﺮ ‪.‬‬
‫راﺑﻌﺎً ‪ :‬ﺧﻄﻮة اﻟﺘﻨﻔﯿﺬ ‪ EXECUTE‬ﺑﻌﺪ ﺣﺼﻮل اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬ﻋﻠﻰ ﺟﻤﯿﻊ اﻟﻤﻌﻠﻮﻣﺎت اﻟﻼزﻣﺔ‬
‫ﻟﻠﺘﻨﻔﯿﺬ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﺠﻤﻞ ‪ SQL‬وﺗﺘﻢ ھﺬه اﻟﺨﻄﻮة ﺑﺎﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ ‪ EXECUTE‬وﺗﺄﺧﺬ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪-:‬‬
‫;)‪DBMS_SQL.EXECUTE (C IN integer‬‬
‫وﺗﻘﻮم ھﺬه اﻟﻮﻇﯿﻔﺔ ﺑﺘﻨﻔﯿﺬ اﻟﺠﻤﻠﺔ ‪ SQL‬ﺛﻢ اﺳﺘﺮﺟﺎع ﻗﯿﻤﺔ ﻋﺪدﯾﺔ ﺗﺪل ﻋﻠﻰ ﻋﺪد اﻟﺼﻔﻮف اﻟﺘﻲ ﺗﻢ ﻣﻌﺎﻟﺠﺘﮭﺎ ﻣﻦ ﻗﺒﻞ‬
‫اﻟﺨﺎدم أوراﻛﻞ ‪. Oracle server‬‬
‫ﺧﺎﻣﺴﺎً ‪ :‬ﻋﻤﻠﯿﺔ اﺳﺘﺨﻼص اﻟﺒﯿﺎﻧﺎت أو ﺟﻠﺒﮭﺎ ‪ Fetch‬اﻟﻨﺎﺗﺠﺔ ﻣﻦ اﻻﺳﺘﻌﻼﻣﺎت وﯾﺠﺐ ﻣﻼﺣﻈﺔ أﻧﮫ ﻻﯾﻤﻜﻦ ﻋﻤﻞ ھﺬه‬
‫اﻟﺨﻄﻮة ﻋﻠﻰ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪DML‬‬
‫‪DELETE‬‬

‫‪DML‬‬
‫وﻣﺎ إﻟﻰ ﻏﯿﺮ ذﻟﻚ‬
‫‪UPDATE‬‬

‫ﺳﺎدﺳﺎً ‪ :‬ﻧﻘﻮم ﺑﺈﻏﻼق اﻟﻤﺆﺷﺮ ﺑﺎﺳﺘﺨﺪام ‪ Close_Cursor‬ﻛﻤﺎ ﻓﻲ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ ‪:‬‬


‫;)‪DBMS_SQL.Close_Cursor (C IN OUT integer‬‬
‫ﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﺼﯿﻐﺔ أﻧﮫ ﯾﺘﻢ ﺗﻤﺮﯾﺮ ﻣﻌﻄﻰ واﺣﺪ ﻓﻘﻂ ﻟﮭﺬا اﻹﺟﺮاء وھﻮ ﻋﺒﺎرة ﻋﻦ رﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ اﻟﺨﺎص ﺑﺎﻟﻤﺆﺷﺮ‬
‫اﻟﺬي ﺳﻮف ﯾﺘﻢ إﻏﻼﻗﮫ وﻹدراك وﻓﮭﻢ اﻟﺨﻄﻮات اﻟﺴﺎﺑﻘﺔ ﻧﻘﻮم ﺑﺘﻄﺒﯿﻘﮫ ﻋﻠﻰ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ذﻛﺮه ﻓﻲ ﺑﺪاﯾﺔ ھﺬا اﻟﺪرس‬
‫ﻓﻨﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥٢‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺗﻮﺿﯿﺢ‬

‫; ‪DBMS_SQL.Open_Cursor‬‬ ‫ﻓﻲ ﺑﺪاﯾﺔ ھﺬا اﻟﻜﻮد ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ‬


‫وذﻟﻚ ﻟﺤﺠﺰ ﻣﻜﺎن ﻓﻲ اﻟﺬاﻛﺮة وﺗﺨﺰﯾﻦ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ‪ Cursor_ID‬اﻟﻤﺴﺘﺮﺟﻊ ﻣﻨﮭﺎ ﻓﻲ اﻟﻤﺘﻐﯿﺮ‬
‫‪ Cursor_handle‬واﻟﺬي ﺗﻢ ﺗﻌﺮﯾﻔﮫ ﻓﻲ اﻟﻘﺴﻢ ‪ Declaration section‬ﺛﻢ ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء‬
‫‪ DBMS_SQL.Parse‬ﻟﻠﻔﺤﺺ واﻟﺘﺄﻛﺪ ﻣﻦ ﺻﺤﺔ اﻟﺠﻤﻠﺔ ‪ SQL‬اﻟﺬي ﻧﺮﯾﺪ ﺗﻨﻔﯿﺬھﺎ ﺛﻢ ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء‬
‫‪ DBMS_SQL.bain_Variable‬وذﻟﻚ ﻟﺘﻘﯿﺪ اﻟﻤﺘﻐﯿﺮات ‪ Raise_amount‬و ‪ Employee_name‬اﻟﺬي‬
‫ﺗﻢ اﺳﺘﺨﺪاﻣﮭﻢ ﻓﻲ اﻟﺠﻤﻠﺔ ‪ [Update emp ] SQL‬ﻟﻺﺟﺮاء ‪. Parse‬‬
‫أﻣﺎ اﻟﻮﻇﯿﻔﺔ ‪ DBMS_SQL.EXECUTE‬ﻓﺘﺴﺘﺨﺪم ﻟﺘﻨﻔﯿﺬ اﻟﺠﻤﻠﺔ ‪ SQL‬وﺗﺨﺰﯾﻦ اﻟﻘﯿﻤﺔ اﻟﻨﺎﺗﺠﺔ ﻓﻲ اﻟﻤﺘﻐﯿﺮ‬
‫‪ Emps_updated‬واﻟﺬي ﺗﻢ ﺗﻌﺮﯾﻔﮫ ﻓﻲ اﻟﻘﺴﻢ ‪ Declarative Section‬وﯾﺘﻢ اﺳﺘﺨﺪام اﻟﺠﻤﻠــــــــﺔ‬
‫‪ DBMS_OUTPUT.PUT_LINE‬ﻟﻌﺮض اﻟﺼﻔﻮف اﻟﺘﻲ ﺗﻤﺖ ﺗﻌﺪﯾﻠﮭﺎ ﻧﺘﯿﺠﺔ ﻟﺘﻨﻔﯿﺬ ھﺬا اﻟﻜﻮد أﻣﺎ اﻹﺟﺮاء‬
‫‪ DBMS_SQL.CLOSE_CURSOR‬ﻓﯿﺴﺘﺨﺪم ﻹﻏﻼق اﻟﻤﺆﺷـــــــــــــــــــــــــــــــــﺮ ‪.‬‬

‫‪EXECUTE Immediate‬‬

‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Execute Immediate‬ﻓﻲ ﻛﺘﺎﺑﺔ اﻟﻜﻮد ‪Native‬‬
‫‪ Dynamic SQL‬داﺧﻞ اﻟﻜﻮد ‪PL/SQL‬‬
‫‪Native Dynamic SQL‬‬ ‫‪PL/SQL‬‬
‫وﺗﺄﺧﺬ ھﺬه اﻟﺠﻤﻠﺔ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ ‪-:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ ‪ Execute Immediate‬ﯾﻠﯿﮭﺎ اﻟﺠﻤﻠﺔ ‪ SQL‬اﻟﻤﺮاد ﺗﻨﻔﯿﺬھﺎ ﺛﻢ اﻟﺠﻤﻠﺔ ‪ INTO‬ﯾﻠﯿﮭﺎ‬
‫ﻣﺠﻤﻮﻋﺔ ﻣﺘﻐﯿﺮات ‪ Define_Variable‬أو ‪ Records‬اﻟﺘﻲ ﺳﻮف ﯾﺘﻢ ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻨﺎﺗﺠﺔ ﻣﻦ ﺗﻨﻔﯿﺬ اﻟﺠﻤﻠﺔ‬
‫‪ SQL‬ﺑﮭﺎ ﺛﻢ اﻟﻜﻠﻤﺔ ‪ Using‬ﯾﻠﯿﮭﺎ اﻟﻤﺘﻐﯿﺮات ‪ Bind_argument‬واﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ إرﺳﺎل اﻟﺒﯿﺎﻧﺎت اﻟﻤﺪﺧﻠﺔ ﻣﻦ‬
‫اﻟﻤﺴﺘﺨﺪم إﻟﻰ اﻟﺠﻤﻠﺔ ‪ SQL‬ﺳﻮاءً ﻛﺎﻧﺖ اﻟﺒﯿﺎﻧﺎت ﻣﺪﺧﻠﺔ ﻣﻦ ﺧﻼل اﻟﻤﻌﻄﯿﺎت ‪ Parameters‬أو ﻣﻌﺮﻓﺔ ﻓﻲ اﻟﻘﺴﻢ‬
‫‪ Declarative Section‬وﯾﺠﺐ ﻣﻼﺣﻈﺔ أن ھﺬه اﻟﺠﻤﻠﺔ ﺗﺴﺘﺨﺪم ﻓﻲ اﻻﺳﺘﻌﻼﻣﺎت ‪ Single_Row Query‬ﻓﻘﻂ‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥٣‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻓﻔﻲ اﻟﻜﻮد اﻟﺘﺎﻟﻲ‪-:‬‬

‫ﯾﻌﻤﻞ ھﺬا اﻹﺟﺮاء ﻋﻠﻰ ﻋﺮض اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻮﻇﻒ اﻟﺬي ﯾﺘﻢ ﺗﻤﺮﯾﺮ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ‪ Emp_ID‬اﻟﺨﺎص ﺑﮫ‬
‫ﻟﮭﺬا اﻹﺟﺮاء ﻛﻤﺎ ﻧﺸﺎھﺪ ﻓﻲ اﻟﻜﻮد ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﺠﻤﻠﺔ ‪ Execute Immediate‬ﺛﻢ اﻟﺠﻤﻠﺔ اﻟﺨﺎﺻﺔ ﺑﺎﻻﺳﺘﻌﻼم‬
‫‪ Select * from emp Where empno = :id‬ﯾﻠﯿﮭﺎ اﻟﺠﻤﻠﺔ ‪ INTO‬ﺛﻢ اﻟﻤﺘﻐﯿﺮ ‪ Emp_rec‬واﻟﺬي ﺗﻢ‬
‫ﺗﻌﺮﯾﻔﮫ ﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﻘﺴﻢ ‪ Declarative Section‬ﺛﻢ اﻟﻜﻠﻤﺔ ‪ Using‬ﯾﻠﯿﮭﺎ اﻟﻤﺘﻐﯿﺮ ‪ emp_id‬واﻟﺬي ﯾﻘﻮم‬
‫ﺑﺘﻤﺮﯾﺮ اﻟﻘﯿﻤﺔ اﻟﻤﺪﺧﻠﺔ ﻣﻦ اﻟﻤﻌﻄﻰ ‪ emp_id‬إﻟﻰ اﻟﻤﺘﻐﯿﺮ ]‪ [:id‬أﻣﺎ اﻟﺠﻤﻠﺔ اﻟﻠﻲ ﻓﻲ اﻟﻤﺴﺘﻄﯿﻞ اﻷﺣﻤﺮ ﻓﻲ اﻟﻜﻮد‬
‫ﻓﺘﺴﺘﺨﺪم ﻟﻌﺮض اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﻢ اﺳﺘﺨﻼﺻﮭﺎ وﺗﺨﺰﯾﻨﮭﺎ ﻓﻲ اﻟﻤﺘﻐﯿﺮ ‪. emp_rec‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥٤‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪DBMS_DDL     ‬‬
‫ﺣﯿﺚ ﺗﺪﻋﻢ ﻋﻤﻠﯿﺔ اﻟﻮﺻﻮل إﻟﻰ ﺑﻌﺾ اﻟﺠﻤﻞ ‪ DDL‬أو ﺟﻤﻞ ﺗﻌﺮﯾﻒ اﻟﺒﯿﺎﻧﺎت ﻣﻦ ﺧﻼل اﻹﺟﺮاءات اﻟﻤﺨﺰﻧﺔ ‪Stored‬‬
‫‪ Procedure‬وﺗﺘﻀﻤﻦ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ إﺟﺮاءﯾﻦ وھﻤﺎ ‪-:‬‬
‫‪- Alter_Compile‬‬
‫‪- Analyze_Object‬‬
‫وﯾﺴﺘﺨﺪم اﻹﺟﺮاء ‪ Alter_Compile‬ﻹﻋﺎدة ﺗﺮﺟﻤﺔ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﺘﻲ ﺗﻢ ﺗﻌﺪﯾﻠﮭﺎ ﺳﻮاءً ﻛﺎﻧﺖ ‪-:‬‬
‫‪-Procedure‬‬
‫‪-Function‬‬
‫‪Specification‬‬
‫‪-Packages‬‬
‫‪Body‬‬

‫وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪-:‬‬


‫) ‪DBMS_DDL.Alter_compile(type IN varchar2 , Schema IN varchar2 , name IN varchar2‬‬
‫ﺣﯿﺚ ﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_DDL‬ﯾﻠﯿﮭﺎ اﻟﺮﻣﺰ ]‪ [.‬ﺛﻢ اﺳﻢ اﻹﺟﺮاء‬
‫( وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت اﻟﻤﻌﻄﻰ اﻷول‬ ‫‪ Alter_compile‬ﯾﻠﯿﮫ ﻣﺠﻤﻮﻋﺔ اﻟﻤﻌﻄﯿﺎت اﻟﺨﺎﺻﺔ ﺑﮫ ﺑﯿﻦ )‬
‫‪ Type IN varchar2‬ﻋﺒﺎرة ﻋﻦ ﻧﻮع اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ اﻟﺬي ﻧﺮﯾﺪ إﻋﺎدة ﺗﺮﺟﻤﺘﮫ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ‪Schema IN‬‬
‫‪ Varchar2‬ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﻤﺨﺰن ﺑﮭﺎ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ‪Name IN Varchar2‬‬
‫ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ‪ .‬وﻋﻨﺪ اﺳﺘﺨﺪام ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﯾﺠﺐ اﻷﺧﺬ ﺑﺎﻻﻋﺘﺒﺎر ﺑﺒﻌﺾ اﻟﻨﻘﺎط اﻟﮭﺎﻣﺔ‪:‬‬
‫‪-‬أﻧﮫ ﻓﻲ ﺣﺎﻟﺔ اﺳﺘﺨﺪام اﻟﻘﯿﻤﺔ ‪ NULL‬ﺑﺪل ﻣﻦ اﺳﻢ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﺳﯿﺘﻢ اﺳﺘﺨﺪام ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﺤﺎﻟﯿﺔ‬
‫‪ Local_Schema‬وﻹﻋﺎدة ﺗﺮﺟﻤﺔ أي ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ ﻻ ﺑﺪ أن ﯾﻜﻮن ﻟﺪﯾﻚ اﻻﻣﺘﯿﺎز اﻟﺨﺎص ﺑﺈﻣﻜﺎﻧﯿﺔ ﺗﻌﺪﯾﻞ ھﺬا اﻟﻌﻨﺼﺮ‬
‫وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺠﻤﻠﺔ ‪ Grant‬ﻓﻤﺜﻼ إذا أردﻧﺎ إﻋﺎدة ﺗﺮﺟﻤﺔ اﻹﺟﺮاء ‪ Select _emp‬اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﻤﺴﺘﺨﺪم ‪Scott‬‬
‫ﻣﻦ ﺧﻼل اﻟﻤﺴﺘﺨﺪم ﻓﻤﺜﻼ ‪ Alsaeedi‬أو أي اﺳﻢ ﻓﻼﺑﺪ ﻣﻦ أﻋﻄﺎء اﻟﻤﺴﺘﺨﺪم ‪ Alsaeedi‬اﻻﻣﺘﯿﺎز ‪Privilege‬‬
‫اﻟﺨﺎﺻﺔ ﺑﺤﻘﯿﮫ اﻟﺘﻌﺪﯾﻞ ﻓﻲ ﺟﻤﯿﻊ اﻹﺟﺮاءات وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺤﺴﺎب ‪ DBA‬ﻛﻤﺎ ﻓﻲ اﻟﻜﻮد اﻟﺘﺎﻟﻲ ‪-:‬‬
‫;‪Grant Alter Any Procedure To Alsaeedi‬‬
‫واﻵن ﯾﻤﻜﻨﻨﺎ اﺳﺘﺨﺪام اﻹﺟﺮاء ‪ Alter_compile‬ﻹﻋﺎدة ﺗﺮﺟﻤﺔ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ‪-:‬‬
‫;)'‪EXECUTE DBMS_DDL.Alter_Compile('PROCEDURE','SCOTT','Select_emp‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﺗﻤﺮﯾﺮ ﻧﻮع اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ‪ Procedure‬وھﻮ إﺟﺮاء ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﻛﻤﻌﻄﻰ أول ﻟﻺﺟﺮاء‬
‫‪ Alter_compile‬ﺛﻢ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﺳﻢ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮد ﺑﮭﺎ ھﺬا اﻹﺟﺮاء وھﻮ ‪ Scott‬ﺛﻢ اﺳﻢ ھﺬا اﻹﺟﺮاء ھﻮ‬
‫‪ Select _emp‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ وﯾﺠﺐ اﻟﻮﺿﻊ ﻓﻲ اﻻﻋﺘﺒﺎر أﻧﮫ ﻻﺑﺪ ﻣﻦ ﻣﺮاﻋﺎة ﺣﺎﻟﺔ اﻷﺣﺮف ﻋﻨﺪ ﻛﺘﺎﺑﺔ ﻧﻮع اﻟﺒﺮﻧﺎﻣﺞ‬
‫اﻟﻔﺮﻋﻲ وذﻟﻚ ﻷﻧﮭﺎ ﺣﺴﺎﺳﺔ ﻟﺤﺎﻟﺔ اﻷﺣﺮف ‪ Case_Sensitive‬أﻣﺎ اﻹﺟﺮاء ‪DBMS_DDL.analyze_object‬‬
‫ﻓﯿﻘﻮم ﺑﺈﺟﺮاء اﻹﺣﺼﺎﺋﯿﺎت اﻟﻼزﻣﺔ ﻟﻠﻌﻨﺼﺮ اﻟﻤﺤﺪد ﺛﻢ ﯾﻘﻮم ﺑﺘﺨﺰﯾﻦ ھﺬه اﻹﺣﺼﺎﺋﯿﺎت ﻓﻲ ﻗﺎﻣﻮس ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت‬
‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥٥‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪ Data Dictionary‬وﯾﺄﺧﺬ ھﺬا اﻷﺟﺮاء اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪-:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_DDL‬ﯾﻠﯿﮭﺎ اﻟﻌﻼﻣﺔ دوت ]‪ [.‬ﺛﻢ اﺳﻢ اﻹﺟﺮاء‬
‫‪ Analyze_Object‬وﯾﺄﺧﺬ ھﺬا ﻹﺟﺮاء ﻋﺪداً ﻣﻦ اﻟﻤﻌﻄﯿﺎت اﻟﻤﻌﻄﻰ اﻷول ‪ Type Varchar2‬ﻋﺒﺎرة ﻋﻦ ﻧﻮع‬
‫اﻟﻌﻨﺎﺻﺮ اﻟﻤﺮاد ﺣﺴﺎب إﺣﺼﺎﺋﯿﺎﺗﮫ ﺛﻢ اﺳﻢ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮد ﺑﮭﺎ ھﺬا اﻟﻌﻨﺼﺮ ‪ Schema‬ﺛﻢ اﺳﻢ ھﺬا اﻟﻌﻨﺼﺮ‬
‫‪ Name‬وﯾﺠﺐ ﻣﻼﺣﻈﺔ ﺣﺎﻟﺔ أﻷﺣﺮف ﻋﻨﺪ إدﺧﺎل اﺳﻢ اﻟﻌﻨﺼﺮ ﺣﯿﺚ أﻧﮭﺎ ﺣﺴﺎﺳﺔ ﻟﺤﺎﻟﺔ اﻷﺣﺮف ‪Case_Sensitive‬‬
‫أﻣﺎ اﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ ﻟﮭﺬا اﻷﺟﺮاء ﻓﯿﺴﺘﺨﺪم ﻟﺘﺤﺪﯾﺪ اﻟﻄﺮﯾﻘﺔ اﻟﺘﻲ ﯾﺘﻢ ﺣﺴﺎب اﻹﺣﺼﺎﺋﯿﺎت ﺑﮭﺎ وھﻰ أﺣﺪى ﺛﻼث ﻃﺮق ‪:‬‬
‫‪ : Compute -١‬وﺗﺴﺘﺨﺪم ﻟﺤﺴﺎب اﻹﺣﺼﺎﺋﯿﺎت اﻟﻔﻌﻠﯿﺔ ﻟﻠﻌﻨﺼﺮ ‪.‬‬
‫‪ : Delete -٢‬وﺗﺴﺘﺨﺪم ﻟﺤﺬف اﻹﺣﺼﺎﺋﯿﺎت ‪.‬‬
‫‪ : Estimate -٣‬وﺗﺴﺘﺨﺪم ﻟﻌﻤﻞ ﺗﺨﻤﯿﻦ ﻟﻺﺣﺼﺎﺋﯿﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻌﻨﺼﺮ وﻓﻲ ﺣﺎﻟﺔ اﺳﺘﺨﺪام ھﺬه اﻟﻄﺮﯾﻘﺔ ﻻﺑﺪ ﻣﻦ‬
‫إﺿﺎﻓﺔ اﻟﻤﻌﻄﻰ ‪ Estimate_Rows‬أو ‪ Estimate_Precent‬وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ‪:‬‬

‫ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء ‪ Analyze_Object‬ﻟﻌﻤﻞ إﺣﺼﺎﺋﯿﺔ ﻟﻠﺠﺪول ‪ Emp‬ﺑﺎﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ ‪ Compute‬وذﻟﻚ ﻋﻦ‬
‫ﻃﺮﯾﻖ اﺳﻢ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Scott‬وﻧﻮع اﺳﻢ اﻟﻌﻨﺼﺮ ‪.Table‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥٦‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪(١) DBMS_JOB   ‬‬
‫ﺗﺴﺘﺨﺪم ھﺬه اﻟﻤﺠﻤﻮﻋﺔ ﻟﺠﺪوﻟﺔ اﻟﺒﺮاﻣﺞ ‪ PL/SQL‬ﻓﺒﺎﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_JOB‬ﯾﻤﻜﻨﻨﺎ إرﺳﺎل‬
‫ﺑﺮاﻣﺞ ﻟﻠﺘﻨﻔﯿﺬ ﺑﺤﯿﺚ ﯾﺘﻢ ﺗﺸﻐﯿﻞ اﻟﺒﺮاﻣﺞ ‪ PL/SQL‬ﻃﺒﻘﺎً ﻟﺠﺪول زﻣﻨﻲ ﺣﯿﺚ ﯾﻤﻜﻨﻨﺎ ﺗﺸﻐﯿﻞ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ﻓﻲ وﻗﺖ‬
‫ﻣﺤﺪد أو ﺣﺬﻓﮫ ﻣﻦ اﻟﺠﺪول اﻟﺰﻣﻨﻲ ﻓﻲ وﻗﺖ ﻣﺤﺪد ﻛﻤﺎ ﯾﻤﻜﻦ إﯾﻘﺎف ﺗﺸﻐﯿﻞ اﻟﺒﺮﻧﺎﻣﺞ ﻟﻔﺘﺮة زﻣﻨﯿﺔ ﻣﺤﺪدة ﻛﻤﺎ ﯾﻤﻜﻦ‬
‫اﺳﺘﺨﺪام ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻟﺠﺪوﻟﺔ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻷﻋﻤﺎل أﺛﻨﺎء ﺳﺎﻋﺎت اﻟﻌﻤﻞ ﺧﻼف اﻟﺴﺎﻋﺎت اﻟﻀﺮورة أو‬
‫ﻋﻤﻞ ﺻﯿﺎﻧﺔ ﻟﻠﺒﺮاﻣﺞ أﺛﻨﺎء ﺳﺎﻋﺎت اﻟﻌﻤﻞ ﻣﻨﺨﻔﻀﺔ اﻻﺳﺘﻌﻤﺎل وﺗﺤﺘﻮي ھﺬه اﻟﻤﺠﻤﻮﻋﺔ ﻋﻠﻰ ﻋﺪد ﻣﻦ اﻹﺟﺮاءات اﻟﺘﻲ‬
‫ﺗﻤﻜﻨﻨﺎ ﻣﻦ ﻋﻤﻞ ﺟﻤﯿﻊ ھﺬه اﻟﻌﻤﻠﯿﺎت وھﻲ اﻹﺟﺮاء ‪ Submit‬وﯾﻌﻤﻞ ھﺬا اﻹﺟﺮاء ﻋﻠﻰ إرﺳﺎل اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬
‫‪ Subprogram‬إﻟﻰ ﻗﺎﺋﻤﺔ اﻟﻮﻇﺎﺋﻒ ‪ JOB Queue‬وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪-:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_JOB‬ﯾﻠﯿﮭﺎ اﻟﻌﻼﻣﺔ دوت ]‪ [.‬ﺛﻢ اﺳﻢ اﻹﺟﺮاء ‪Submit‬‬
‫وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﻋﺪدا ﻣﻦ اﻟﻤﻌﻄﯿﺎت اﻟﻤﻌﻄﻰ اﻷول ‪ JOB‬وﯾﻌﻤﻞ ﻋﻠﻰ إﻋﺎدة اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ﻟﮭﺬا اﻹﺟﺮاء ﻓﻲ‬
‫ﻗﺎﺋﻤﺔ اﻟﻮﻇﺎﺋﻒ وﯾﺄﺧﺬ اﻷﺳﻠﻮب ‪ OUT‬واﻟﻤﻌﻄــــﻰ ‪ What‬ھﻮ ﻋﺒﺎرة ﻋﻦ اﻹﺟﺮاء اﻟﺬي ﺳﯿﺘﻢ إرﺳﺎﻟﮫ إﻟﻰ ﻗﺎﺋﻤﺔ‬
‫اﻟﻮﻇﺎﺋﻒ واﻟﻤﻌﻄﻰ ‪ Next_date‬ﻋﺒﺎرة ﻋﻦ اﻟﺘﻮﻗﯿﺖ اﻟﺬي ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬ ھﺬا اﻹﺟﺮاء ﺑﮫ ﻓﻲ اﻟﻤﺮة اﻟﻘﺎدﻣﺔ واﻟﻤﻌﻄــــﻰ‬
‫‪ interval‬وھﻮ ﻋﺒﺎرة ﻋﻦ وﻇﯿﻔﺔ ﺗﺴﺘﺨﺪم ﻟﺤﺴﺎب اﻟﺘﻮﻗﯿﺖ اﻟﺘﺎﻟﻲ اﻟﺬي ﺳﻮف ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ ﺑﮫ أﻣﺎ اﻟﻤﻌﻄـــــﻰ‬
‫‪ no_parse‬ﻓﮭﻮ ﺧﺎص ﺑﻌﻤﻠﯿﺔ ﻓﺤﺺ ﻛﻮد اﻹﺟﺮاء واﻟﻘﯿﻤﺔ اﻻﻓﺘﺮاﺿﯿﺔ ﻟﮭﺬا اﻟﻤﻌﻄﻰ ھﻮ ‪ False‬أي أن اﻟﺨﺎدم‬
‫أوراﻛﻞ ‪ Oracle server‬ﺳﯿﻘﻮم ﺑﻔﺤﺺ اﻟﻜﻮد اﻟﺨﺎص ﺑﺎﻹﺟﺮاء أﻣﺎ إذا ﻛﺎﻧﺖ ﻗﯿﻤﺔ اﻟﻤﻌﻄﻰ ‪ True‬ﻓﺴﯿﻘﻮم ﺧﺎدم‬
‫أوراﻛﻞ ﺑﻌﺪم ﻓﺤﺺ اﻷﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻹﺟﺮاء وﺗﺴﺘﺨﺪم ھﺬا اﻹﺟﺮاء إذا أردﻧﺎ أن ﻧﻀﯿﻒ إﺟﺮاء إﻟﻰ ﻗﺎﺋﻤﺔ‬
‫اﻟﻮﻇﺎﺋﻒ ﻗﺒﻞ إﻧﺸﺎءه ‪ .‬وﻷدراك وﻓﮭﻢ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ ﺳﻨﻘﻮم ﺑﺎﻟﺘﺪرج ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ﻟﻠﺘﻄﺒﯿﻖ‬
‫ﺟﻤﯿﻊ اﻹﺟﺮاءات ھﺬه اﻟﻤﺠﻤﻮﻋﺎت ﻋﻠﯿﮫ ‪-:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥٧‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻤﺜﺎل أﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻒ اﻟﻤﺘﻐﯿﺮ ‪ Jobno‬ﻟﺘﺨﺰﯾﻦ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ﻟﻺﺟﺮاء ‪ Add_dept‬ﻓﻲ ﻗﺎﺋﻤﺔ‬
‫اﻟﻮﻇﺎﺋﻒ اﻟﻨﺎﺗﺠﺔ ﻟﻺﺟﺮاء ‪ Submit‬ﺛﻢ ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻒ اﻹﺟﺮاء ‪ DBMS_JOB.SUBMIT‬ﻓﻲ اﻟﻘﺎﻟﺐ‬
‫‪ PL/SQL‬ﻣﺎ ﺑﯿﻦ ‪ Begin‬و ‪ End‬وﺑﺘﺸﻐﯿﻞ ھﺬا اﻟﻘﺎﻟﺐ ﯾﺘﻢ وﺿﻊ اﻹﺟﺮاء ‪ Add_dept‬ﻓﻲ ﻗﺎﺋﻤﺔ اﻟﻮﻇﺎﺋﻒ‬
‫وﺗﻤﺮﯾﺮ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ﻟﮫ اﻟﻰ اﻟﻤﺘﻐﯿﺮ ‪ Jobno‬وﻟﻤﻌﺮﻓﺔ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ﻟﮭﺬا اﻹﺟﺮاء ﻓﻲ ﻗﺎﺋﻤﺔ اﻟﻮﻇﺎﺋﻒ ﻧﻘﻮم‬
‫‪Print Jobno‬‬ ‫ﺑﻄﺒﺎﻋﺔ اﻟﻤﺘﻐﯿﺮ ‪ Jobno‬ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ ‪; :‬‬

‫‪(٢) DBMS_JOB    ‬‬


‫ﺗﻌﺮﻓﻨﺎ ﻓﯿﻤﺎ ﺳﺒﻖ ﻋﻠﻰ ﻛﯿﻔﯿﺔ إرﺳﺎل اﻹﺟﺮاءات ﻓﻲ ﻗﺎﺋﻤﺔ اﻟﻮﻇﺎﺋﻒ ‪ Job_Queue‬ﻟﻨﻈﺎم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪RDBMS‬‬
‫ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء ‪-: Submit‬‬
‫‪Job_Queue‬‬ ‫‪SUBMIT‬‬
‫وﻓﻲ ھﺬا اﻟﺪرس ﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ ﺗﻐﯿﯿﺮ ﻣﻌﻄﯿﺎت ھﺬه اﻹﺟﺮاءات ﻓﻲ ﻗﺎﺋﻤﺔ اﻟﻮﻇﺎﺋﻒ وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاءات ‪:‬‬

‫وﯾﺴﺘﺨﺪم اﻹﺟﺮاء ‪ Change‬ﻟﺘﻐﯿﯿﺮ ﺟﻤﯿﻊ اﻟﻤﻌﻄﯿﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻹﺟﺮاء ﻣﺜﻞ اﻟﻤﻌﻄﻰ ‪ What‬أو ‪ Next_date‬أو‬
‫‪ interval‬وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ ‪-:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_JOB‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻹﺟﺮاء ‪ Change‬وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء‬
‫أرﺑﻌﺔ ﻣﻌﻄﯿﺎت اﻟﻤﻌﻄﻰ اﻷول ‪ JOB‬ﻋﺒﺎرة ﻋﻦ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ اﻟﺨﺎص ﺑﮭﺬا اﻹﺟﺮاء ﻓﻲ ﻗﺎﺋﻤﺔ اﻟﻮﻇﺎﺋﻒ واﻟﻤﻌﻄﻰ‬
‫اﻟﺜﺎﻧﻲ ‪ What‬ﻋﺒﺎرة ﻋﻦ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﺎﻹﺟﺮاء واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ‪ Next_date‬ﻋﺒﺎرة ﻋﻦ اﻟﻮﻗﺖ اﻟﺘﺎﻟﻲ ﻟﺘﻨﻔﯿﺬ‬
‫اﻹﺟﺮاء أﻣﺎ اﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ ‪ interval‬ﻓﮭﻮ اﻟﺨﺎص ﺑﺘﺤﺪﯾﺪ اﻟﻔﺘﺮة اﻟﺰﻣﻨﯿﺔ ﺑﯿﻦ أوﻗﺎت ﺗﻨﻔﯿﺬ اﻹﺟﺮاء ﻋﻠﻰ ﺳﺒﯿﻞ‬
‫اﻟﻤﺜﺎل إذا أردﻧﺎ ﺗﻌﺪﯾﻞ وﻗﺖ ﺗﻨﻔﯿﺬ اﻹﺟﺮاء ‪ Add_dept‬ﻣﻦ اﻟﺴﺎﻋﺔ ‪ 12:00Am‬ﺻﺒﺎﺣﺎ اﻟﻰ اﻟﺴﺎﻋﺔ ‪6:00Am‬‬
‫ﺻﺒﺎﺣﺎ وﺗﻌﺪﯾﻞ ﻓﺘﺮة ﺗﻜﺮار اﻟﺘﻨﻔﯿﺬ اﻟﻰ ‪ 4‬ﺳﺎﻋﺎت ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥٨‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺗﻮﺿﯿﺢ‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ﻟﮭﺬا اﻹﺟﺮاء ﻓﻲ ﻗﺎﺋﻤﺔ اﻟﻮﻇﺎﺋﻒ وھﻮ ‪ 121‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺛﻢ اﻟﻘﯿﻤﺔ ‪ NULL‬اﻟﺘﻲ‬
‫ﺗﺪل ﻋﻠﻰ ﻋﺪم اﻟﺘﻌﺪﯾﻞ ﻓﻲ ھﺬا اﻟﻤﻌﻄﻰ وھﻮ اﻟﻤﻌﻄﻰ ‪ What‬ﺛﻢ ﯾﺘﻢ ﺗﻌﺪﯾﻞ اﻟﻤﻌﻄﻰ ‪ Next_date‬ﻓﻲ‪-:‬‬
‫‪ Trunc(sysdate+1)+6/24‬واﻟﻤﻌﻄﻰ ‪ interval‬ﻋﻦ ﻃﺮﯾﻖ اﻟﺘﻌﺒﯿﺮات اﻟﻤﻮﺟﻮدة ‪ sysdate+4/24‬أﻣﺎ‬
‫اﻹﺟﺮاء‪:‬‬
‫‪What‬‬
‫‪Next_date‬‬
‫‪Interval‬‬
‫ﻓﮭﻲ ﻣﺨﺼﺼـــــﺔ ﺑﺘﻌﺪﯾﻞ اﻟﻤﺘﻐﯿﺮات اﻟﻤﺤــــــــــــــــﺪدة ‪.‬‬
‫ﻓﺎﻹﺟﺮاء ‪ What‬ﯾﺴﺘﺨﺪم ﻟﺘﻌﺪﯾﻞ اﻟﻤﻌﻄﻰ ‪ What‬ﻣﺜﻞ ‪:‬‬

‫واﻹﺟﺮاء ‪ Next_date‬ﯾﺴﺘﺨﺪم ﻟﺘﻌﺪﯾﻞ اﻟﻤﻌﻄﻰ ‪ next_date‬ﻣﺜﻞ ‪:‬‬

‫أﻣﺎ اﻹﺟﺮاء ‪ Interval‬ﻓﯿﺴﺘﺨﺪم ﻟﺘﻌﺪﯾﻞ اﻟﻤﻌﻄﻰ ‪ Interval‬ﻣﺜﻞ ‪:‬‬

‫ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ أﯾﻀﺎ ﺗﺸﻐﯿﻞ وﺣﺬف اﻟﻮﻇﺎﺋﻒ ﻣﻦ ﺧﻼل اﻹﺟﺮاءات ‪-:‬‬


‫‪-RUN‬‬
‫‪-Remove‬‬
‫وذﻟﻚ ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ ﻣﻊ أي ﻣﻦ اﻻﺟﺮاﺋﯿﻦ ‪:‬‬

‫ﺣﯿﺚ ﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ Package_name‬ﺛﻢ اﻟﺮﻣﺰ دوت]‪ [.‬ﯾﻠﯿﮭﺎ أﺳﻢ اﻹﺟﺮاء‬
‫‪ Procedure_name‬ﺛﻢ اﻟﻤﻌﻄﯿﺎت ‪ Parameters‬اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻹﺟﺮاء )‪ (Job_id‬وھﻮ ﻋﺒﺎرة ﻋﻦ اﻟﺮﻗﻢ‬
‫اﻟﺨﺎص ﺑﺎﻟﻮﻇﯿﻔﺔ اﻟﻤﺮاد ﺣﺬﻓﮭﺎ أو ﺗﻨﻔﯿﺬھﺎ ﻓﺈذا أردﻧﺎ ﺗﺸﻐﯿﻞ وﻇﯿﻔﺔ ﻣﻌﯿﻨﺔ ﺑﺼﺮف اﻟﻨﻈﺮ ﻋﻦ اﻟﻤﯿﻌﺎد اﻟﻤﺤﺪد ﻟﺘﺸﻐﯿﻠﮭﺎ‬
‫ﻋﻨﺪ إﻧﺸﺎﺋﮭﺎ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء ‪ Run‬ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ‪:‬‬
‫;)‪DBMS_JOB.RUN(121‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٥٩‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺘﻤﺮﯾﺮ رﻗﻢ اﻟﻮﻇﯿﻔﺔ وھﻮ ‪ 121‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﻛﻤﻌﻄﻰ ﻟﻺﺟﺮاء ‪. RUN‬‬
‫أﻣﺎ اﻹﺟﺮاء ‪ Broken‬ﻓﯿﺴﺘﺨﺪم ﻟﺘﻌﻄﯿﻞ ﺗﻨﻔﯿﺬ اﻟﻮﻇﯿﻔﺔ ﺣﺘﻰ وﻗﺖ ﻣﻌﯿﻦ وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت ﻛﻤﺎ ﻓﻲ‬
‫اﻟﺘﺎﻟﻲ ‪:‬‬

‫اﻟﻤﻌﻄﻰ اﻷول ‪ Job‬ﻋﺒﺎرة ﻋﻦ رﻗﻢ اﻟﻮﻇﯿﻔﺔ أﻣﺎ اﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ‪ Broken‬ﻋﺒﺎرة ﻋﻦ ﻗﯿﻤﺔ ﻣﻨﻄﻘﯿﺔ ‪ Boolean‬ﻓﺈذا‬
‫ﻛﺎﻧﺖ ﻗﯿﻤﺔ ھﺬا اﻟﻤﻌﻄﻰ ‪ False‬ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬ﺑﺘﻨﻔﯿﺬ اﻟﻮﻇﯿﻔﺔ وأذا ﻛﺎﻧﺖ ﻗﯿﻤﺔ ھﺬا اﻟﻤﻌﻄﻰ‬
‫‪ True‬ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬ﺑﺘﻌﻄﯿﻞ ھﺬه اﻟﻮﻇﯿﻔﺔ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ‪ Next_date‬ﻋﺒﺎرة ﻋﻦ‬
‫اﻟﺘﺎرﯾﺦ اﻟﻤﺤﺪد ﺑﺎﺳﺘﺌﻨﺎف ﺗﻨﻔﯿﺬ اﻟﻮﻇﯿﻔﺔ ﻓﺈذا أردﻧﺎ ﺗﻌﻄﯿﻞ ﺗﻨﻔﯿﺬ اﻟﻮﻇﯿﻔﺔ رﻗﻢ )‪ (121‬ﺛﻢ إﻋﺎدة ﺗﻨﻔﯿﺬھﺎ ﺑﻌﺪ ﯾﻮﻣﯿﻦ ﻧﻘﻮم‬
‫ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد‪:‬‬
‫ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ ﻋﺮض ﺑﻌﺾ اﻟﻤﻌﻠﻮﻣﺎت ﻋﻦ اﻟﻮﻇﺎﺋﻒ وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ‪ DBA_JOBS‬ﺑﺸﺮط أن ﯾﻜﻮن‬
‫اﻟﻤﺴﺘﺨﺪم ﻟﮫ ﺣﻘﯿﺔ اﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Select‬ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻋﺮض ﺑﯿﺎﻧﺎت اﻟﻮﻇﯿﻔﺔ رﻗﻢ ‪ 27‬ﻧﻘﻮم‬
‫ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد‪:‬‬

‫ﻋﻨﺪ ﺗﺸﻐﯿﻞ ﺑﺎﻟﻤﻔﺘﺎح ‪ Enter‬ھﺬا اﻻﺳﺘﻌﻼم ﯾﺘﻢ ﻋﺮض ﺑﯿﺎﻧﺎت اﻟﻮﻇﯿﻔﺔ رﻗﻢ ‪ 27‬ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ أﯾﻀﺎ اﺳﺘﺨﺪام اﻟﺠﺪول‬
‫‪ DBA_Jobs_Running‬ﻟﻌﺮض ﺑﯿﺎﻧﺎت ﻋﻦ اﻟﻮﻇﺎﺋﻒ اﻟﻤﻨﻔﺬّة ﺣﺎﻟﯿﺎً ‪.‬‬ ‫اﻟﺘﺨﯿﻠﻲ‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦٠‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪DBMS_OUTPUT   ‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻣﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿـــﺔ ﻣﻦ أﻛﺜﺮ اﻟﻤﺠﻤﻮﻋﺎت اﺳﺘﺨﺪاﻣﺎً ﻓﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ‬
‫وھﻲ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_OUTPUT‬وﺗﺴﻤﺢ ﻟﻨﺎ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﺑﻌﺮض اﻟﺒﯿﺎﻧﺎت اﻟﻨﺎﺗﺠﺔ‬
‫ﻣﻦ ﺗﺸﻐﯿﻞ اﻟﺒﺮاﻣﺞ ‪ PL/SQL‬ﻛﻤﺎ ﺗﺘﯿﺢ ﻟﻠﻤﺒﺮﻣﺠﯿﻦ إﻣﻜﺎﻧﯿﺔ ﺗﺘﺒﻊ ﺧﻄﻮات ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ ‪ Debugging‬ﻋﻦ‬
‫ﻃﺮﯾﻖ ﻋﺮض ﺑﻌﺾ اﻟﺮﺳﺎﺋﻞ اﻟﺘﻲ ﺗﻮﺿﺢ ﺧﻂ ﺳﯿﺮ اﻟﺒﺮﻧﺎﻣﺞ ﻛﻤﺎ أﻧﮭﺎ ﺗﺴﺘﺨﺪم أﯾﻀﺎ ﻓﻲ ﻋﻤﻞ اﻟﺘﻘﺎرﯾﺮ ﻓﻲ اﻟﻠﻐﺔ‬
‫‪ SQL*PLUS‬وﺗﺤﺘﻮي ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻋﻠﻰ أﻛﺜﺮ ﻣﻦ إﺟﺮاء وأول ھﺬه اﻹﺟﺮاءات اﻹﺟﺮاء‪:‬‬
‫‪DBMS_OUTPUT.PUT‬‬
‫وﯾﻌﻤﻞ ھﺬا ﻹﺟﺮاء ﻋﻠﻰ وﺿﻊ اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﺬاﻛﺮة ‪ Buffer‬ﻋﻠﻰ ﺳﻄﺮ واﺣﺪ ﻓﻘﻂ وﻻ ﯾﻌﻤﻞ ھﺬا اﻹﺟﺮاء ﻋﻠﻰ ﻧﻘﻞ‬
‫اﻟﻤﺆﺷﺮ ﻋﻠﻰ اﻟﺴﻄﺮ اﻟﺜﺎﻧﻲ وﺑﺎﻟﺘﺎﻟﻲ ﻻ ﯾﻘﻮم ﺑﺈﻧﮭﺎء ﻋﻤﻠﯿﺔ اﻹدﺧﺎل ﻟﺬﻟﻚ ﻻﺑﺪ ﻣﻦ اﺳﺘﺨﺪام اﻹﺟﺮاء‪:‬‬
‫‪DBMS_OUTPUT.NEW_LINE‬‬
‫ﻟﻨﻘﻞ اﻟﻤﺆﺷﺮ اﻟﻰ ﺳﻄﺮ ﺟﺪﯾﺪ ﻣﻊ إﻏﻼق ﻋﻤﻠﯿﺔ أدﺧﻼ اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﺬاﻛﺮة ‪ Buffer‬ﺛﻢ ﻋﺮض اﻟﺒﯿﺎﻧﺎت وﻹدراك ﻛﯿﻔﯿﺔ‬
‫ﻋﻤﻞ ھﺬه اﻹﺟﺮاءات ﻧﻨﻈﺮ اﻟﻰ ھﺬا اﻟﻤﺜﺎل ‪:‬‬

‫ﺗﻮﺿﯿـــﺢ‬

‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻒ ﺛﻼﺛﺔ ﻣﺘﻐﯿﺮات اﻷول ﻣﻦ اﻟﻨﻮع ‪ Number‬واﻟﺜﺎﻧﻲ ﻣﻦ اﻟﻨﻮع ‪ Varchar2‬واﻟﺜﺎﻟﺚ ﻣﻦ اﻟﻨﻮع‬
‫‪ Date‬ﺛﻢ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء ‪ DBMS_OUTPUT.PUT‬ﻹدﺧﺎل ﻗﯿﻢ ھﺬه اﻟﻤﺘﻐﯿﺮات ﻓﻲ اﻟﺬاﻛﺮة ‪ Buffer‬ﺛﻢ‬
‫ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء‪ DBMS_OUTPUT.NEW_LINE‬ﻹﻧﮭﺎء ﻋﻤﻠﯿﺔ اﻹدﺧﺎل ﺛﻢ ﻋﺮض ھﺬه اﻟﺒﯿﺎﻧﺎت‬
‫وﺑﺘﺸﻐﯿﻞ ھﺬا اﻟﻘﺎﻟﺐ ‪ PL/SQL‬ﻧﻼﺣﻆ أﻧﮫ ﺗﻢ ﻋﺮض اﻟﺒﯿﺎﻧﺎت ﻋﻠﻰ ﺳﻄﺮ واﺣﺪ ﻓﻘﻂ ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦١‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻛﻤﺎ ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻹﺟﺮاء ‪ DBMS_OUTPUT.PUT_LINE‬ﺑﺪﻻ ﻣﻦ اﺳﺘﺨﺪام اﻷﺟﺮاﺋﯿﻦ ‪ PUT‬و‬
‫‪ NEW_LINE‬ﺣﯿﺚ ﯾﻘﻮم ھﺬا اﻹﺟﺮاء ﺑﻮﻇﯿﻔﺔ اﻹﺟﺮاءﯾﻦ ﻣﻌﺎً ﻓﺎﻟﻌﻤﻞ ﻧﻔﺲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﺑﺎﺳﺘﺨﺪام ھﺬا اﻹﺟﺮاء‬
‫‪ DBMS_OUTPUT.PUT_LINE‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد‪:‬‬

‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء ‪ DBMS_OUTPUT.PUT_LINE‬ﻟﻌﺮض ﻗﯿﻢ اﻟﻤﺘﻐﯿﺮات ‪ id‬و‪ Name‬و _‪Hire‬‬
‫‪ date‬أﻣﺎ اﻹﺟﺮاءات ‪:‬‬
‫‪- Get_line‬‬
‫‪- Get_lines‬‬
‫ﻓﺘﻌﻤﻞ ﻋﻠﻰ اﺳﺘﺮﺟﺎع اﻟﺼﻔﻮف ﻣﻦ اﻟﺬاﻛﺮة ‪ Buffer‬ﺣﯿﺚ ﯾﻘﻮم اﻹﺟﺮاء ‪ Get_line‬ﺑﺎﺳﺘﺮﺟﺎع ﺻﻒ واﺣﺪ ﻣﻦ‬
‫‪ One line‬وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﻣﻌﻄﯿﺎن اﻟﻤﻌﻄﻰ اﻷول‬ ‫ﺻﻔﻮف اﻟﺬاﻛﺮة ‪Buffer‬‬

‫ﻋﺒﺎرة ﻋﻦ اﻟﺴﻄﺮ اﻟﺬي ﻗﺎم اﻹﺟﺮاء ﺑﺎﺳﺘﺮﺟﺎﻋﮫ ‪ Line‬وھﻮ ﻣﻦ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Varchar2‬وﻟﮫ اﻟﻘﺪرة ﻋﻠﻰ ﺗﺨﺰﯾﻦ‬
‫‪ 255‬ﺑﺎﯾﺖ‪ .‬واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ ﻗﯿﻤﺔ رﻗﻤﯿﺔ ﻣﻦ ﻧﻮع ‪ Integer‬وھﻮ ‪ Status‬ﻓﺈذا ﻛﺎﻧﺖ ھﺬه اﻟﻘﯿﻤﺔ ﺻﻔﺮ‬
‫]‪ [0‬دل ذﻟﻚ ﻋﻠﻰ أن ﻋﻤﻠﯿﺔ اﺳﺘﺮﺟﺎع اﻟﺒﯿﺎﻧﺎت ﺗﻤﺖ ﺑﻨﺠﺎح وإذا ﻛﺎﻧﺖ اﻟﻘﯿﻤﺔ واﺣﺪ ]‪ [1‬دل ذﻟﻚ ﻋﻠﻰ أﻧﮫ ﻟﻢ ﯾﺘﻢ‬
‫اﺳﺘﺮﺟﺎع أي ﺑﯿﺎﻧﺎت ﻣﻦ اﻟﺬاﻛﺮة ‪.‬‬
‫أﻣﺎ اﻹﺟﺮاء ‪ Get_Lines‬ﻓﯿﻌﻤﻞ ﻋﻠﻰ اﺳﺘﺮﺟﺎع ﻋﺪد ﻣﻦ اﻷﺳﻄﺮ اﻟﺬاﻛﺮة ‪ Many Lines Buffer‬وﻧﻼﺣﻆ ان‬
‫ھﺬا اﻹﺟﺮاء ﯾﺄﺧﺬ ﻣﻌﻄﯿﺎن‪:‬‬

‫اﻟﻤﻌﻄﻰ اﻷول ﻋﺒﺎرة ﻋﻦ ﻣﺼﻔﻮﻓﺔ ‪ PL/SQL Array‬ﺗﺴﺘﺨﺪم ﻟﺘﺨﺰﯾﻦ اﻷﺳﻄﺮ اﻟﻤﺴﺘﺮﺟﻌﺔ ﻣﻦ اﻟﺬاﻛﺮة وھﺬه‬
‫اﻟﻤﺼﻔﻮﻓﺔ ﻟﮭﺎ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪. CHARARR‬‬
‫واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ ﻗﯿﻤﺔ رﻗﻤﯿﺔ ﺗﺴﺘﺨﺪم ﻟﺘﺨﺰﯾﻦ ﻋﺪد اﻷﺳﻄﺮ اﻟﺘﻲ ﺗﻢ اﺳﺘﺮﺟﺎﻋﮭﺎ ﻛﻤﺎ ﯾﻤﻜﻦ ﺗﺤﺪﯾﺪ ﻋﺪد ﻣﻦ‬
‫اﻷﺳﻄﺮ اﻟﺘﻲ ﺳﯿﺘﻢ اﺳﺘﺮﺟﺎﻋﮭﺎ ﻣﻦ ھﺬا اﻹﺟﺮاء وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ ﻧﻔﺲ اﻟﻤﻌﻄﻰ وذﻟﻚ ﻷﻧﮫ ﻣﻌﻄﻰ ﻣﻦ اﻟﻨﻮع‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦٢‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪ IN OUT Parameters‬وﻹﻏﻼق ﺟﻤﯿﻊ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻣﺎﻋﺪا اﻹﺟﺮاء‬
‫‪ DBMS_OUTPUT.Enable‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻹرﺟﺎء ‪:‬‬
‫‪ DBMS_OUTPUT.Disable‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺼﯿﻐـــــــــــﺔ اﻟﺘﺎﻟﯿﺔ ‪:‬‬
‫;‪DBMS_OUTPUT.Disable‬‬
‫وﻹﺗﺎﺣﺔ ﺟﻤﯿﻊ ھﺬه اﻹﺟﺮاءات اﻟﻤﺠﻤﻮﻋﺔ ﺑﺎﻟﻌﻤﻞ ﻣﺮة أﺧﺮى ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء ‪:‬‬
‫;‪DBMS_OUTPUT.Enable‬‬
‫**************************************************‬
‫‪UTL_FILE   ‬‬

‫ﺗﺘﯿﺢ ﻣﻌﻈﻢ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ إﻣﻜﺎﻧﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ ﺑﺎﻟﻨﻈﺎم ‪ External File‬ﻛﻤﺪﺧﻼت وﻣﺨﺮﺟﺎت ‪i/o‬‬
‫ﻟﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻛﻤﺎ ﺗﺘﯿﺢ اﻟﻠﻐﺔ ‪ PL/SQL‬إﻣﻜﺎﻧﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ ﻟﻠﻨﻈﺎم وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻤﺠﻤﻮﻋﺔ‬
‫اﻟﺒﺮﻣﺠﯿﺔ ‪ UTL_File‬ﻓﻤﻦ ﺧﻼل ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﯾﻤﻜﻦ ﻟﺒﺮاﻣﺞ اﻟﻠﻐﺔ ‪ PL/SQL‬اﻟﺘﻔﺎﻋﻞ ﻣﻊ ﻣﻠﻔﺎت اﻟﻨﻈﺎم‬
‫اﻟﻨﺼﯿـــﺔ ‪ Operating system text‬وذﻟﻚ ﻣﻦ ﺧﻼل ﻋﺪدا ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﺘﻲ ﺗﺪﻋﻤﮭﺎ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ‬
‫وﻗﺒﻞ اﺳﺘﻌﺮاض ھﺬه اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻻﺑﺪ ﻣﻦ ﺗﮭﯿﺌﺔ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻟﺘﻔﺎﻋﻞ ﻣﻊ ھﺬا اﻟﻤﻠﻒ وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺨﻄﻮات‬
‫اﻟﺘﺎﻟﯿﺔ‪:‬‬
‫أوﻻ ‪ :‬ﻧﻘﻮم ﺑﺈﻧﺸﺎء ﻣﺠﻠﺪ اﻟﺬي ﺳﯿﺘﻢ إﻧﺸﺎء اﻟﻤﻠﻔﺎت ﺑﮫ‪.‬‬
‫ﺛﺎﻧﯿﺎً‪ :‬إﻧﺸﺎء ﺳﺠﻞ ﺧﺎص ﻟﮭﺬا اﻟﻤﺠﻠﺪ ﻓﻲ اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ‪ All_Directories‬ﻷﻋﻼم ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻋﻦ اﺳﻢ‬
‫وﻣﻮﻗﻊ ھﺬا اﻟﻤﻠﻒ وذﻟﻚ ﻣﻦ ﻋﻨﺪ ﻗﯿﺎم أﺣﺪ ﻣﺪﯾﺮي ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ DBA‬ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ‪Create Directory‬‬
‫وﯾﺄﺧﺬ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪:‬‬
‫; '‪Create Directory director_name AS 'director_location‬‬
‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻷﻣﺮ ‪ Create Directory‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﺠﻠﺪ اﻟﺬي ﺗﻢ إﻧﺸﺎءه ﺳﺎﺑﻘﺎً ﺛﻢ اﻟﻜﻠﻤﺔ ‪ AS‬ﯾﻠﯿﮭﺎ اﻟﻤﻮﻗﻊ‬
‫اﻟﻤﻮﺟﻮد ﻓﯿﮭﺎ ھﺬا اﻟﻤﺠﻠﺪ ﻛﻤﺎ ﯾﺠﺐ ﻋﻠﻰ ﻣﺪﯾﺮي ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أن ﯾﻘﻮم ﺑﺈﺗﺎﺣﺔ ھﺬا اﻟﻤﻠﻒ ﻟﻼﺳﺘﺨﺪام وذﻟﻚ‬
‫ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ ‪:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﻜﻠﻤﺔ ‪ Grant‬ﯾﻠﯿﮭﺎ اﻟﺨﺎﺻﯿﺔ اﻟﺘﻲ ﻧﺮﯾﺪ ﻣﻨﺤﮭﺎ ﻟﮭﺬا اﻟﻤﺴﺘﺨﺪم وھﻲ أﻣﺎ ‪ Read‬أو ‪ Write‬أو‬
‫ﻛﻼھﻤﺎ ﻣﻌﺎً ‪ ALL‬وﯾﻠﯿﮭﺎ اﻟﻜﻠﻤﺔ ‪ On Directory‬ﺛﻢ اﺳﻢ ھﺬا اﻟﻤﺠﻠﺪ ‪ Director_name‬ﺛﻢ اﻟﻜﻠﻤﺔ ‪ To‬ﯾﻠﯿﮭﺎ اﺳﻢ‬
‫اﻟﻤﺴﺘﺨﺪم ‪ User_name‬ﻛﻤﺎ ﯾﻤﻜﻦ ﻣﻨﺢ ھﺬه اﻟﺨﺎﺻﯿﺔ ﻟﺠﻤﯿﻊ اﻟﻤﺴﺘﺨﺪﻣﯿﻦ ﺑﺎﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ ‪ Public‬وﺑﺬﻟﻚ ﻗﺪ ﻗﻤﻨﺎ‬
‫ﺑﺘﮭﯿﺌﺔ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻟﻠﺘﻔﺎﻋﻞ ﻣﻊ ھﺬا اﻟﻤﻠﻒ ﻓﺈذا أردﻧﺎ ﻋﻤﻞ ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ ‪ Sub-program‬ﯾﻘﻮم ﺑﻌﻤﻞ ﺗﻘﺮﯾﺮاً‬
‫‪ Reports‬ﻋﻦ ﺑﯿﺎﻧﺎت اﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﻮﺟﻮدﯾﻦ ﻓﻲ ﺟﺪول اﻟﻤﻮﻇﻔﯿﻦ ‪ Employees‬ﻓﻲ ﻣﻠﻒ ﺧﺎرﺟﻲ ﻧﻘﻮم أو ﻻً ﺑﺈﻧﺸﺎء‬
‫اﻟﻤﺠﻠﺪ اﻟﺬي ﺳﻮف ﺗﻘﻮم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺑﺎﻟﺘﻔﺎﻋﻞ ﻣﻌﮫ وﻟﯿﻜﻦ اﻟﻤﺠﻠﺪ ‪ ORALoad‬ﻋﻠﻰ اﻟﻘﺮص اﻟﺼﻠﺐ ‪ C‬أو ‪D‬‬
‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦٣‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺛﻢ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ‪ Create Directory‬ﻣﻦ ﺧﻼل اﻟﻤﺴﺘﺨﺪم ‪ Sys‬ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ‪:‬‬
‫‪Create Directory‬‬ ‫‪Sys‬‬
‫ﻣﻦ ﺧﻼل اﻷﻣﺮ ‪:‬‬
‫;'‪Create Directory ORALoad AS 'c:\oraload‬‬
‫‪Create Directory‬‬ ‫ﻓﺘﻈﮭﺮ ھﺬه اﻟﺮﺳﺎﻟﺔ ‪:‬‬
‫وﻟﻠﺘﺄﻛﺪ ﻣﻦ إﻧﺸﺎء ھﺬا اﻟﻤﻠﻒ ﻧﻘﻮم ﺑﺎﻻﺳﺘﻌﻼم ﻋﻨﮫ ﻣﻦ ﺧﻼل اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ‪ All_Directory‬ﻛﻤﺎﻓﻲ اﻟﺘﺎﻟﻲ‪:‬‬
‫;‪Select *from All_Directories‬‬
‫ﻓﺘﻈﮭﺮ ﺟﻤﯿﻊ اﻟﺴﺠﻼت اﻟﻤﻮﺟﻮدة ﻓﻲ ھﺬا اﻟﺠﺪول ﺑﻤﺎ ﻓﯿﮭﻢ اﻟﺴﺠﻞ اﻟﺨﺎص ﺑﺎﻟﻤﺠﻠﺪ اﻟﺬي ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ واﻵن ﻧﻘﻮم‬
‫ﺑﻤﻨﺢ اﻣﺘﯿﺎز اﺳﺘﺨﺪام ھﺬا اﻟﻤﺠﻠﺪ ﻟﻠﻤﺴﺘﺨﺪم ﻣﺜﻼ ‪ Alsaeedi‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد ‪:‬‬
‫;‪Grant All On Directory ORALoad To Alsaeedi‬‬
‫‪Grant Succeeded‬‬ ‫ﻓﺘﻈﮭﺮ اﻟﺮﺳﺎﻟﺔ‪:‬‬
‫وﺑﮭﺬا ﻗﺪ ﻗﻤﻨﺎ ﺑﺘﮭﯿﺌﺔ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺴﺘﺨﺪم ‪ Alsaeedi‬ﻟﻠﺘﻔﺎﻋﻞ ﻣﻊ اﻟﻤﺠﻠﺪ ‪ OraLoad‬ﻋﻠﻰ اﻟﻘﺮص‬
‫اﻟﺼﻠﺐ ‪. C‬‬
‫**********************************************************************‬
‫‪        ‬‬

‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﺳﺘﺨﺪام اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ‪ Sub-program‬اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺠﻤﻮﻋﺎت‬
‫اﻟﺒﺮﻣﺠﯿﺔ ‪ UTL_File‬ﻟﻠﺘﻔﺎﻋﻞ ﻣﻊ ﻣﻠﻔﺎت اﻟﻨﻈﺎم اﻟﺨﺎرﺟﯿﺔ وﯾﻘﺼﺪ ﺑﺎﻟﺘﻔﺎﻋﻞ ھﻨﺎ ھﻲ إﻣﻜﺎﻧﯿﺔ اﻟﻘﺮاءة واﻟﻜﺘﺎﺑﺔ‬
‫‪ Read And Write‬ﻣﻦ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ إﻣﻜﺎﻧﯿﺔ ﻧﺴﺦ اﻟﺒﯿﺎﻧﺎت ‪ Copying Data‬وإزاﻟﺘﮭﺎ‬
‫‪ Deleting Data‬وﻣﺎ إﻟﻰ ذﻟﻚ ﻣﻦ ﻋﻤﻠﯿﺎت ﻣﻌﺎﻟﺠﺔ أﺧﺮى اﻟﺘﻲ ﺗﺘﻢ ﻋﻠﻰ اﻟﻤﻠﻔﺎت وﺗﺘﻢ ھﺬه اﻟﻌﻤﻠﯿﺎت ﻋﻦ ﻃﺮﯾﻖ‬
‫إﺟﺮاء ﺑﻌﺾ اﻟﺨﻄﻮات اﻷﺳﺎﺳﯿﺔ ‪:‬‬
‫‪ -١‬ﻋﻤﻠﯿﺔ ﻓﺘﺢ اﻟﻤﻠﻔﺎت ﻟﻠﺘﻌﺎﻣﻞ ﻣﻌﮭﺎ ‪ Open File‬وﺗﺘﻢ ھﺬه اﻟﻌﻤﻠﯿﺔ ﻣﻦ ﺧﻼل اﻟﻮﻇﯿﻔﺔ ‪Fopen Function‬‬
‫‪Open File‬‬ ‫‪Fopen Function‬‬
‫وﺗﻌﻤﻞ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻋﻠﻰ ﻓﺘﺢ اﻟﻤﻠﻔﺎت ﻹﺟﺮاء ﺟﻤﯿﻊ اﻟﻌﻤﻠﯿﺎت اﻟﻤﺘﺎﺣﺔ ﻋﻠﯿﮭﺎ ﻛﻤﺎ ﺗﻘﻮم ھﺬه اﻟﻮﻇﯿﻔﺔ ﻹﻋﺎدة اﻟﻤﻌﺎﻟﺞ‬
‫ﻟﮭﺬا اﻟﻤﻠﻒ ‪ File Handler‬وھﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺘﻐﯿﺮ ﯾﺴﺘﺨﺪم ﻓﻲ ﺟﻤﯿﻊ اﻟﻌﻤﻠﯿﺎت اﻟﻼﺣﻘﺔ اﻟﺘﻲ ﺗﺘﻢ ﻋﻠﻰ اﻟﻤﻠﻒ ﻓﯿﻤﺎ‬
‫ﺑﻌﺪ وﺗﺄﺧﺬ اﻟﻮﻇﯿﻔﺔ ‪ Fopen‬أرﺑﻊ ﻣﻌﻄﯿﺎت ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦٤‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫اﻟﻤﻌﻄﻰ اﻷول ﻋﺒﺎرة ﻋﻦ اﺳﻢ واﻻﻣﺘﺪاد اﻟﺨﺎص ﺑﺎﻟﻤﻠﻒ اﻟﺘﻲ ﺳﺘﺘﻢ ﻋﻠﯿﮫ ﻋﻤﻠﯿﺎت اﻟﻤﻌﺎﻟﺠﺔ وھﻮ ‪. Location‬‬
‫واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺠﻠﺪ ‪ Director_name‬اﻟﻤﻮﺟﻮد ﻛﺴﺠﻞ ﻓﻲ اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ‪All_directories‬‬
‫وھﻮ ‪ . File_name‬واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ﻋﺒﺎرة ﻋﻦ أﺳﻠﻮب ﻋﻤﻠﯿﺔ اﻟﻔﺘﺢ وﻛﻤﺎ ﻧﺮى ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ‪:‬‬

‫وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﺠﺪول اﻷﺳﺎﻟﯿﺐ اﻟﻤﺘﺎﺣﺔ ﻟﮭﺬا اﻟﻤﻌﻄﻰ وﻓﻲ ﺣﺎﻟﺔ ﺗﻌﯿﯿﻦ اﻷﺳﻠﻮب ‪ a‬أو ‪ ab‬ﻟﮭﺬا اﻟﻤﻌﻄﻰ ﻣﻊ ﻋﺪم‬
‫إﻧﺸﺎء اﻟﻤﻠﻒ ﺗﻘﻮم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ ﺑﺈﻧﺸﺎء اﻟﻤﻠﻒ ﺗﻠﻘﺎﺋﯿﺎً وﺗﻌﯿﯿﻦ اﻷﺳﻠﻮب ‪ W Write text‬ﻟﮭﺬا اﻟﻤﻠﻒ‬
‫وھﻮ ‪ . Open_mode‬أﻣﺎ اﻟﻤﻌﻄﻰ اﻷﺧﯿﺮ ﻓﯿﻘﻮم ﺑﺘﺤﺪﯾﺪ ﻋﺪد اﻷﺣﺮف ﻓﻲ ﻛﻞ ﺳﻄﺮ واﻟﻘﯿﻤﺔ اﻟﺼﻐﺮىﻠﮭﺬا اﻟﻤﻌﻄﻰ‬
‫ھﻮ واﺣﺪ ]‪ [1‬واﻟﻘﯿﻤﺔ اﻟﻜﺒﺮى ﻟﮫ ھﻮ ‪ 32767‬وﻓﻲ ﺣﺎﻟﺔ ﻋﺪم ﺗﻌﯿﯿﻦ ﻗﯿﻤﺔ ﻟﮭﺬا اﻟﻤﻌﻄﻰ ﺗﻘﻮم أوراﻛﻞ ﺑﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ‬
‫اﻓﺘﺮاﺿﯿﺔ ﻟﮭﺬا اﻟﻤﻌﻄﻰ وھﻲ ‪ 1024‬وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﯿﻞ أن ھﺬه اﻟﻮﻇﯿﻔﺔ ﺗﻘﻮم ﺑﺈﻋﺎدة اﻟﻤﻌﺎﻟﺞ ﻟﻠﻤﻠﻒ‬
‫‪ File_handler‬وھﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺘﻐﯿﺮ ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ File_type‬وھﺬا اﻟﻤﺘﻐﯿﺮ ﺧﺎص ﺑﮭﺬه اﻟﻤﺠﻤﻮﻋﺔ‬
‫اﻟﺒﺮﻣﺠﯿﺔ ﻓﻘﻂ وﻟﮫ اﻟﺘﻌﺮﯾﻒ اﻟﺘﺎﻟﻲ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦٥‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪   ‬‬
‫ﺑﻌﺪ ﻓﺘﺢ اﻟﻤﻠﻒ ﯾﻤﻜﻨﻨﺎ ﻗﺮاءة اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﺑﮫ أو اﻟﻜﺘﺎﺑﺔ ﻋﻠﯿﮫ وﺗﺘﻢ ﻋﻤﻠﯿﺔ اﻟﻜﺘﺎﺑﺔ ﻋﻠﻰ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ‬
‫‪Put‬‬ ‫‪Or‬‬ ‫‪Put_line‬‬ ‫‪Or‬‬ ‫‪Putf‬‬ ‫ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاءات ‪:‬‬
‫ﺣﯿﺚ ﺗﻘﻮم اﻹﺟﺮاءات ‪:‬‬
‫‪Put‬‬ ‫‪SQL Buffer‬‬
‫‪-----‬‬
‫‪Put_line‬‬ ‫‪-----‬‬ ‫‪DBMS_OUTPUT‬‬
‫‪-‬‬
‫ﺑﻜﺘﺎﺑﺔ اﻟﺠﻤﻞ اﻟﻤﻜﺘﻮﺑﺔ ﻓﻲ اﻟﺬاﻛﺮة ‪ Buffer‬ﻓﻲ اﻟﻤﻠﻒ ﻛﻤﺎ ھﻮ اﻟﺤﺎل ﻓﻲ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪DBMS_OUTPUT‬‬
‫أﻣﺎ اﻹﺟﺮاء ‪ Putf‬ﻓﯿﺤﺘﻮي ﻋﻠﻰ اﻟﺨﺎﺻﯿﺔ ]‪ [%S‬واﻟﺨﺎﺻﯿﺔ ]‪ [\n‬ﺣﯿﺚ ﺗﺴﺘﺨﺪم اﻟﺨﺎﺻﯿﺔ ]‪ [\n‬ﻹﺿﺎﻓﺔ ﺳﻄﺮ ﺟﺪﯾﺪ‬
‫ﻟﻠﻤﻠﻒ ﻓﮭﻲ ﺗﺸﺒﮫ اﻟﻤﻔﺘﺎح ‪ Enter‬ﻋﻨﺪ إﺟﺮاء ﻋﻤﻠﯿﺔ اﻟﻜﺘﺎﺑﺔ ﻓﻲ ﻣﺤﺮرات ﻧﺼﯿﺔ أﻣﺎ اﻟﺨﺎﺻﯿﺔ ]‪ [%S‬ﻓﺘﺴﺘﺨﺪم‬
‫‪%S‬‬ ‫‪String output‬‬ ‫ﻟﺘﻌﺒﯿﺮ ﻋﻦ ﻗﯿﻤﺔ ﻧﺼﯿﺔ ﯾﺘﻢ اﻟﺘﻌﻮﯾﺾ ﻋﻨﮭﺎ داﺧﻞ اﻟﺴﻼﺳﻞ اﻟﻨﺼﯿﺔ اﻟﻤﺨﺮﺟﺔ‬
‫وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ‪:‬‬

‫اﻟﻤﻌﻄﻰ اﻷول ﻋﺒﺎرة ﻋﻦ اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﺎﻟﻤﻠﻒ ‪ File_handler‬وھﻮ ‪ File‬اﻟﺬي ﻧﺮﯾﺪ اﻟﻜﺘﺎﺑﺔ ﻋﻠﯿﮫ‪.‬‬
‫واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ ﺟﻤﻠﺔ ﻧﺼﯿﺔ اﻟﺘﻲ ﻧﺮﯾﺪ ﻛﺘﺎﺑﺘﮭﺎ ﻓﻲ اﻟﻤﻠﻒ وﯾﺘﻢ ﺗﻨﺴﯿﻖ ھﺬه اﻟﺠﻤﻠﺔ ﺑﺎﺳﺘﺨﺪام اﻟﺨﻮاص‪:‬‬
‫‪\n‬‬
‫‪%S‬‬
‫أﻣﺎ اﻟﻤﻌﻄﯿﺎت ﻣﻦ ‪ arg1‬إﻟﻰ ‪ arg5‬ﻓﮭﻲ ﻋﺒﺎرة ﻋﻦ اﻟﻘﯿﻢ اﻟﺘﻲ ﺗﺘﻢ ﺗﻌﻮﯾﺾ ﺑﮭﺎ ﺑﺪﻻ ﻣﻦ اﻟﺨﺎﺻﯿﺔ ‪ %S‬ﻓﻲ اﻟﺴﻠﺴﺔ‬
‫اﻟﻨﺼﯿﺔ وﻏﺎﻟﺒﺎ ﻣﺎ ﺗﻜﻮن ﻣﻦ اﻟﻨﻮع ‪ Varchar2‬وإذا ﻛﺎﻧﺖ ھﺬه اﻟﻘﯿﻢ ﻣﻦ أﻧﻮاع ﻏﯿﺮ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Varchar2‬ﺗﻘﻮم‬
‫أوراﻛﻞ ﺑﺘﺤﻮﯾﻞ ھﺬه اﻟﻘﯿﻢ ﺗﻠﻘﺎﺋﯿﺎً إﻟﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ . Varchar2‬أﻣﺎ ﻋﻤﻠﯿﺎت اﻟﺤﺼﻮل ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت ﻣﻦ اﻟﻤﻠﻒ‬
‫ﻓﺘﺘﻢ ﻣﻦ ﺧﻼل اﻹﺟﺮاء ‪ Get_line‬وﯾﻘﻮم ھﺬا اﻹﺟﺮاء ﺑﻘﺮاءة اﻷﺳﻄﺮ ﻣﻦ اﻟﻤﻠﻒ ﺛﻢ ﯾﻘﻮم ﺑﻮﺿﻌﮭﺎ ﻓﻲ اﻟﻤﻌﻄﻰ‬
‫‪ Output Parameter‬وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦٦‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫اﻟﻤﻌﻄﻰ اﻷول ‪ File‬ﻋﺒﺎرة ﻋﻦ ﻣﻌﺎﻟﺞ اﻟﻤﻠﻒ ‪ File handler‬اﻟﺬي ﻧﺮﯾﺪ اﻟﻘﺮاءة ﻣﻨﮫ ‪.‬‬
‫واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ‪ Buffer‬ﻋﺒﺎرة ﻋﻦ اﻟﻤﺘﻐﯿﺮ اﻟﺬي ﺳﯿﺘﻢ ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺴﺘﺮﺟﻌﺔ ﺑﮫ‪.‬‬
‫اﻟﻤﻌﻄﻰ اﻷﺧﯿﺮ ‪ Len‬ﻋﺒﺎرة ﻋﻦ ﻋﺪد اﻷﺳﻄﺮ اﻟﺬي ﺳﯿﺘﻢ ﻗﺮاءﺗﮭﺎ ﻣﻦ اﻟﻤﻠﻒ ﻓﺈذا ﻛﺎﻧﺖ ﻗﯿﻤﺔ ھﺬا اﻟﻤﻌﻄﻰ ‪ Null‬ﺗﻘﻮم‬
‫أوراﻛﻞ ﺑﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ اﻓﺘﺮاﺿﯿﺔ ﻟﮭﺬا اﻟﻤﻌﻄﻰ وھﻲ ﻗﯿﻤﺔ اﻟﻤﻌﻄﻰ ‪ Max_Linesize‬اﻟﻤﺤﺪدة ﻓﻲ اﻟﻮﻇﯿﻔﺔ ‪Fopen‬‬
‫‪Max_Linesize‬‬ ‫‪Fopen‬‬
‫**************************************************************‬
‫‪‬‬
‫ﺑﻌﺪ اﻟﻜﺘﺎﺑﺔ ﻓﻲ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ أو اﻟﻘﺮاءة ﻣﻨﮭﺎ ﯾﺠﺐ ﻋﻠﯿﻨﺎ إﻏﻼق ھﺬه اﻟﻤﻠﻔﺎت وﯾﺘﻢ إﻏﻼق اﻟﻤﻠﻔﺎت ﺑﺎﺳﺘﺨﺪام‬
‫اﻹﺟﺮاءات ‪:‬‬
‫‪Fclose‬‬
‫‪Fclose_All‬‬
‫وﯾﻘﻮم اﻹﺟﺮاء ‪ Fclose‬ﺑﺈﻏﻼق اﻟﻤﻠﻒ ﺑﻤﻌﻠﻮﻣﯿﮫ ﻣﻌﺎﻟﺞ اﻟﻤﻠﻒ ‪ File handler‬ﻛﻤﻌﻄﻰ ﻟﮭﺬا اﻹﺟﺮاء ‪.‬‬
‫أﻣﺎ اﻹﺟﺮاء ‪ Fclose_All‬ﻓﯿﺴﺘﺨﺪم ﻹﻏﻼق ﺟﻤﯿﻊ اﻟﻤﻠﻔﺎت ‪ File handler‬اﻟﺨﺎﺻﺔ ﺑﺠﻤﯿﻊ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ‬
‫اﻟﻤﻔﺘﻮﺣﺔ ﺣﺎﻟﯿﺎً واﻟﺨﺎﺻﺔ ﺑﻔﺘﺮة اﻹﺗﺼﺎل اﻟﺤﺎﻟﯿﺔ وﺑﻌﺪ إﻏﻼق اﻟﻤﻠﻒ ﺗﺄﺗﻲ اﻟﺨﻄﻮة اﻷﺧﯿﺮة وھﻲ ﻣﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات‬
‫‪ Exception handler‬اﻟﺨﺎﺻﮫ ﺑﮭﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪.‬‬
‫وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ ﻋﺪداً ﻣﻦ أھﻢ اﻟﺮﺳﺎﺋﻞ اﻟﺨﻄﺄ اﻟﺘﻲ ﯾﻤﻜﻦ أن ﺗﻀﻊ ﻋﻨﺪ اﺳﺘﺨﺪام ھﺬه اﻟﻤﺠﻤﻮﻋﺎت‬
‫اﻟﺒﺮﻣﺠﯿﺔ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦٧‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪[1]UTL_FILE‬‬
‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪروس اﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ UTL_File‬وﺳﻮف ﻧﻘﻮم ﻓﻲ ھﺬا اﻟﺪرس‬
‫ﺑﺸﺮح ﻣﺜﺎل ﯾﻮﺿﺢ ﻛﯿﻔﯿﺔ اﺳﺘﺨﺪام ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻠﻔﺎت وﺳﻮف ﻧﻘﻮم ﺑﺈﻧﺸﺎء إﺟﺮاء ﯾﻘﻮم‬
‫ﺑﻌﻤﻞ ﺗﻘﺮﯾﺮ ﻋﻦ ﺑﯿﺎﻧﺎت اﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﻮﺟﻮدﯾﻦ ﻓﻲ اﻷﻗﺴﺎم رﻗﻢ ‪ 80‬و ‪ 100‬ﻓﻲ اﻟﺠﺪول اﻟﻤﻮﻇﻔﯿﻦ ‪Employees‬‬

‫وﺣﻔﻆ ﻧﺎﺗﺞ ھﺬا اﻟﺘﻘﺮﯾﺮ ﻓﻲ ﻣﻠﻒ ﺧﺎرﺟﻲ ﺛﻢ ﻋﺮض ھﺬا اﻟﺘﻘﺮﯾﺮ ﻋﻠﻰ اﻟﺸﺎﺷﺔ وﺳﻮف ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﻤﺠﻠﺪ اﻟﺬي‬
‫ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ ﻓﻲ اﻟﺴﺎﺑﻖ وھﻮ اﻟﻤﺠﻠﺪ ‪ OraLoad‬اﻟﻤﻮﺟﻮد ﻋﻠﻰ اﻟﻘﺮص اﻟﺼﻠﺐ ‪ C‬ﻛﻤﺎ ﻓﻲ اﻟﻜﻮد ‪:‬‬
‫‪١‬‬
‫‪٢‬‬
‫‪٣‬‬
‫‪٤‬‬
‫‪٥‬‬

‫‪٦‬‬
‫‪٧‬‬
‫‪٨‬‬
‫‪٩‬‬
‫‪١٠‬‬

‫‪١١‬‬
‫‪١٢‬‬

‫‪١٣‬‬
‫‪١٤‬‬
‫‪١٥‬‬
‫‪١٦‬‬
‫‪١٧‬‬
‫‪١٨‬‬
‫‪١٩‬‬

‫‪٢٠‬‬
‫‪٢١‬‬
‫‪٢٢‬‬

‫‪٢٣‬‬
‫‪٢٤‬‬
‫‪٢٥‬‬
‫‪٢٦‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦٨‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫اﻟﺸﺮح ‪:‬‬

‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء إﺟﺮاء ﻟﮫ اﻻﺳﻢ ‪ Sal_Status‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [1‬وﻗﻤﻨﺎ ﺑﺘﻤﺮﯾﺮ ﻣﻌﻄﯿﯿﻦ ﻟﮭﺬا اﻹﺟﺮاء اﻟﻤﻌﻄﻰ‬
‫اﻷول ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺠﻠﺪ ‪ Director_name‬وھﻮ ‪ P_filedir‬واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﻠﻒ اﻟﺬي‬
‫ﺳﯿﺘﻢ ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت ﺑﮫ وھﻮ ‪ P_filename‬وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ ھﺬا اﻹﺟﺮاء ﯾﺘﻢ ﺗﻌﺮﯾﻒ ﻣﺘﻐﯿﺮات ﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت‬
‫‪ File_type‬وذﻟﻚ ﻻﺳﺘﺨﺪاﻣﮭﻢ ﻛﻤﻌﺎﻟﺠﺎت ﻟﻠﻤﻠﻒ ‪ File handler‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮﯾﻦ ]‪ [3,4‬ﺑﯿﻨﻤﺎ ﯾﺴﺘﺨﺪم اﻟﻤﺆﺷﺮ‬
‫‪ emp_info‬ﻓﻲ اﻟﺴﻄﺮ ]‪ [6‬ﻻﺳﺘﺨﻼص ﺑﯿﺎﻧﺎت اﻷﻗﺴﺎم رﻗﻢ ]‪ [80,100‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [9‬ﻣﻦ اﻟﺠﺪول‬
‫‪ employees‬وﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺘﻢ ﺗﺮﺗﯿﺐ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﻢ اﺳﺘﺨﻼﺻﮭﺎ ﺣﺴﺐ رﻗﻢ اﻟﻘﺴﻢ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [10‬وﯾﺘﻢ‬
‫ﺗﻘﺴﯿﻢ اﻟﻮﻇﺎﺋﻒ داﺧﻞ ھﺬا اﻹﺟﺮاء إﻟﻰ ﺟﺰﺋﯿﯿﻦ رﺋﯿﺴﯿﯿﻦ‪:‬‬
‫اﻟﺠﺰء اﻷول ‪ :‬ﯾﺴﺘﺨﺪم ﻟﻜﺘﺎﺑﺔ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﯾﺘﻢ اﺳﺘﺨﻼﺻﮭﺎ ﻣﻦ اﻟﺠﺪول ﻓﻲ ﻣﻠﻒ ﺧﺎرﺟﻲ ‪.‬‬
‫اﻟﺠﺰء اﻟﺜﺎﻧﻲ ‪ :‬ﯾﺴﺘﺨﺪم ﻟﻘﺮاءة اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﻢ ﻛﺘﺎﺑﺘﮭﺎ ﻓﻲ اﻟﻤﻠﻒ وﻃﺒﺎﻋﺘﮭﺎ ‪.‬‬
‫ﻓﻔﻲ اﻟﺠﺰء اﻟﺨﺎص ﺑﻜﺘﺎﺑﺔ اﻟﺒﯿﺎﻧﺎت ﻟﻠﻤﻠﻒ ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ ‪ Fopen‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [14‬ﻟﻔﺘﺢ اﻟﻤﻠﻒ ﺣﯿﺚ ﯾﺘﻢ‬
‫ﺗﻤﺮﯾﺮ اﻟﻘﯿﻢ اﻟﻤﺪﺧﻠﺔ ﻟﻺﺟﺮاء إﻟﻰ ﻣﻌﻄﯿﺎت ھﺬه اﻟﻮﻇﯿﻔﺔ وھﻲ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺠﻠﺪ ‪ P_filedir‬واﺳﻢ اﻟﻤﻠﻒ‬
‫‪ P_filename‬أﻣﺎ اﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ﻓﮭﻮ ﻋﺒﺎرة ﻋﻦ اﻷﺳﻠﻮب اﻟﺨﺎص ﻟﻔﺘﺢ اﻟﻤﻠﻒ وھﻲ اﻟﻘﯿﻤﺔ '‪ 'W‬ﻓﻲ‬
‫ھﺬه اﻟﺤﺎﻟﺔ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [14‬واﻟﺘﻲ ﺗﻌﻨﻲ أﻧﮫ ﺳﯿﺘﻢ اﻟﻜﺘﺎﺑﺔ ﻋﻠﻰ اﻟﻤﻠﻒ وﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻟﻘﯿﻤﺔ اﻟﻤﺴﺘﺮﺟﻌﺔ ﻣﻦ ھﺬه‬
‫اﻟﻮﻇﯿﻔﺔ ﻟﻠﻤﺘﻐﯿﺮ ‪ V_filehandle‬واﻟﺬي ﯾﺴﺘﺨﺪم ﻛﻤﻌﺎﻟﺞ ﻟﻠﻤﻠﻒ ﻓﻲ اﻟﺴﻄﺮ ]‪ [14‬وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ أﻧﮫ ﺳﯿﺘﻢ‬
‫اﻟﻜﺘﺎﺑﺔ ﻓﻲ اﻟﻤﻠﻒ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء ‪ PutF‬وﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺘﻢ اﺳﺘﺨﺪام ھﺬا اﻹﺟﺮاء ﻓﻲ أﻛﺜﺮ ﻣﻦ ﺟﺰء ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﻮر‬
‫]‪ [15,20,22‬ﺣﯿﺚ ﯾﺴﺘﺨﺪم ﻓﻲ اﻟﺴﻄﺮ ]‪ [15‬ﻟﻜﺘﺎﺑﺔ ﺗﺎرﯾﺦ اﻟﯿﻮم ﻋﻠﻰ اﻟﺘﻘﺮﯾﺮ وﯾﺴﺘﺨﺪم ﻓﻲ اﻟﺴﻄﺮ ]‪ [20‬ﻟﻜﺘﺎﺑﺔ رﻗﻢ‬
‫اﻟﻘﺴﻢ اﻟﻤﻮﺟﻮد ﺑﮫ اﻟﻤﻮﻇﻔﯿﻦ اﻟﺬي ﺗﻢ اﺳﺘﺨﻼﺻﮭﻢ ﻣﻦ اﻟﺠﺪول ﺑﯿﻨﻤﺎ ﯾﺴﺘﺨﺪم ﻓﻲ اﻟﺴﻄﺮ ]‪ [22‬ﻟﻜﺘﺎﺑﺔ أﺳﻤﺎء‬
‫اﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﻮﺟﻮدﯾﻦ ﺑﺎﻟﻘﺴﻢ اﻟﺬي ﺗﻢ ﻛﺘﺎﺑﺘﮫ ﻓﻲ اﻟﺠﻤﻠﺔ اﻟﺴﺎﺑﻘﺔ واﻟﺮواﺗﺐ اﻟﺨﺎﺻﺔ ﺑﮭﻢ وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ ﺟﻤﯿﻊ ھﺬه‬
‫اﻟﺠﻤﻞ أﻧﮫ ﯾﺘﻢ ﺗﻤﺮﯾﺮ اﻟﻤﺘﻐﯿﺮ ‪ V_filehandle‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﻮر ]‪ [15,20,22‬ﻛﻤﻌﻄﻰ أول ﻟﺠﻤﯿﻊ ھﺬه اﻹﺟﺮاءات‬
‫‪ %S \n‬ﻟﺘﻨﺴﯿﻖ اﻟﻜﺘﺎﺑﺎت اﻟﺘﻲ ﯾﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ ﻓﻲ اﻟﻤﻠﻒ وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻹﺟﺮاء‬ ‫ﻛﻤﺎ ﯾﺘﻢ اﺳﺘﺨﺪام ھﺬه اﻟﺨﻮاص‬
‫ﺳﻄﺮ ]‪ [22‬ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﻜﻠﻤﺔ ‪ Employee‬ﯾﻠﯿﮭﺎ اﻟﺨﺎﺻﯿﺔ ‪ %S‬واﻟﺘﻲ ﯾﺘﻢ اﻟﺘﻌﻮﯾﺾ ﻋﻨﮭﺎ ﺑﻘﯿﻤﺔ اﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ وھﻮ‬
‫اﺳﻢ اﻟﻤﻮﻇﻒ ‪ v_emp_rec.last_name‬ﺛﻢ اﻟﻜﻠﻤﺔ ‪ earns‬ﯾﻠﯿﮭﺎ اﻟﺨﺎﺻﯿﺔ ‪ %S‬واﻟﺬي ﯾﺘﻢ اﻟﺘﻌﻮﯾﺾ ﻋﻨﮭﺎ ﺑﻘﯿﻤﺔ‬
‫اﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ وھﻮ اﻟﺮاﺗﺐ اﻟﺨﺎص ﺑﮭﺬا اﻟﻤﻮﻇﻒ ‪ v_emp_rec.salary‬أﻣﺎ اﻟﺨﺎﺻﯿﺔ ‪ \n‬ﻓﺘﺴﺘﺨﺪم ﻟﻨﻘﻞ ﻣﺆﺷﺮ‬
‫اﻟﻜﺘﺎﺑﺔ داﺧﻞ اﻟﻤﻠﻒ إﻟﻰ ﺑﺪاﯾﺔ ﺳﻄﺮ ﺟﺪﯾﺪ‪.‬‬
‫أﻣﺎ اﻹﺟﺮاء ‪ Put_Line‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [25‬ﻓﯿﺴﺘﺨﺪم ﻹﻇﮭﺎر اﻟﺠﻤﻠﺔ‪ end of Report‬ﻓﻲ ﻧﮭﺎﯾﺔ اﻟﺘﻘﺮﯾﺮ‪.‬‬
‫أﻣﺎ اﻹﺟﺮاء ‪ Fclose‬ﻓﯿﺴﺘﺨﺪم ﻟﻺﻏﻼق اﻟﻤﻠﻒ وﻋﻨﺪ ھﺬه اﻟﻤﺮﺣﻠﺔ ﻗﺪ اﻧﮭﯿﻨﺎ اﻟﺒﺮﻧﺎﻣﺞ وھﻮ إﻧﺸﺎء ﻣﻠﻒ ﯾﻘﻮم ﺑﺤﻔﻆ‬
‫اﻟﺘﻘﺮﯾﺮ اﻟﺨﺎص ﺑﺎﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﻮﺟﻮدﯾﻦ ﺑﺎﻷﻗﺴﺎم ‪ 80‬و ‪..... 100‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٦٩‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪[2]UTL_FILE‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ اﻟﮭﺪف اﻟﺜﺎﻧﻲ ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ وھﻮ ﻋﺮض اﻟﺘﻘﺮﯾﺮ اﻟﺬي ﻗﻤﻨﺎ ﺑﺤﻔﻈﮫ ﻓﻲ اﻟﻜﻮد‬
‫اﻟﺴﺎﺑﻖ ﻓﻨﻘﻮم ﺑﺎﺳﺘﻜﻤﺎل ﻣﺎ ﻓﻲ اﻹﺟﺮاء ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ ‪:‬‬

‫‪٢٧‬‬
‫‪٢٨‬‬
‫‪٢٩‬‬

‫‪٣٠‬‬
‫‪٣١‬‬
‫‪٣٢‬‬
‫‪٣٣‬‬

‫‪٣٤‬‬

‫‪٣٥‬‬
‫‪٣٦‬‬
‫‪٣٧‬‬

‫‪٣٨‬‬
‫‪٣٩‬‬
‫‪٤٠‬‬
‫‪٤١‬‬

‫‪٤٢‬‬
‫‪٤٣‬‬
‫‪٤٤‬‬

‫‪٤٥‬‬
‫‪٤٦‬‬

‫‪٤٧‬‬
‫اﻟﺸﺮح ‪:‬‬

‫ﻓﻲ ﺑﺪاﯾﺔ ھﺬا اﻟﻜﻮد اﻟﺴﻄﺮ ]‪ [27‬ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ ‪ is_open‬ﻟﻠﺘﺄﻛﺪ ﻣﻦ ﺣﺎﻟﺔ اﻟﻤﻠﻒ ھﻞ ھﻮ ﻣﻔﺘﻮح أم ﻻ ﻓﺈذا ﻛﺎن‬
‫اﻟﻤﻠﻒ ﻣﻔﺘﻮح ﯾﻜﻮن ﻧﺎﺗﺞ ھﺬه اﻟﻮﻇﯿﻔﺔ ‪ True‬أﻣﺎ إذا ﻛﺎن اﻟﻤﻠﻒ ﻣﻐﻠﻖ ﯾﻜﻮن ﻧﺎﺗﺞ ھﺬه اﻟﻮﻇﯿﻔﺔ ‪ False‬وﯾﺘﻢ ذﻟﻚ ﻋﻦ‬
‫ﻃﺮﯾﻖ وﺿﻊ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻛﺸﺮط ﻟﻠﺠﻤﻠﺔ اﻟﺸﺮﻃﯿﺔ ‪ IF‬وﻓﻲ ﺣﺎﻟﺔ ﻋﺪم ﻓﺘﺢ اﻟﻤﻠﻒ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﺠﻤﻠﺔ ‪ Else‬ﻛﻤﺎ ﻓﻲ‬
‫اﻟﺴﻄﺮ ]‪ [29‬وﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ ‪ Fopen‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [30‬ﻟﻔﺘﺢ اﻟﻤﻠﻒ وﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻷﺳﻠﻮب )‪ (r‬ﻟﮭﺬه‬
‫اﻟﻮﻇﯿﻔﺔ وھﺬا اﻷﺳﻠﻮب ﯾﻌﻨﻲ أﻧﮫ ﺗﻢ ﻓﺘﺢ اﻟﻤﻠﻒ ﻟﻠﻘﺮاءة وﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻟﻘﯿﻤﺔ اﻟﻤﺴﺘﺮﺟﻌﺔ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ‬
‫ﻟﻠﻤﺘﻐﯿﺮ ‪ V_filehandler‬وﻟﻘﺮاءة اﻷﺳﻄﺮ اﻟﻤﻮﺟﻮدة ﺑﺎﻟﻤﻠﻒ اﻟﺨﺎرﺟﻲ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء ‪ Get_line‬ﻛﻤﺎ ﻓﻲ‬
‫اﻟﺴﻄﺮ ]‪ [33‬وذﻟﻚ ﻻﺳﺘﺮﺟﺎع اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ ھﺬا اﻟﻤﻠﻒ وﺗﺨﺰﯾﻨﮭﺎ ﻓﻲ اﻟﻤﺘﻐﯿﺮ ‪ V_Outputtext‬اﻟﺬي ﻗﻤﻨﺎ‬
‫ﺑﺘﻌﺮﯾﻔﮭﺎ ﻣﺴﺒﻘﺎً ﻓﻲ اﻟﻘﺴﻢ ‪ Declarative Section‬وﻟﻌﺮض اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ ھﺬا اﻟﻤﺘﻐﯿﺮ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧٠‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫اﻹﺟﺮاء ‪ Get_line‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [34‬وﺑﻌﺪ اﻻﻧﺘﮭﺎء ﻣﻦ ﻋﺮض ﺑﯿﺎﻧﺎت اﻟﻤﻠﻒ اﻟﺨﺎرﺟﻲ ﻧﻘﻮم ﺑﺈﻏﻼق اﻟﻤﻠﻒ ﻣﺮة‬
‫أﺧﺮى ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪. [40‬‬

‫ﻣﻼﺣﻈﺎت ﻋﻠﻰ ھﺬا اﻟﻔﺼﻞ ‪:‬‬

‫‪ -‬ﺗﺘﯿﺢ ﻟﻨﺎ اﻷﻛﻮاد ‪ Dynamic SQL‬إﻣﻜﺎﻧﯿﺔ اﺳﺘﺨﺪام ﻛﻼ ﻣﻦ اﻟﺠﻤﻞ ‪ DDL‬أو اﻟﺠﻤﻞ ‪Session Control‬‬

‫‪ Language‬داﺧﻞ أﻛﻮاد اﻟﻠﻐﺔ ‪. PL/SQL‬‬

‫‪ -‬ﺗﺴﺘﺨﺪم اﻟﺠﻤﻠﺔ ‪ Execute Immediate‬ﻓﻲ ﻛﺘﺎﺑﺔ اﻟﻜﻮد ‪ Native Dynamic SQL‬داﺧﻞ اﻟﻜﻮد ‪. SQL‬‬

‫‪ -‬ﻻ ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Execute Immediate‬ﻓﻲ اﻻﺳﺘﻌﻼﻣﺎت ﻣﻦ اﻟﻨﻮع ‪. Multiple_RowQuery‬‬

‫‪ -‬ﯾﺴﺘﺨﺪم اﻹﺟﺮاء ‪ Alter_Compile‬ﺑﺎﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_DDL‬ﻹﻋﺎدة ﺗﺮﺟﻤﺔ اﻹﺟﺮاءات‬

‫واﻟﻮﻇﺎﺋﻒ واﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪. Packages‬‬

‫‪ -‬ﻓﻲ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_JOB‬ﯾﺘﻢ ﺗﺸﻐﯿﻞ وﺣﺬف اﻟﻮﻇﺎﺋﻒ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاءات ‪. Run_Remove‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧١‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪‬‬ ‫‪Large Objects‬‬
‫‪‬‬
‫‪LOB‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺠﺰء ﻋﻠﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Large Object‬واﻟﺬي ﯾﻄﻠﻖ ﻋﻠﯿﮫ داﺋﻤﺎ اﻻﺳﻢ ‪LOB‬‬
‫‪Large Object‬‬ ‫‪LOB‬‬
‫ﻓﻤﻨﺬ ﺑﺪاﯾﺔ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺗﻢ اﺳﺘﺨﺪام ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Long‬ﻟﺘﺨﺰﯾﻦ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Large Object‬اﻟﻰ أن ﻇﮭﺮ‬
‫ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬ﻓﻲ اﻹﺻﺪار ‪ . Oracle 8‬وﻓﻲ ھﺬا اﻟﺪرس ﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ ﺑﻌﺾ ﺧﺼﺎﺋﺺ ھﺬا اﻟﻨﻮع ﻣﻦ‬
‫أﻧﻮاع اﻟﺒﯿﺎﻧﺎت وﻣﻘﺎرﻧﺘﮫ ﺑﺄﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﺴﺎﺑﻘﺔ ﻟﮭﺬا اﻟﻨﻮع وﯾﺴﻤﺢ ھﺬا اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﺑﺘﺨﺰﯾﻦ أﻧﻮاع‬
‫اﻟﺒﯿﺎﻧﺎت اﻟﻜﺒﯿﺮة واﻟﻐﯿﺮ ﻣﺮﻛﺒﺔ ‪ Unstructured Data‬ﻣﺜﻞ ‪:‬‬
‫• اﻟﻤﻠﻔﺎت اﻟﻨﺼﯿﺔ ‪Text‬‬
‫• اﻟﺼﻮر ‪Images‬‬
‫• ﻣﻠﻔﺎت اﻟﻔﯿﺪﯾﻮ ‪Video Files‬‬
‫• ﻣﻠﻔﺎت اﻟﺼﻮت ‪Wave Forms‬‬

‫ﺣﯿﺚ ﺗﺼﻞ اﻟﻘﺪرة اﻟﺘﺨﺰﯾﻨﯿﺔ ﻟﮭﺬا اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﻣﻦ ‪ 128 Terabyte‬إﻟﻰ ‪ 8Gigabyte‬وﯾﻨﻘﺴﻢ ھﺬا‬
‫اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﻰ ﻋﺪد ﻣﻦ اﻷﻧﻮاع ﻣﻨﮭﺎ اﻟﻨﻮع ‪:‬‬
‫‪- BLOB‬‬ ‫‪Binary Large Object‬‬
‫وھﻮ ﯾﺪﻋﻢ ﻋﻤﻠﯿﺔ ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﺜﻨﺎﺋﯿﺔ ﻛﺒﯿﺮة اﻟﺤﺠﻢ ﻣﺜﻞ ﻣﻠﻔﺎت اﻟﻔﯿﺪﯾﻮ ‪. Video Files‬‬
‫‪- CLOB‬‬ ‫‪Character Large Object‬‬ ‫ﯾﺪﻋﻢ اﻟﺒﯿﺎﻧﺎت اﻟﺤﺮﻓﯿﺔ‬
‫‪-NCLOB‬‬ ‫‪Multibyte Character Large Object‬‬
‫ﯾﺪﻋﻢ اﻟﺒﯿﺎﻧﺎت اﻟﺤﺮﻓﯿﺔ اﻟﻤﺘﻌﺪدة ‪.‬‬
‫‪- BFILE‬‬ ‫‪Binary FILE‬‬
‫ﯾﻤﺜﻞ ﻣﻠﻒ ﺛﻨﺎﺋﻲ ﯾﺘﻢ ﺗﺨﺰﯾﻨﮫ ﻓﻲ ﻣﻠﻒ ﻧﻈﺎم ﺗﺸﻐﯿﻞ ﺛﻨﺎﺋﻲ ﺧﺎرج ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪.‬‬
‫وﯾﺘﻜﻮن ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬ﻣﻦ ﺟﺰﺋﯿﻦ ‪:‬‬
‫اﻟﺠﺰء اﻷول ‪ LOB Value :‬ھﻮ ﻋﺒﺎرة ﻋﻦ اﻟﻘﯿﻤﺔ اﻟﻤﻜﻮﻧﺔ ﻟﻠﻌﻨﺼﺮ اﻟﺤﻘﯿﻘﻲ اﻟﺬي ﯾﺘﻢ ﺗﺨﺰﯾﻨﮫ ‪.‬‬
‫اﻟﺠﺰء اﻟﺜﺎﻧﻲ ‪ LOB Locator :‬ﻋﺒﺎرة ﻋﻦ اﻟﻤﺆﺷﺮ اﻟﺬي ﯾﺸﯿﺮ إﻟﻰ ﻣﻮﻗﻊ اﻟﻘﯿﻤﺔ اﻟﻔﻌﻠﯿﺔ اﻟﻤﺨﺰﻧﺔ ﺳﻮاءً داﺧﻞ‬
‫ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أو ﺧﺎرﺟﮭﺎ ﺣﯿﺚ ﯾﻘﻮم اﻟﻌﻤﻮد اﻟﻤﻌﺮف ﺑﮭﺬا اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬ﺑﺘﺨﺰﯾﻦ ﻣﺎ ﯾﺴﻤﻰ‬
‫ﺑﺎﻟﻤﺆﺷﺮ واﻟﺬي ﯾﺸﯿﺮ إﻟﻰ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺨﺰﻧﺔ ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أو ﯾﺸﯿﺮ إﻟﻰ اﻟﻤﻠﻒ اﻟﻤﺨﺰن ﺧﺎرج ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت‬
‫ﻟﺬﻟﻚ ﻓﻘﺪ ﺗﻢ ﺗﻘﺴﯿﻢ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬إﻟﻰ ﻓﺌﺘﯿﻦ ﻣﻦ ﺣﯿﺚ اﻟﻌﻤﻠﯿﺔ اﻟﺘﺨﺰﯾﻨﯿﺔ ‪-:‬‬
‫• ﻓﺌﺔ ﺗﻘﻮم ﺑﺎﻟﺘﺨﺰﯾﻦ اﻟﺪاﺧﻠﻲ ﻟﻠﺒﯿﺎﻧﺎت ‪ Internal LOB‬واﻟﺘﻲ ﺗﻤﺜﻞ اﻷﻧﻮاع ‪BLOB، NCLOB ، CLOB:‬‬
‫ﺣﯿﺚ ﺗﻘﻮم ھﺬه اﻷﻧﻮاع ﺑﺘﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت داﺧﻞ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧٢‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫• ﻓﺌﺔ ﺗﻘﻮم ﺑﺎﻟﺘﺨﺰﯾﻦ اﻟﺨﺎرﺟﻲ ‪ External Files‬وھﻲ ﻣﻤﺜﻠﺔ ﻓﻲ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ BFile:‬واﻟﺬي ﯾﻘﻮم ﺑﺘﺨﺰﯾﻦ‬
‫اﻟﺒﯿﺎﻧﺎت ﻓﻲ ﺧﺎرج ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت وﯾﻤﺘﺎز اﺳﺘﺨﺪام ھﺬا اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﻋﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﺴﺎﺑﻘﺔ ﺑــ‪:‬‬
‫‪ Long ، Long Raw‬ﻓﻲ ﻋﺪة أﺷﯿﺎء ﻣﻨﮭﺎ أﻧﮫ ﯾﻤﻜﻦ ﺗﻌﺮﯾﻒ أﻛﺜﺮ ﻣﻦ ﻋﻤﻮد ﺑﮭﺬا اﻟﻨﻮع ﻓﻲ اﻟﺠﺪول اﻟﻮاﺣﺪ‬
‫ﻋﻠﻰ اﻟﻌﻜﺲ ﻋﻦ اﻟﻨﻮع ‪ Long‬ﻛﻤﺎ ﺗﺼﻞ اﻟﻘﺪرة اﻟﺘﺨﺰﯾﻨﯿﺔ ﻟﮭﺬا اﻟﻨﻮع إﻟﻰ ‪ 128 Terabyte‬أﻣﺎ اﻟﻨﻮع ‪Long‬‬
‫ﻓﺘﺼﻞ اﻟﻘﺪرة اﻟﺘﺨﺰﯾﻨﯿﺔ ﻟﮫ إﻟﻰ ‪ 2 Gigabyte‬وﻣﻦ اﻻﺧﺘﻼﻓﺎت اﻷﺧﺮى ﺑﯿﻦ اﻟﻨﻮع ‪ LOB‬و‪: Long‬‬

‫‪ ‬أن اﻟﻨﻮع ‪ LOB‬ﯾﻘﻮم ﺑﺘﺨﺰﯾﻦ اﻟﻤﺆﺷﺮات ‪ Locators‬ﻟﻠﺒﯿﺎﻧﺎت‬


‫‪ ‬أﻣﺎ اﻟﻨﻮع ‪ Long‬ﯾﻘﻮم ﺑﺘﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻔﻌﻠﯿﺔ ‪. Data‬‬
‫‪ ‬ﻛﻤﺎ ﯾﻤﻜﻦ ﻟﻨﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت ﻓﻲ ﻣﻨﺎﻃﻖ ﻣﻨﻔﺼﻠﺔ أو ﻓﻲ ﻣﻠﻔﺎت ﺧﺎرﺟﯿﺔ ‪OR Host Files‬‬
‫‪. Separate Segments‬‬
‫‪ ‬أﻣﺎ اﻟﻨﻮع ‪ Long‬ﯾﻘﻮم ﺑﺘﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت ﻓﻲ ﻗﺎﻟﺐ ﺑﯿﺎﻧﺎت واﺣﺪ ‪. Same Data Block‬‬
‫‪ ‬ﻛﻤﺎ ﯾﻘﻮم اﻟﻨﻮع ‪ LOB‬ﺑﺪﻋﻢ اﻟﻮﺻﻮل اﻟﻌﺸﻮاﺋﻲ ﻟﻠﺒﯿﺎﻧﺎت ‪. Random Access‬‬
‫‪ ‬أﻣﺎ اﻟﻨﻮع ‪ Long‬ﻓﯿﺪﻋﻢ اﻟﻮﺻﻮل اﻟﺘﺴﻠﺴﻠﻲ ﻟﻠﺒﯿﺎﻧﺎت ‪. Sequential Access‬‬
‫‪‬‬

‫‪Internal LOB‬‬
‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ ﻋﻠﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬وذﻛﺮﻧﺎ أﻧﮫ ﯾﺤﺘﻮي ﻋﻠﻰ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﻘﻮم ﺑﺘﺨﺰﯾﻦ‬
‫اﻟﺒﯿﺎﻧﺎت داﺧﻠﯿﺎً أي داﺧﻞ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻓﻲ ﻣﻨﺎﻃﻖ ﻣﻨﻔﺼﻠﺔ ‪ Separate Segments‬ﻣﺜﻞ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪:‬‬
‫‪BLOB‬‬
‫‪CLOB‬‬
‫‪NCLOB‬‬
‫وﯾﻤﻜﻦ أن ﺗﻜﻮن ھﺬه اﻷﻧﻮاع ﺧﺎﺻﯿﺔ ﻣﻦ ﺧﺼﺎﺋﺺ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﻤﻌﺮﻓﺔ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم أو ﻋﻤﻮد ﻓﻲ ﺟﺪول أو‬
‫ﻧﻮع ﻣﻦ أﻧﻮاع اﻟﻤﺘﻐﯿﺮات أو ﺣﺘﻰ ﻣﺘﻐﯿﺮات أو ﻣﻌﻄﯿﺎت أو ﻧﺘﯿﺠﺔ ﻓﻲ اﻟﻠﻐﺔ ‪ PL/SQL‬ﻛﻤﺎﻓﻲ اﻟﻤﺨﻄﻂ اﻟﺘﺎﻟﻲ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧٣‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫وﻟﻠﺘﻔﺎﻋﻞ ﻣﻊ ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﺒﯿﺎﻧﺎت ﯾﻤﻜﻨﻨﺎ اﺳﺘﺨﺪام أي ﻣﻦ اﻟﻮاﺟﮭﺎت ‪ Interfaces‬اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ‬

‫ﻛﻤﺎ ﯾﻮﻓﺮ ﺧﺎدم أوراﻛﻞ ﺑﻌﺾ اﻟﺪﻋﻢ ﻟﮭﺬه اﻷﻧﻮاع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﻋﺒﺮ اﻟﻠﻐﺔ ‪ SQL‬وﻹدارة ﻣﺜﻞ ھﺬه اﻷﻧﻮاع ﻣﻦ‬
‫اﻟﺒﯿﺎﻧﺎت ﻻﺑﺪ ﻣﻦ اﻟﻤﺮور ﺑﻌﺪة ﺧﻄﻮات ‪:‬‬
‫اوﻻ ‪ :‬إﻧﺸﺎء وإﺿﺎﻓﺔ اﻟﺒﯿﺎﻧﺎت ﻟﻠﺠﺪول اﻟﺬي ﺳﯿﺤﺘﻮي ﻋﻠﻰ اﻟﺒﯿﺎﻧﺎت ‪ LOB‬ﻣﻦ ﺗﻌﺮﯾﻒ اﻟﻤﺆﺷﺮ ‪LOB Locator‬‬
‫‪Select For update‬‬ ‫وإﻋﻄﺎﺋﮫ اﻟﻘﯿﻤﺔ اﻻﺑﺘﺪاﺋﯿﺔ ﻟﻠﺒﺮﻧﺎﻣﺞ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ‪:‬‬
‫ﻹﻏﻼق اﻟﺼﻒ اﻟﻤﻮﺟﻮد ﺑﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪. LOB‬‬
‫ﺛﺎﻧﯿﺎ‪ :‬ﻣﻌﺎﻟﺠﺔ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬ﻷي ﻣﻦ اﻟﻮاﺟﮭﺎت ‪ Interfaces‬اﻟﺴﺎﺑﻖ ذﻛﺮھﺎ ‪.‬‬
‫وأﺧﯿﺮاً اﺳﺘﺨﺪام اﻟﺠﻤﻠـــــﺔ ‪ Commit‬ﻹﻧﮭﺎء وﺗﺜﺒﯿﺖ اﻹﺟﺮاء ﻋﻠﻰ اﻟﻮﺿﻊ اﻟﺤﺎﻟﻲ‪.‬‬
‫****************************************************‬
‫‪BFILE‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Bfile‬وﯾﻘﻮم ھﺬا اﻟﻨﻮع ﺑﺪﻋﻢ اﻟﺘﺨﺰﯾﻦ اﻟﺨﺎرﺟﻲ ﻟﻠﻌﻨﺎﺻﺮ اﻟﻜﺒﯿﺮة‬
‫ﻟﻠﺒﯿﺎﻧﺎت ﻓﻲ ﻣﻠﻔﺎت ﻧﻈﺎم اﻟﺘﺸﻐﯿﻞ اﻟﺨﺎرﺟﻲ ‪ External File‬ﺣﯿﺚ ﯾﻘﻮم ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﺒﯿﺎﻧﺎت ﺑﺘﺨﺰﯾﻦ اﻟﻤﺆﺷﺮ‬
‫‪ Locator‬ﻟﻠﻤﻠﻔﺎت اﻟﻤﺨﺰﻧﺔ ﺧﺎرﺟﯿﺎً وﯾﻤﻜﻦ اﺳﺘﺪام ھﺬا اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﻟﺘﺨﺰﯾﻦ اﻟﻤﻠﻔﺎت ذات اﻻﻣﺘﺪاد ‪:‬‬
‫‪ GIF ، JPEG‬واﻟﺘﻲ ﺗﻤﺜﻞ اﻟﺼﻮر أو ‪ MPEG2 ، MPEG‬واﻟﺘﻲ ﺗﻤﺜﻞ ﻣﻠﻔﺎت اﻟﻔﯿﺪﯾﻮ ‪ .‬ﻛﻤﺎ ﺗﺴﺘﺨﺪم أﯾﻀﺎ‬
‫ﻟﺘﺨﺰﯾﻦ اﻟﻤﻠﻔﺎت اﻟﻨﺼﯿﺔ ‪ Text‬ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ اﻟﻌﺪﯾﺪ ﻣﻦ اﻷﺷﻜﺎل اﻷﺧﺮى ﻟﻠﻤﻠﻔﺎت اﻟﻨﻈﺎم وﯾﺴﻤﺢ ﻟﻨﺎ ﺧﺎدم أوراﻛﻞ‬
‫‪ Oracle server‬ﺑﺘﺨﺰﯾﻦ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ ﻋﻠﻰ اﻷﻗﺮاص اﻟﺼﻠﺒﺔ ‪ Hard Disk‬أو ﻋﻠﻰ اﻷﻗﺮاص اﻟﻤﺪﻣﺠﺔ ‪CD-‬‬
‫‪ Rom‬أو أي وﺣﺪة ﻣﻦ وﺣﺪات اﻟﺘﺨﺰﯾﻦ اﻷﺧﺮى وﻣﻦ ﺛﻢ أن ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ ﺗﺪﻋﻢ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪BFile‬‬
‫ﻟﺘﻤﻜﯿﻦ ﻣﺴﺘﺨﺪﻣﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﻮﺻﻮل إﻟﻰ اﻟﻤﻠﻔﺎت اﻟﻨﻈﺎم اﻟﺨﺎرﺟﯿﺔ ‪. External File system‬‬
‫وﯾﻘﻢ ﻟﻨﺎ ﺧﺎدم أوراﻛﻞ ﺛﻼﺛﺔ ﻋﻤﻠﯿﺎت رﺋﯿﺴﯿﺔ ﻟﻠﺘﻔﺎﻋﻞ ﻣﻊ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪-: Bfile‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧٤‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫أﻣﺎ ﺑﺎﻗﻲ اﻟﻌﻤﻠﯿﺎت اﻟﻤﻄﻠﻮﺑﺔ ﻹدارة وﻣﻌﺎﻟﺠﺔ ھﺬا اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﻓﯿﺘﻢ ﻣﻦ ﺧﻼل اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ‬
‫‪ DBMS_LOB‬أو اﻟﻮاﺟﮭﺔ اﻟﺒﺮﻣﺠﯿﺔ )‪ OCI (Oracle Call Interface‬وﯾﺠﺐ ﻣﻼﺣﻈﺔ أن اﻟﻤﻠﻔﺎت اﻟﺨﺎﺻﺔ‬
‫ﺑﮭﺬا اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﺗﻜﻮن ﻟﻠﻘﺮاءة ﻓﻘﻂ ‪ Read_anly‬أي أﻧﮭﺎ ﻻ ﺗﺸﺘﺮك ﻓﻲ أي إﺟﺮاء ‪Transaction‬‬
‫ﻟﺬا ﻓﺈن أي دﻋﻤﺎً ﻟﺘﺄﻣﯿﻦ ھﺬه اﻟﻤﻠﻔﺎت وﺳﻼﻣﺘﮭﺎ ﯾﺠﺐ أن ﯾﻘﺪم ﻣﻦ ﺧﻼل ﻧﻈﺎم اﻟﺘﺸﻐﯿﻞ ‪ Operating system‬ﺣﯿﺚ‬
‫ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺈﻧﺸﺎء ﻣﺠﻠﺪ ووﺿﻌﮫ ﻓﻲ ﻣﻜﺎن ﻣﻨﺎﺳﺐ ﺛﻢ إﻋﻄﺎء ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ اﻻﻣﺘﯿﺎز ‪Privilege‬ﻟﻘﺮاءة‬
‫ھﺬه اﻟﻤﻠﻔﺎت وﻓﻲ ﺣﺎﻟﺔ ﻋﻤﻞ اﻟﻤﺴﺘﺨﺪم ﻟﺤﺬف ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬ﻣﻦ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻓﺈن ذﻟﻚ ﻻ ﯾﺆدي اﻟﻰ ﺣﺬف‬
‫اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﻨﻈﺎم وﺗﻘﻊ ﻋﻤﻠﯿﺔ إدارة ھﺬه اﻟﻤﻠﻔﺎت ﻋﻠﻰ ﻋﺎﺗﻖ ﻣﺪﯾﺮ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ DBA‬أو ﻣﺪﯾﺮ ﻧﻈﺎم‬
‫اﻟﺘﺸﻐﯿﻞ ‪ Administrator‬أو اﻟﻤﺴﺘﺨـﺪم ‪ User‬وﯾﺠﺐ ﻣﻼﺣﻈﺔ أن اﻟﻤﺴﺎﺣﺔ اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ ﯾﺠﺐ اﻷ‬
‫ﺗﺘﻌﺪى اﻟﺤﺪ اﻷﻗﺼﻰ ﻟﻠﻘﺪرة اﻟﺘﺨﺰﯾﻨﯿﺔ ﻟﻨﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬وھﻮ ‪. 128 Terabyte‬‬
‫****************************************‬
‫‪Directories         ‬‬
‫ﺗﻘﻮم ھﺬه اﻟﻤﺠﻠﺪات ﺑﺪﻋﻢ ﻋﻤﻠﯿﺔ اﻟﻮﺻﻮل واﻻﺳﺘﺨﺪام ﻟﻠﺒﯿﺎﻧﺎت ‪ Bfile‬اﻟﻤﻮﺟﻮدة ﻋﻠﻰ اﻟﺨﺎدم أوراﻛﻞ ‪Oracle‬‬
‫‪ server‬ﺣﯿﺚ ﺗﻘﻮم ھﺬه اﻟﻤﺠﻠﺪات ﺑﻌﻤﻞ أﺳﻤﺎء ﻣﺴﺘﻌﺎرة ﻟﻠﻤﺠﻠﺪات اﻟﻔﻌﻠﯿﺔ اﻟﻤﻮﺟﻮدة ﻓﻲ ﻣﻠﻔﺎت اﻟﻨﻈﺎم اﻟﻤﻮﺟﻮدة‬
‫ﻋﻠﻰ ﺧﺎدم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ واﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﺒﯿﺎﻧﺎت ‪ Bfile‬وﻋﻦ ﻃﺮﯾﻖ إﻋﻄﺎء اﻟﺼﻼﺣﯿﺎت اﻟﻤﻨﺎﺳﺒﺔ‬
‫ﻟﻠﻤﺴﺘﺨﺪﻣﯿﻦ ﻓﻲ ھﺬه اﻟﻤﺠﻠﺪات ﯾﻤﻜﻨﻨﺎ اﻟﻮﺻﻮل إﻟﻰ ھﺬه اﻟﺒﯿﺎﻧﺎت وﯾﺠﺐ ﻣﻼﺣﻈﺔ أن اﻟﻤﺴﺘﺨﺪم اﻟﺬي ﯾﻤﺘﻠﻚ ھﺬه‬
‫اﻟﻤﺠﻠﺪات ھﻮ اﻟﻤﺴﺘﺨﺪم ‪ Sys‬ﻛﻤﺎ ﯾﻤﻜﻦ إﻧﺸﺎء ھﺬه اﻟﻤﺠﻠﺪات ﻣﻦ ﻗﺒﻞ ﻣﺪﯾﺮ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ DBA‬أو أي ﻣﺴﺘﺨﺪم ﻟﮫ‬
‫اﻻﻣﺘﯿﺎز ‪ Create Any Directory‬وﺗﻤﺘﺎز اﻟﻤﺠﻠﺪات ‪ Directory‬ﺑﺄﻧﮭﺎ ﺗﻤﺘﻠﻚ اﻣﺘﯿﺎزات اﻟﻌﻨﺎﺻﺮ ‪Object‬‬
‫‪ Privileges‬ﻛﻤﺎ ﯾﻤﻜﻦ ﻣﻨﺢ اﻟﻌﻤﻠﯿﺎت ‪ Grant‬واﻟﻤﻨﻊ ‪ Revoke‬ﻟﻼﻣﺘﯿﺎزات ﻋﻠﻰ ھﺬه اﻟﻤﺠﻠﺪات ‪.‬‬
‫أﻣﺎ ﻋﻠﻰ اﻟﺘﺼﺮﯾﺤﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺠﻠﺪات اﻟﻔﻌﻠﯿﺔ اﻟﻤﻮﺟﻮدة ﻓﻲ ﻣﻠﻔﺎت اﻟﻨﻈﺎم ﻓﯿﻘﻊ ﻋﺎﺗﻘﮭﺎ ﻋﻠﻰ ﻧﻈﺎم اﻟﺘﺸﻐﯿﻞ‬
‫‪ . Operating system‬وﻟﻌﻤﻞ رﺑﻂ ﻣﻠﻔﺎت اﻟﻨﻈﺎم ﻣﻊ اﻟﺒﯿﺎﻧﺎت ‪Bfile‬‬
‫ﻻﺑﺪ أوﻻ ﻣﻦ إﻧﺸﺎء اﻟﻤﺠﻠﺪات ‪ Directory‬ﻓﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت واﻟﺘﻲ ﺗﻌﺒﺮ ﻋﻦ اﻟﻤﺴﺎر اﻟﺨﺎص ﺑﺎﻟﻤﺠﻠﺪات اﻟﻔﻌﻠﯿﺔ‬
‫اﻟﻤﻮﺟﻮدة ﻓﻲ ﻣﻠﻔﺎت اﻟﻨﻈﺎم وﻋﻨﺪ إﻧﺸﺎء اﻟﻤﺠﻠﺪات ﯾﺠﺐ ﻣﺮاﻋﺎة ﺑﻌﺾ اﻷﻣﻮر ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧٥‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫وﺗﺘﯿﺢ ﻟﻨﺎ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ إﻣﻜﺎﻧﯿﺔ ﻋﺮض اﻟﻤﻌﻠﻮﻣﺎت اﻟﺨﺎﺻﺔ ﺑﮭﺬه اﻟﻤﺠﻠﺪات ﻣﻦ ﺧﻼل اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ ‪:‬‬
‫‪DBA_Directories‬‬
‫‪ALL_ Directories‬‬
‫**************************************************************‬
‫‪Bfile‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ اﻟﺨﻄﻮات اﻟﺘﻲ ﯾﺠﺐ أﺗﺒﺎﻋﮭﺎ ﻋﻦ اﺳﺘﺨﺪام وإدارة اﻟﺒﯿﺎﻧﺎت ‪: Bfile‬‬
‫أوﻻ ‪ :‬إﻧﺸﺎء اﻟﻤﺠﻠﺪ اﻟﺨﺎص ﺑﻨﻈﺎم اﻟﺘﺸﻐﯿﻞ ﻣﻊ ﺗﻌﯿﯿﻦ اﻟﺘﺼﺮﯾﺤﺎت اﻟﺘﻲ ﺗﻤﻜﻦ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻣﻦ ﻗﺮاءة ﻣﺤﺘﻮﯾﺎت ھﺬا‬
‫اﻟﻤﺠﻠﺪ وﺣﻔﻆ اﻟﻤﻠﻔﺎت ﺑﮫ وﺗﺘﻢ ھﺬه اﻟﻤﺮﺣﻠﺔ ﻣﻦ ﺧﻼل ﻧﻈﺎم اﻟﺘﺸﻐﯿﻞ ‪. Operating system‬‬
‫ﺛﺎﻧﯿﺎ ‪ :‬ﺗﺘﻤﺜﻞ ﻓﻲ إﻧﺸﺎء ﺟﺪول ﯾﺤﺘﻮي ﻋﻠﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ Bfile‬وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺠﻤﻠﺔ ‪ Create table :‬أو أﺿﺎﻓﺔ‬
‫ﻋﻤﻮد ﻣﻦ اﻟﻨﻮع ‪ Bfile‬ﻓﻲ ﺟﺪول ﻣﻮﺟﻮد ﺑﺎﻟﻔﻌﻞ وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺠﻤﻠﺔ ‪ Alter table :‬ﺛﻢ ﯾﺘﻢ إﻧﺸﺎء ﻋﻨﺼﺮ اﻟﻤﺠﻠﺪ‬
‫‪ Directory Object‬داﺧﻞ اﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺠﻤﻠﺔ ‪ Create Directory‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام‬
‫اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ ‪:‬‬
‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ ‪ Create Directory‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﺠﻠﺪ ﺛﻢ اﻟﻜﻠﻤﺔ ‪ AS‬ﻣﺘﺒﻮﻋﺔ ﺑﺎﻟﻤﺴﺎر اﻟﻤﻮﺟﻮد ﻓﯿﮫ‬
‫اﻟﻤﺠﻠﺪ اﻟﺨﺎص ﺑﻨﻈﺎم اﻟﺘﺸﻐﯿﻞ ﺛﻢ ﯾﺘﻢ ﻣﻨﺢ ﺟﻤﯿﻊ اﻟﻤﺴﺘﺨﺪﻣﯿﻦ اﻻﻣﺘﯿﺎز ‪ Read‬اﻟﻘﺮاءة ﻋﻠﻰ ھﺬا اﻟﻤﺠﻠﺪ وذﻟﻚ ﻟﺴﻤﺎح‬
‫ﻟﮭﻢ ﺑﺈﻣﻜﺎﻧﯿﺔ ﻗﺮاءة اﻟﻤﻠﻔﺎت اﻟﻤﻮﺟﻮدة ﺑﮭﺬا اﻟﻤﺠﻠﺪ ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ‪:‬‬

‫ﯾﺘﻢ إﻧﺸﺎء ﻋﻨﺼﺮ اﻟﻤﺠﻠﺪ ‪ ex_pic‬اﻟﻤﻮﺟﻮد ﻋﻠﻰ اﻟﻘﺮص ‪ C‬ﺑﺎﻟﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺑﺎﻻﺳﻢ ‪ ex_pic‬وﻣﻨﺢ ﺟﻤﯿﻊ‬
‫اﻟﻤﺴﺘﺨﺪﻣﯿﻦ ﺣﻘﯿﺔ ﻗﺮاءة ھﺬا اﻟﻤﺠﻠﺪ ﻣﻦ ﺧﻼل اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ ‪ Read‬ﻓﻲ اﻟﺠﻤﻠﺔ ‪ Grant‬وﺗﺄﺗﻲ ﺑﻌﺪ ذﻟﻚ ﻣﺮﺣﻠﺔ‬
‫ﺗﺨﺰﯾﻦ ﻣﺴﺎر ھﺬه اﻟﻤﻠﻔﺎت ﻓﻲ اﻟﺠﺪول اﻟﺬي ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻮﻇﯿﻔﺔ ‪ BFilename‬واﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ‬
‫رﺑﻂ ﻛﻞ ﻣﻠﻒ ﻣﻦ ﻣﻠﻔﺎت اﻟﻨﻈﺎم ﺑﺎﻟﺴﺠﻞ اﻟﺨﺎص ﺑﮫ ﺑﺎﻟﺠﺪول وﺗﺄﺧﺬ اﻟﻮﻇﯿﻔﺔ ‪ BFilename‬اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ ‪:‬‬

‫وﺗﺄﺧﺬ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻣﻌﻄﯿﺎن اﻟﻤﻌﻄﻰ اﻷول ‪ Directory_alias‬وھﻮ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻌﻨﺼﺮ ‪Directory‬‬
‫‪ Object‬اﻟﺬي ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﻠﻒ ‪ Filename‬اﻟﻤﺨﺰن داﺧﻞ اﻟﻤﺠﻠﺪ اﻟﻔﻌﻠﻲ وﻟﻌﻤﻞ‬
‫ھﺬه اﻟﻤﺮﺣﻠﺔ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﻮﻇﯿﻔﺔ داﺧﻞ اﻟﺠﻤﻠﺔ ‪ Insert‬وذﻟﻚ ﻟﺘﻌﯿﯿﻦ اﻟﻘﯿﻤﺔ ﻓﻲ اﻟﻌﻤﻮد اﻟﻤﻌﺮف ﺑﺎﻟﺒﯿﺎﻧﺎت‬
‫‪ Bfile‬ﻛﻤﺎ ﯾﻤﻜﻦ ﺗﻌﯿﯿﻦ اﻟﻘﯿﻤﺔ ‪ Null‬ﺑﺎﻟﻌﻤﻮد اﻟﻤﻌﺮف ﺑﮭﺬا اﻟﻨﻮع ﻣﻦ اﻟﺒﯿﺎﻧﺎت ﻋﻨﺪ إﻧﺸﺎء اﻟﺠﺪول ﺛﻢ ﻋﻤﻞ ﺗﻌﺪﯾﻞ‬
‫ﻟﻘﯿﻤﺔ ھﺬا اﻟﻌﻤﻮد ﻓﯿﻤﺎ ﺑﻌﺪ وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Update‬ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل إذا أردﻧﺎ ﺗﻌﺪﯾﻞ ﻗﯿﻤﺔ اﻟﻌﻤﻮد‬
‫‪ Emp_video‬اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻮﻇﻒ رﻗﻢ ‪ 100‬ﻣﺜﻼ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺠﻤﻠﺔ ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧٦‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺎﻟﺘﻌﻮﯾﺾ ﻋﻦ اﻟﻤﻌﻄﻰ اﻷول ﻓﻲ اﻟﺪاﻟﺔ ‪ BFilename‬ﺑﺎﺳﻢ ﻋﻨﺼﺮ اﻟﻤﺠﻠﺪ اﻟﺬي ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ ﻣﻦ ﻗﺒﻞ‬
‫‪ Log_Files‬واﻟﺘﻌﻮﯾﺾ ﻋﻦ اﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﺑﺎﺳﻢ اﻟﻤﻠﻒ اﻟﻔﻌﻠﻲ اﻟﺨﺎص ﺑﮭﺬا اﻟﻤﺴﺘﺨﺪم وھﻮ '‪ 'King.avi‬ﻓﻲ ھﺬه‬
‫اﻟﺤﺎﻟﺔ ﺑﻤﺠﺮد ﻋﻤﻞ رﺑﻂ ﺑﯿﻦ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ وﺳﺠﻼت ﺟﺪاول ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﯾﻤﻜﻨﻨﺎ إﺟﺮاء ﻋﻤﻠﯿﺎت اﻟﻤﻌﺎﻟﺠﺔ ﻋﻠﻰ‬
‫ھﺬه اﻟﻤﻠﻔﺎت ﺳﻮاءً ﺑﺎﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_LOB‬أو اﻟﻮاﺟﮭﺎت اﻟﺒﺮﻣﺠﯿﺔ ‪. OCI‬‬
‫**********************************************************‬
‫‪DBMS_LOBLOB‬‬
‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ ﻋﻠﻰ اﻟﺨﻄﻮات اﻟﻼزﻣﺔ ﻹﻧﺸﺎء اﻟﺒﯿﺎﻧﺎت ‪ Bfile‬وﻋﻤﻞ اﻟﺮﺑﻂ ﺑﯿﻦ اﻟﻤﻠﻔﺎت اﻟﻔﻌﻠﯿﺔ واﻟﺒﯿﺎﻧﺎت‬
‫اﻟﺨﺎﺻﺔ ﺑﮭﺎ اﻟﻤﺴﺠﻠﺔ ﻓﻲ ﺳﺠﻼت ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وﻓﻲ ھﺬا اﻟﺪرس ﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ھﺬا اﻟﻨﻮع‬
‫ﻣﻦ اﻟﺒﯿﺎﻧﺎت داﺧﻞ اﻟﺒﺮاﻣﺞ اﻟﻠﻐﺔ ‪ PL/SQL‬ﺣﯿﺚ ﺗﺪﻋﻢ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ إﻣﻜﺎﻧﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ھﺬا اﻟﻨﻮع ﻣﻦ‬
‫اﻟﺒﯿﺎﻧﺎت ﻣﻦ ﺧﻼل اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_LOB‬واﻟﺘﻲ ﺗﺴﺘﺨﺪم ﻟﻤﻌﺎﻟﺠﺔ ﺑﯿﺎﻧﺎت اﻟﻨﻮع ‪ LOB‬ﺳﻮا ءً‬
‫اﻟﺪاﺧﻠﯿﺔ ‪ Internal‬أو اﻟﺨﺎرﺟﯿﺔ ‪ External‬وﺗﻨﻘﺴﻢ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ ‪ DBMS_LOB‬اﻟﻰ ﺛﻼﺛﺔ أﻗﺴﺎم ﺣﺴﺐ‬
‫اﻻﺳﺘﺨﺪام وﯾﻀﻢ اﻟﻘﺴﻢ اﻷول ﻣﻦ ھﺬه اﻷﻗﺴﺎم ﻣﺠﻤﻮﻋﺔ اﻟﺒﺮاﻣﺞ اﻟﺨﺎﺻﺔ ﺑﻤﻌﺎﻟﺠﺔ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﺪاﺧﻠﯿﺔ ﻣﺜﻞ ‪:‬‬
‫‪ . NCLOB، CLOB، BLOB‬وﻣﻦ اﻟﻤﻤﻜﻦ أن ﺗﻘﻮم ھﺬه اﻟﺒﺮاﻣﺞ ﺑﻘﺮاءة اﻟﺒﯿﺎﻧﺎت وﻋﻤﺎ اﻟﺘﻌﺪﯾﻞ ﻋﻠﯿﮭﺎ وﺗﺘﻤﺜﻞ‬
‫ھﺬه اﻟﺒﺮاﻣﺞ ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ‪:‬‬

‫واﻟﻘﺴﻢ اﻟﺜﺎﻧﻲ ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ ﻗﺮاءة أو اﺧﺘﺒﺎر ﺑﯿﺎﻧﺎت ھﺬا اﻟﻨﻮع وﺗﺘﻤﺜﻞ ﻓﻲ اﻟﺒﺮاﻣﺞ اﻟﻤﻮﺟﻮدة‬
‫ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧٧‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫وﯾﻤﻜﻦ اﺳﺘﺨﺪام ھﺬه اﻟﺒﺮاﻣﺞ ﻣﻊ أي ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﺪاﺧﻠﯿﺔ أو اﻟﺨﺎرﺟﯿﺔ ﻟﻠﺒﯿﺎﻧﺎت ‪. LOB‬‬
‫أﻣﺎ اﻟﻘﺴﻢ اﻟﺜﺎﻟﺚ ﻓﮭﻲ اﻟﺒﺮاﻣﺞ اﻟﺬي ﺗﺨﺘﺺ ﺑﺎﻟﻨﻮع اﻟﺨﺎرﺟﻲ ‪ External File‬ﻟﻠﺒﯿﺎﻧﺎت ‪ LOB‬وھﻮ اﻟﻨﻮع ‪Bfile‬‬
‫وﺗﺘﻤﺜﻞ ﻓﻲ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﺗﻈﮭﺮ ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ‪:‬‬

‫وﻟﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ھﺬه اﻟﺒﺮاﻣﺞ داﺧﻞ اﻟﺒﺮﻧﺎﻣﺞ ‪ PL/SQL‬ﻧﻨﻈﺮ إﻟﻰ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ‪:‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬

‫‪8‬‬
‫‪9‬‬
‫‪10‬‬

‫‪11‬‬
‫‪12‬‬
‫‪13‬‬
‫‪14‬‬
‫‪15‬‬
‫‪16‬‬

‫‪17‬‬
‫‪18‬‬
‫‪19‬‬
‫‪20‬‬

‫‪21‬‬
‫‪22‬‬
‫ﺗﻮﺿﯿﺢ‬

‫ﺣﯿﺚ ﯾﻌﻤﻞ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ ﻋﻠﻰ ﺗﺨﺰﯾﻦ ﺑﯿﺎﻧﺎت اﻟﻤﻠﻔﺎت اﻟﺬي ﻗﻤﻨﺎ ﺑﺤﻔﻈﮭﺎ ﻓﻲ اﻟﻤﺠﻠﺪ ‪ ex_pic‬ﻓﻲ اﻟﺠﺪول ‪ ex‬وذﻟﻚ ﻣﻦ‬
‫ﺧﻼل ﻋﺪد ﻣﻦ اﻟﺨﻄﻮات وﯾﺠﺐ ﻣﻼﺣﻈﺔ أم ھﺬه اﻟﻤﻠﻔﺎت ﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺼﻮر اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻮﻇﻔﯿﻦ ﺣﯿﺚ‬
‫ﺗﺄﺧﺬ ھﺬه اﻟﺼﻮرة ﻧﻔﺲ أﺳﻤﺎء اﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﺨﺰﻧﺔ ﻓﻲ اﻟﺤﻘﻞ ‪ name‬ﻓﻲ اﻟﺠﺪول ‪ ex‬وﺑﺎﻻﻣﺘﺪاد ‪.jpg‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧٨‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻓﻜﻤﺎ ﻧﻼﺣﻆ ﻓﻲ ھﺬا اﻟﻜﻮد أﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺘﻜﻮﯾﻦ أﺳﻤﺎء اﻟﻤﻠﻔﺎت اﻟﺨﺎﺻﺔ ﺑﺼﻮر اﻟﻤﻮﻇﻔﯿﻦ ﻋﻦ ﻃﺮﯾﻖ اﻟﺮﺑﻂ ﺑﯿﻦ أﺳﻤﺎء‬
‫اﻟﻤﻮﻇﻔﯿﻦ واﻻﻣﺘﺪاد اﻟﺨﺎص ﺑﮭﺬه اﻟﻤﻠﻔﺎت ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [10‬وھﻮ ‪ jpg‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ وﺗﺨﺰﯾﻦ ﻧﺎﺗﺞ ﻋﻤﻠﯿﺔ اﻟﺮﺑﻂ‬
‫ﻓﻲ اﻟﻤﺘﻐﯿﺮ ‪ V_Filename‬وﯾﺠﺐ أﺧﺬ ﺑﺎﻻﻋﺘﺒﺎر أﻧﮫ ﻻﺑﺪ أن ﺗﺘﻮاﻓﻖ أﺳﻤﺎء اﻟﻤﻠﻔﺎت اﻟﺘﻲ ﻧﻘﻮم ﺑﺈﻧﺸﺎﺋﮭﺎ داﺧﻞ ﻗﻮاﻋﺪ‬
‫اﻟﺒﯿﺎﻧﺎت ﻣﻊ أﺳﻤﺎء اﻟﻤﻠﻔﺎت اﻟﻔﻌﻠﯿﺔ اﻟﺘﻲ ﻗﻤﻨﺎ ﺑﺤﻔﻈﮭﺎ ﻓﻲ اﻟﻤﺠﻠﺪ ‪ ex_pic‬وﻧﻼﺣﻆ ﻓﻲ اﻟﺴﻄﺮ ]‪ [11‬اﻟﻮﻇﯿﻔﺔ‬
‫‪ BFilename‬وﺗﺴﺘﺨﺪم ھﺬه اﻟﻮﻇﯿﻔﺔ ﻟﻌﻤﻞ رﺑﻂ ﺑﯿﻦ اﻷﺳﻤﺎء اﻟﺬي ﻗﻤﻨﺎ ﺑﺘﻜﻮﯾﻨﮭﺎ ﻣﻊ اﻟﻤﻠﻔﺎت اﻟﻔﻌﻠﯿﺔ اﻟﻤﻮﺟﻮدة ﻓﻲ‬
‫اﻟﻤﺠﻠﺪ وﺗﺨﺰﯾﻦ ﻧﺎﺗﺞ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻓﻲ اﻟﻤﺘﻐﯿﺮ ‪ V_file‬أﻣﺎ اﻟﻮﻇﯿﻔﺔ ﻓﻲ اﻟﺴﻄﺮ ]‪DBMS_LOB.Fileexists [12‬‬
‫ﻓﺘﺴﺘﺨﺪم ﻻﺧﺘﺒﺎر وﺟﻮد اﻟﻤﻠﻔﺎت ﻓﻲ اﻟﻤﺠﻠﺪ وﻓﻲ ﺣﺎﻟﺔ اﻟﻌﺜﻮر ﻋﻠﻰ اﻟﻤﻠﻒ ﻓﻲ اﻟﻤﺠﻠﺪ ﯾﺘﻢ ﻓﺘﺢ اﻟﻤﺠﻠﺪ ﺑﺎﺳﺘﺨﺪام‬
‫اﻟﻮﻇﯿﻔﺔ ‪ DBMS_LOB.FileOpen‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [13‬ﺛﻢ ﻋﻤﻞ ﺗﻌﺪﯾﻞ ﻟﻠﺴﺠﻞ اﻟﺨﺎص ﺑﮭﺬا اﻟﻤﻮﻇﻒ ﻓﻲ‬
‫اﻟﺠﺪول ‪ ex‬ﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﺴﻄﻮر ]‪ [14,15‬ﺑﺤﯿﺚ ﯾﺘﻢ إﺿﺎﻓﺔ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺨﺰﻧﺔ ﻓﻲ اﻟﻤﺘﻐﯿﺮ ‪ V_File‬ﻓﻲ اﻟﻌﻤﻮد‬
‫‪ Picture‬أﻣﺎ اﻟﻮﻇﯿﻔﺔ اﻟﻠﻲ ﻓﻲ اﻟﺴﻄﺮ ]‪ [16‬وھﻲ ‪ DBMS_LOB.GetLength‬ﻓﺘﺴﺘﺨﺪم ﻟﻄﺒﺎﻋﺔ اﺳﻢ اﻟﻤﻠﻒ‬
‫‪ DBMS_LOB.FileClose‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ]‪. [17‬‬ ‫وﺣﺠﻤﮫ وﻓﻲ اﻟﻨﮭﺎﯾﺔ ﯾﺘﻢ إﻏﻼق اﻟﻤﻠﻒ ﺑﺎﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ‬
‫أﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﻋﺪم اﻟﻌﺜﻮر ﻋﻠﻰ اﻟﻤﻠﻒ داﺧﻞ اﻟﻤﺠﻠﺪ ﯾﻘﻮم اﻟﺒﺮﻧﺎﻣﺞ ﺑﺈﺻﺪار رﺳﺎﻟﺔ ﺗﺨﺒﺮﻧﺎ ﺑﺄﻧﮫ ﻟﻢ ﯾﺘﻢ اﻟﻌﺜﻮر ﻋﻠﻰ اﻟﻤﻠﻒ‬
‫داﺧﻞ اﻟﻤﺠﻠﺪ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [19‬وﻟﺘﺸﻐﯿﻞ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬه اﻟﺠﻤﻠــــﺔ ‪:‬‬
‫;)'‪EXECUTE Load_emp_Bfile('ex_pic‬‬
‫*******************************************************‬
‫‪(1) DBMS_LOB    ‬‬

‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪروس اﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﺒﯿﺎﻧﺎت ‪ Bfile‬ﻣﻦ ﺧﻼل اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪DBMS_LOB‬‬
‫ﻛﻤﺎ ﺗﻌﺮﻓﻨﺎ أﯾﻀﺎ ﻋﻠﻰ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻟﮭﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪.‬‬
‫وﻓﻲ ھﺬا اﻟﺪرس ﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﺒﯿﺎﻧﺎت اﻟﺪاﺧﻠﯿﺔ ﻟﻠﻨﻮع ‪ LOB‬ﻣﻦ ﺣﯿﺚ ﺗﻌﺮﯾﻔﮭﺎ أو أﺿﺎﻓﺘﮭﺎ‬
‫ﻓﻲ ﺟﺪاول ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وإﻣﻜﺎﻧﯿﺔ اﻟﻜﺘﺎﺑﺔ ﻋﻠﯿﮭﺎ ﻛﻤﺎ ﺳﻨﺘﻌﺮف أﯾﻀﺎ ﻋﻠﻰ ﻛﯿﻔﯿﺔ ﻗﺮاءة اﻟﺒﯿﺎﻧﺎت اﻟﻤﺨﺰﻧﺔ ﻋﻠﯿﮭﺎ ﻓﺈذا‬
‫أردﻧﺎ ﻣﺜﻼ إﺿﺎﻓﺔ ﻋﻤﻮد ﺟﺪﯾﺪ ﯾﻘﻮم ﺑﺤﻔﻆ ﺑﻌﺾ اﻟﻤﻌﻠﻮﻣﺎت ﻋﻦ ﻛﻞ ﻣﻮﻇﻒ ﻓﻲ اﻟﺠﺪول ‪ ex‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد‪:‬‬
‫;‪Alter table ex Add emp_info CLOB‬‬
‫وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻜﻮد أﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻒ اﻟﻌﻤﻮد ‪ emp_info‬ﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت ‪ CLOB‬ﻓﻲ اﻟﺠﻤﻠﺔ ‪Alter table‬‬
‫وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺨﺎﺻﯿﺔ‪ Add‬وﺑﻌﺪ إﺿﺎﻓﺔ اﻟﻌﻤﻮد ‪ emp_info‬ﻟﻠﺠﺪول ﻧﻘﻮم ﺑﻌﻤﻞ ﻓﺤﺺ ﻟﻠﻘﯿﻢ اﻟﻤﻮﺟﻮدة ﻓﻲ‬
‫ﺻﻔﻮف ھﺬا اﻟﻌﻤﻮد وذﻟﻚ ﻣﻦ ﺧﻼل ھﺬا اﻟﻜﻮد ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٧٩‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪1‬‬
‫‪2‬‬
‫‪3‬‬

‫‪4‬‬
‫‪5‬‬
‫‪6‬‬

‫‪7‬‬
‫‪8‬‬
‫‪9‬‬
‫‪10‬‬
‫‪11‬‬

‫‪12‬‬
‫‪13‬‬
‫‪14‬‬

‫‪15‬‬

‫‪16‬‬

‫‪17‬‬
‫ﺗﻮﺿﯿﺢ‬

‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ اﻟﻌﻤﻮد ‪ emp_rec.emp_info‬ﻓﻲ اﻟﺴﻄﺮ ]‪ [7‬ﻟﻠﻤﺘﻐﯿﺮ ‪ Directions‬اﻟﺬي ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻔﮫ ﻓﻲ‬
‫اﻟﻘﺴﻢ ‪ Declare‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [2‬ﺛﻢ ﻗﻤﻨﺎ ﺑﻌﻤﻞ اﺧﺘﺒﺎر ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ اﻟﺸﺮﻃﯿﺔ ‪ IF‬ﻓﻲ اﻟﺴﻄﺮ ]‪[8‬‬
‫ﻓﺈذا ﻛﺎﻧﺖ ھﺬه اﻟﻘﯿﻤﺔ ‪ Null‬ﯾﺘﻢ إﻇﮭﺎر اﻟﺮﺳﺎﻟﺔ '‪ ' value is Null‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [9‬ﺛﻢ ﻧﻘﻮم ﺑﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ‬
‫اﻓﺘﺮاﺿﯿﺔ ﻟﻠﻌﻤﻮد ‪ emp_info‬ﻓﻲ اﻟﺴﻄﺮ ]‪ [10‬وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻮﻇﯿﻔﺔ ) (‪ empty_CloB‬وﺗﻌﻤﻞ ھﺬه اﻟﻮﻇﯿﻔﺔ‬
‫ﻋﻠﻰ اﺳﺘﺮﺟﺎع ﻣﺆﺷﺮ ‪ Pointer‬ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ CLOB‬وﺗﮭﯿﺌﺔ ھﺬا اﻟﻌﻤﻮد ﻟﺘﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ وﺿﻊ‬
‫ﻗﯿﻤﺔ اﻓﺘﺮاﺿﯿﺔ ﻟﮫ ﺣﯿﺚ ﻻ ﯾﻤﻜﻦ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ CLOB‬وھﻮ ﯾﺤﺘﻮي ﻋﻠﻰ ﻗﯿﻤﺔ ‪ Null‬أﻣﺎ أذا ﻛﺎﻧﺖ ھﺬه‬
‫'‪ 'value is not Null‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [13‬أﻣﺎ‬ ‫اﻟﻘﯿﻤﺔ ﻗﯿﻤﺔ أﺧﺮى ﻏﯿﺮ اﻟﻘﯿﻤﺔ ‪ Null‬ﯾﺘﻢ أﻇﮭﺎر اﻟﺮﺳﺎﻟﺔ‬
‫اﻟﻮﻇﯿﻔﺔ ‪ DBMS_LOB.GetLength‬ﻓﺘﺴﺘﺨﺪم ﻹﻇﮭﺎر ﻃﻮل اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ ھﺬا اﻟﻌﻤﻮد ﺣﯿﺚ ﺗﺄﺧﺬ ھﺬه‬
‫اﻟﻮﻇﯿﻔﺔ ﻣﻌﻄﻰ واﺣﺪاً ﻓﻘﻂ وھﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺘﻐﯿﺮ ﻣﻦ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ CLOB‬أو ‪ BLOB‬أو ‪ Bfile‬وﺗﻌﻤﻞ ھﺬه‬
‫اﻟﻮﻇﯿﻔﺔ ﻋﻠﻰ إﻋﺎدة ﻗﯿﻤﺔ ﻋﺪدﯾﺔ ﺗﻤﺜﻞ ﻃﻮل اﻟﺒﯿﺎﻧﺎت اﻟﻤﺨﺰﻧﺔ ﻓﻲ ھﺬا اﻟﻤﺘﻐﯿﺮ )‪. (Directions‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٨٠‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪(2) DBMS_LOB    ‬‬

‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﺿﺎﻓﺔ أﻋﻤﺪة ﻟ ﮭﺎ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬ﻓﻲ ﺟﺪاول ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وﻛﯿﻔﯿﺔ ﺗﮭﯿﺌﺔ‬
‫ھﺬه اﻷﻋﻤﺪة ﻟﻼﺳﺘﺨﺪام ﺑﻮاﺳﻄﺔ اﻟﻮﻇﯿﻔﺔ ‪ empty_Clob‬وﺳﻮف ﻧﺴﺘﻜﻤﻞ ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ اﻟﺘﻌﺮف ﻋﻠﻰ ﺑﻌﺾ‬
‫اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺷﺎﺋﻌﺔ اﻻﺳﺘﺨﺪام ﻓﻲ اﻟﻤﺠﻤﻮﻋﺔ ‪ DBMS_LOB‬وﻣﻨﮭﺎ اﻹﺟﺮاءات ‪ Write :‬و ‪Write‬‬
‫‪ Append‬و ‪ Read‬وﯾﻌﻤﻞ اﻹﺟﺮاء ‪ Write‬ﻋﻠﻰ ﻛﺘﺎﺑﺔ ﻛﻤﯿﺔ ﻣﺤﺪدة ﻣﻦ اﻟﺒﯿﺎﻧﺎت ﻓﻲ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪Internal‬‬
‫‪ LOB‬وذﻟﻚ ﺑﺪاﯾﺔ ﻣﻦ ﻣﻮﺿﻊ ﻣﺤﺪد ﻟﻸﺣﺮف ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺘﺤﺪﯾﺪه ﻓﺈذا ﻗﺎم اﻟﻤﺴﺘﺨﺪم ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﺑﺘﺤﺪﯾﺪ‬
‫اﻟﻘﯿﻤﺔ ‪ 5‬ﻛﻤﻮﺿﻊ ﻟﺒﺪاﯾﺔ اﻟﻜﺘﺎﺑﺔ ﻓﺈن ھﺬا اﻹﺟﺮاء ﺳﻮف ﯾﻘﻮم ﺑﺎﻟﻜﺘﺎﺑﺔ أﺑﺘﺪاءأً ﻣﻦ ﻣﻮﺿﻊ اﻟﺤﺮف اﻟﺨﺎﻣﺲ وﺳﻮف‬
‫ﯾﻘﻮم ھﺬا اﻹﺟﺮاء ﺑﺎﺳﺘﺒﺪال أي ﺑﯿﺎﻧﺎت ﻣﻮﺟﻮدة أﺑﺘﺪاءاً ﻣﻦ ھﺬا اﻟﻤﻮﺿﻊ إﻟﻰ ﻧﮭﺎﯾﺔ ﻛﻤﯿﺔ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺪﺧﻠﺔ ‪.‬‬
‫واﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﮭﺬا اﻹﺟﺮاء ھﻲ‪:‬‬

‫وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ ھﺬه اﻟﺼﯿﻐﺔ ﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء أرﺑﻌﺔ ﻣﻌﻄﯿﺎت ‪:‬‬
‫اﻟﻤﻌﻄﻰ اﻷول ‪ Lobdst‬ﻋﺒﺎرة ﻋﻦ ﻣﺆﺷﺮ ﯾﺸﯿﺮ إﻟﻰ ﻣﻜﺎن اﻟﻜﺘﺎﺑﺔ وﯾﻤﻜﻦ أن ﯾﻜﻮن ھﺬا اﻟﻤﺆﺷﺮ ﻣﻦ اﻟﻨﻮع‬
‫‪ BLOB/CLOB‬وذﻟﻚ ﺣﺴﺐ ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺬي ﯾﺸﯿﺮ إﻟﯿﮫ ‪ .‬واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ‪ amount‬ﻋﺒﺎرة ﻋﻦ ﺣﺠﻢ اﻟﺒﯿﺎﻧﺎت‬
‫اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ وھﺬا اﻟﻤﻌﻄﻰ ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ . Binary_integer‬واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ‪ offset‬ﻋﺒﺎرة ﻋﻦ اﻟﻤﻮﺿﻊ‬
‫اﻟﺬي ﺳﯿﺘﻢ اﻟﻜﺘﺎﺑﺔ ﻣﻨﮫ وﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ . integer‬اﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ ‪ Buffer‬ھﻮ ﻋﺒﺎرة ﻋﻦ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ‬
‫ﻓﮭﻲ أﻣﺎ أن ﺗﻜﻮن ﻣﻦ اﻟﻨﻮع ‪ Varchar2‬إذا ﻛﺎن اﻟﻤﺆﺷﺮ ﯾﺸﯿﺮ إﻟﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت‪ CLOB‬أو ﻣﻦ ﻧﻮع ‪ Raw‬إذا ﻛﺎن‬
‫اﻟﻤﺆﺷﺮ ﯾﺸﯿﺮ إﻟﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ . BLOB‬وﻟﻤﺰﯾﺪا ﻣﻦ اﻟﺘﻮﺿﯿﺢ ﻧﻘﻮم ﺑﺎﻟﺘﻌﺮف ﻋﻠﻰ ھﺬا اﻟﻤﺜﺎل ‪:‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬

‫‪8‬‬
‫‪9‬‬
‫‪10‬‬
‫‪11‬‬
‫‪12‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٨١‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪13‬‬
‫‪14‬‬
‫‪15‬‬

‫‪16‬‬
‫‪17‬‬
‫‪18‬‬
‫‪19‬‬

‫‪20‬‬
‫‪21‬‬

‫ﺗﻮﺿﯿﺢ‬

‫ﯾﻌﻤﻞ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ ﻋﻠﻰ ﻛﺘﺎﺑﺔ ﺑﻌﺾ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺘﻌﻠﻘﺔ ﺑﺎﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﻮﺟﻮدﯾﻦ ﺑﺎﻟﺠﺪول ‪ ex‬ﺑﺎﻟﻌﻤﻮد ‪emp_info‬‬
‫اﻟﻤﻮﺟﻮد ﺑﻨﻔﺲ اﻟﺠﺪول ﻛﻤﺎ ﻓﻲ ﻧﻼﺣﻆ ﻓﻲ اﻟﺴﻄﺮ ]‪ [9‬ﺗﻢ ﺗﻌﯿﯿﻦ ﻗﯿﻤﺔ اﻟﻌﻤﻮد ‪ emp_info‬ﻟﻠﻤﺘﻐﯿﺮ ‪ Directions‬ﺛﻢ ﯾﺘﻢ‬
‫ﻋﻤﻞ اﺧﺘﺒﺎر ﻟﻤﺤﺘﻮﯾﺎت ھﺬا اﻟﻤﺘﻐﯿﺮ وذﻟﻚ ﻟﻠﺘﺄﻛﺪ ﻣﻦ ﻋﺪم وﺟﻮد ﻛﺘﺎﺑﺎت ﺑﮭﺬا اﻟﻤﺘﻐﯿﺮ وﻓﻲ ﺣﺎﻟﺔ ﻋﺪم اﺣﺘﻮاء ھﺬا اﻟﺤﻘﻞ‬
‫ﻋﻠﻰ أي ﻛﺘﺎﺑﺎت ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء ‪ DBMS_LOB.Open‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [11‬ﻟﻔﺘﺢ وﺗﮭﯿﺌﺔ اﻟﻤﺆﺷﺮ ﻟﻠﻜﺘﺎﺑﺔ‬
‫وﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﻣﻌﻄﯿﺎن اﻟﻤﻌﻄﻰ اﻷول ﻋﺒﺎرة ﻋﻦ أﺳﻢ اﻟﻤﺆﺷﺮ وھﻮ ‪ Directions‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ‪.‬‬
‫واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ‪ DBMS_LOB.Lob_readwrite‬وھﻮ ﻋﺒﺎرة ﻋﻦ اﻷﺳﻠﻮب اﻟﻤﺴﺘﺨﺪم ﻟﻔﺘﺢ وﺗﮭﯿﺌﺔ اﻟﻤﺆﺷﺮ وھﻮ‬
‫أﺣﺪى اﻷﺳﻠﻮﺑﯿﻦ اﻷﺳﻠﻮب ‪ ReadWrite‬وﯾﻌﻤﻞ ﻋﻠﻰ ﺗﮭﯿﺌﺔ اﻟﻤﺆﺷﺮ ﻟﻠﻘﺮاءة واﻟﻜﺘﺎﺑﺔ‬
‫‪ReadWrite‬‬ ‫‪Read & Write‬‬
‫واﻷﺳﻠﻮب ‪ Read only‬ﯾﻌﻤﻞ ﻋﻠﻰ ﺗﮭﯿﺌﺔ اﻟﻤﺆﺷﺮ ﻟﻠﻘﺮاءة ﻓﻘﻂ ‪ .‬أﻣﺎ اﻟﺠﻤﻠﺔ اﻟﻠﻲ ﻓﻲ اﻟﺴﻄﺮ ]‪ [12‬ﻓﺘﺴﺘﺨﺪم ﻟﺘﻌﯿﯿﻦ‬
‫اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﻧﺮﯾﺪ ﻛﺘﺎﺑﺘﮭﺎ ﻓﻲ اﻟﻌﻤﻮد ‪ emp_info‬ﻟﻠﻤﺘﻐﯿﺮ ‪ First_direction‬وﺗﺴﺘﺨﺪم ھﺬه اﻟﺠﻤﻠﺔ‬
‫)‪ Length (First_direction‬ﻓﻲ اﻟﺴﻄﺮ ]‪ [13‬ﻟﺘﻌﯿﯿﻦ ﺣﺠﻢ اﻟﻜﺘﺎﺑﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ ﻛﻘﯿﻤﺔ ﻟﻠﻤﺘﻐﯿﺮ ‪amount‬‬
‫وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ ‪. Length‬وﺗﺴﺘﺨﺪم ھﺬه اﻟﺠﻤﻠﺔ ‪ offset:=1‬ﻓﻲ اﻟﺴﻄﺮ ]‪ [14‬ﻟﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ اﻟﻤﻮﺿﻊ اﻟﺬي‬
‫ﺳﯿﺒﺪأ اﻹﺟﺮاء اﻟﻜﺘﺎﺑﺔ ﻣﻨﮫ ﻟﻠﻤﺘﻐﯿﺮ ‪ offset‬وھﻮ واﺣﺪ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ وﯾﺴﺘﺨﺪم اﻹﺟﺮاء ‪ DBMS_LOB.Write‬ﻓﻲ‬
‫اﻟﺴﻄﺮ ]‪ [15‬ﻟﻜﺘﺎﺑﺔ اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﻌﻤﻮد ‪ emp-info‬وﯾﺤﺘﻮي ھﺬا اﻹﺟﺮاء ﻋﻠﻰ أرﺑﻌﺔ ﻣﻌﻄﯿﺎت ﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﺴﻄﺮ‬
‫]‪ [15‬اﻟﻤﻌﻄﻰ ‪ Directions‬ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺆﺷﺮ ‪ Locator‬اﻟﺬي ﯾﺸﯿﺮ اﻟﻰ اﻟﻌﻤﻮد ‪ emp_info‬واﻟﻤﻌﻄﻰ‬
‫‪ amount‬ﻋﺒﺎرة ﻋﻦ ﺣﺠﻢ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ ﻓﻲ اﻟﻌﻤﻮد واﻟﻤﻌﻄﻰ ‪ offset‬ﻋﺒﺎرة ﻋﻦ اﻟﻤﻮﺻﻊ اﻟﺬي ﺳﯿﺒﺪأ‬
‫اﻹﺟﺮاء اﻟﻜﺘﺎﺑﺔ ﻣﻨﮫ ﻓﻲ اﻟﻌﻤﻮد واﻟﻤﻌﻄﻰ ‪ First_direction‬ﻋﺒﺎرة ﻋﻦ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ ‪.‬‬
‫وﺑﻌﺪ إﺟﺮاء ﻋﻤﻠﯿﺔ اﻟﻜﺘﺎﺑﺔ ﺑﺎﻟﻌﻤﻮد ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [16‬وھﻮ ‪DBMS_LOB.Close‬‬
‫ﻹﻏﻼق اﻻﺗﺼﺎل ﺑﺎﻟﻤﺆﺷﺮ وﻣﻨﻊ أي ﻋﻤﻠﯿﺔ أﺧﺮى ﻋﻠﻰ اﻟﻌﻤﻮد اﻟﻤﻌﺮف ﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬وﯾﺄﺧﺬ ھﺬا اﻷﺟﺮاء ﻣﻌﻄﻰ‬
‫واﺣﺪاً ﻓﻘﻂ وھﻮ أﺳﻢ اﻟﻤﺆﺷﺮ وھﻮ ‪ Directions‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ‪ .‬أﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﺗﻮاﺟﺪ ﺑﯿﺎﻧﺎت ﻓﻲ ھﺬا اﻟﺤﻘﻞ ﯾﻘﻮم‬
‫'‪. 'The Data is already entered‬‬ ‫اﻟﺒﺮﻧﺎﻣﺞ ﺑﺈﻇﮭﺎر رﺳﺎﻟﺔ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [18‬وھﻲ‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٨٢‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪(3) DBMS_LOB     ‬‬

‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ ﻋﻠﻰ اﻹﺟﺮاء ‪ DBMS_LOB.Write‬وﻓﻲ ھﺬا اﻟﺪرس ﺳﻮف ﻧﺴﺘﻜﻤﻞ ﺷﺮح ﺑﺎﻗﻲ‬
‫اﻹﺟﺮاءات اﻟﺬي ﺗﻢ ذﻛﺮھﺎ ﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ اﻹﺟﺮاء ‪ WriteAppend‬وﯾﻘﻮم ھﺬا اﻹﺟﺮاء ﺑﺈﺿﺎﻓﺔ اﻟﺒﯿﺎﻧﺎت ﻓﻲ‬
‫ﻧﮭﺎﯾﺔ اﻟﺤﻘﻞ اﻟﻤﻌﺮف ﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت ‪ LOB‬واﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﮭﺬا اﻹﺟﺮاء ھﻲ ﻛﺎﻟﺘﺎﻟﻲ‪:‬‬

‫وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت ‪-:‬‬


‫اﻟﻤﻌﻄﻰ اﻷول ‪ Lob_loc‬ﻋﺒﺎرة ﻋﻦ اﻟﻤﺆﺷﺮ اﻟﺬي ﯾﺸﯿﺮ إﻟﻰ ﻣﻜﺎن اﻟﻜﺘﺎﺑﺔ وﯾﻤﻜﻦ أن ﯾﻜﻮن ھﺬا اﻟﻤﺆﺷﺮ ﻣﻦ اﻟﻨﻮع‬
‫‪ CLOB/BLOB‬وذﻟﻚ ﺣﺴﺐ ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺬي ﯾﺸﯿﺮ إﻟﯿﮫ‪.‬‬
‫اﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ‪ amount‬ﻋﺒﺎرة ﻋﻦ ﺣﺠﻢ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ وھﺬا اﻟﻤﻌﻄﻰ ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪Binary_integer‬‬

‫اﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ‪ Buffer‬ﻓﮭﻮ ﻋﺒﺎرة ﻋﻦ اﻟﻤﺘﻐﯿﺮ اﻟﺬي ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﺒﯿﺎﻧﺎت اﻟﺬي ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ ھﻲ أﻣﺎ أن ﺗﻜﻮن ﻣﻦ‬
‫اﻟﻨﻮع ‪ Varchar2‬أذا ﻛﺎن اﻟﻤﺆﺷﺮ ﯾﺸﯿﺮ إﻟﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ CLOB‬أو ﻣﻦ اﻟﻨﻮع ‪ Raw‬أذا اﻟﻤﺆﺷﺮ ﯾﺸﯿﺮ اﻟﻰ ﻧﻮع‬
‫اﻟﺒﯿﺎﻧﺎت ‪. BLOB‬‬
‫ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل إﺿﺎﻓﺔ ﺑﯿﺎﻧﺎت ﻟﻤﻮﻇﻒ ﻣﻌﯿﻦ ﻓﻲ اﻟﻌﻤﻮد ‪ emp_info‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻹﺟﺮاء ‪:‬‬
‫‪1‬‬
‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬

‫‪8‬‬
‫‪9‬‬
‫‪10‬‬
‫‪11‬‬
‫‪12‬‬
‫‪13‬‬
‫‪14‬‬
‫‪15‬‬
‫‪16‬‬
‫‪17‬‬
‫‪18‬‬
‫‪19‬‬
‫‪20‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٨٣‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺗﻮﺿﯿﺢ‬

‫ﻧﻼﺣﻆ أن ھﺬا اﻹﺟﺮاء ﯾﺤﺘﻮي ﻋﻠﻰ ﻣﻌﻄﯿﺎن اﻟﻤﻌﻄﻰ اﻷول ‪ emp_name‬ﻓﻲ اﻟﺴﻄﺮ ]‪ [1‬وھﻮ ﻋﺒﺎرة ﻋﻦ اﺳﻢ‬
‫اﻟﻤﻮﻇﻒ اﻟﺬي ﻧﺮﯾﺪ إﺿﺎﻓﺔ اﻟﺒﯿﺎﻧﺎت ﻟﮫ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ‪ app_text‬ﻋﺒﺎرة ﻋﻦ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ أﺿﺎﻓﺘﮭﺎ وﻛﻤﺎ ﻧﻼﺣﻆ‬
‫]‪ [12‬ﯾﺘﻢ اﺧﺘﺒﺎر اﺳﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﺳﯿﺘﻢ إدﺧﺎﻟﮫ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻓﺈذا ﻛﺎن اﻻﺳﻢ ﻣﺴﺎوي ﻟﻼﺳﻢ اﻟﻤﺴﺘﺮﺟﻊ ﻣﻦ‬
‫اﻟﻤﺆﺷﺮ ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء ‪ DBMS_LOB.WriteAppend‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [14‬ﻹﺿﺎﻓﺔ اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ‬
‫ﺑﮭﺬا اﻟﻤﻮﻇﻒ وﯾﺤﺘﻮي ھﺬا اﻹﺟﺮاء ﻋﻠﻰ ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت ‪:‬‬
‫اﻟﻤﻌﻄﻰ اﻷول ‪ Directions‬وھﻮ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺆﺷﺮ ‪ Locator‬اﻟﺬي ﯾﺸﯿﺮ اﻟﻰ ﻣﻜﺎن اﻟﻜﺘﺎﺑﺔ وھﻮ اﻟﻌﻤﻮد‬
‫‪ emp_info‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ‪.‬‬
‫‪Locator‬‬ ‫‪emp_info‬‬
‫واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ )‪ Length (app_text‬ﻋﺒﺎرة ﻋﻦ ﺣﺠﻢ اﻟﻜﺘﺎﺑﺎت اﻟﺘﻲ ﺳﯿﺘﻢ أﺿﺎﻓﺘﮭﺎ ﻟﻠﻌﻤﻮد واﻟﺘﻲ ﯾﺘﻢ ﺣﺴﺎﺑﮭﺎ‬
‫ﻋﻦ ﻃﺮﯾﻖ اﻟﻮﻇﯿﻔﺔ ‪ . Length‬واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ‪ app_text‬ﻓﮭﻮ ﻋﺒﺎرة ﻋﻦ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﻧﺮﯾﺪ إدﺧﺎﻟﮭﺎ ﻟﮭﺬا‬
‫اﻟﻤﻮﻇﻒ ‪ .‬أﻣﺎ إذا ﻛﺎن اﺳﻢ اﻟﻤﺪﺧﻞ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻏﯿﺮ ﻣﺴﺎوي ﻟﻼﺳﻢ اﻟﻤﺴﺘﺮﺟﻊ ﻣﻦ اﻟﻤﺆﺷﺮ ﺗﻘﻮم ﺑﺎﺳﺘﺨﺪام‬
‫‪ Goto‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [16‬ﻟﺘﻜﺮار ﻋﻤﻠﯿﺔ اﺳﺘﺨﻼص اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﻤﺆﺷﺮ ﻣﺮة أﺧﺮى وھﻜـــــــــــــــــــــﺬا !!!!‬
‫**********************************************************************‬
‫‪(4) DBMS_LOB    ‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ إﺟﺮاء آﺧﺮ ﻣﻦ إﺟﺮاءات اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ‪ DBMS_LOB‬وھﻮ اﻹﺟﺮاء‬
‫‪ Read‬وﯾﻌﻤﻞ ھﺬا اﻹﺟﺮاء ﻋﻠﻰ اﺳﺘﺮﺟﺎع ﻛﻤﯿﺔ ﻣﺤﺪدة ﻣﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ أﺣﺪى اﻟﺤﻘﻮل اﻟﻤﻌﺮﻓﺔ ﺑﻨﻮع‬
‫اﻟﺒﯿﺎﻧﺎت ‪ LOB‬واﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﮭﺬا اﻹﺟﺮاء ‪:‬‬

‫ﯾﺤﺘﻮي ھﺬا اﻹﺟﺮاء ﻋﻠﻰ أرﺑﻌﺔ ﻣﻌﻄﯿﺎت ‪:‬‬


‫اﻟﻤﻌﻄﻰ اﻷول ‪ Lob_Loc‬ﻋﺒﺎرة ﻋﻦ اﻟﻤﺆﺷﺮ اﻟﺬي ﯾﺸﯿﺮ اﻟﻰ ﻣﻜﺎن اﻟﻘﺮاءة وﯾﻤﻜﻦ أن ﯾﻜﻮن ھﺬا اﻟﻤﺆﺷﺮ ﻣﻦ اﻟﻨﻮع‬
‫‪ . BLOB /CLOB‬اﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ‪ amount‬ﻋﺒﺎرة ﻋﻦ ﺣﺠﻢ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ اﺳﺘﺮﺟﺎﻋﮭﺎ وھﺬا اﻟﻤﻌﻄﻰ ﻟﮫ‬
‫ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ . Binary_integer‬اﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ‪ offset‬ﻋﺒﺎرة ﻋﻦ اﻟﻤﻮﺿﻊ اﻟﺬي ﺳﯿﺒﺪأ اﻹﺟﺮاء اﻟﻘﺮاءة ﻣﻨﮫ‬
‫وھﻮ ﻣﻦ اﻟﻨﻮع ‪ . Integer‬اﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ ‪ Buffer‬ﻓﮭﻮ ﻋﺒﺎرة ﻋﻦ اﻟﻤﺘﻐﯿﺮ اﻟﺬي ﺳﯿﺘﻢ ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻨﺎﺗﺠﺔ ﻣﻦ‬
‫ھﺬا اﻹﺟﺮاء ﺑﮫ وھﺬا اﻟﻤﻌﻄﻰ ﯾﻤﻜﻦ أن ﯾﻜﻮن ﻣﻦ اﻟﻨﻮع ‪ Varchar2‬وذﻟﻚ ﻓﻲ ﺣﺎﻟﺔ أذا ﻛﺎن اﻟﻤﺆﺷﺮ ﯾﺸﯿﺮ إﻟﻰ ﻧﻮع‬
‫اﻟﺒﯿﺎﻧﺎت ‪ CLOB‬أو ﻣﻦ اﻟﻨﻮع ‪ Raw‬أذا ﻛﺎن اﻟﻤﺆﺷﺮ ﯾﺸﯿﺮ إﻟﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت ‪ BLOB‬ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل‬
‫اﺳﺘﺮﺟﺎع ﺑﯿﺎﻧﺎت ﻣﻮﻇﻒ ﻣﻌﯿﻦ ﻣﻦ اﻟﺠﺪول ‪ ex‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻛﻤﺎ ﻓﻲ اﻟﻜﻮد اﻟﺘﺎﻟﻲ ‪:‬‬
‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٨٤‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪1‬‬

‫‪2‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪7‬‬
‫‪8‬‬
‫‪9‬‬

‫‪10‬‬
‫‪11‬‬
‫‪12‬‬
‫‪13‬‬
‫‪14‬‬

‫‪15‬‬
‫‪16‬‬
‫‪17‬‬
‫‪18‬‬
‫‪19‬‬
‫‪20‬‬

‫‪21‬‬
‫‪22‬‬
‫‪23‬‬

‫ﺗﻮﺿﯿﺢ‬

‫ﯾﻌﻤﻞ ھﺬا اﻟﻜﻮد ﻋﻠﻰ اﺳﺘﺮﺟﺎع ﺑﯿﺎﻧﺎت ﻣﻮﻇﻒ ﻣﻌﯿﻦ ﻓﻲ اﻟﺠﺪول ‪ ex‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [1‬وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ ﺗﻤﺮﯾﺮ اﺳﻢ‬
‫اﻟﻤﻮﻇﻒ ﻛﻤﻌﻄﻰ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ وﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺘﻢ اﺧﺘﺒﺎر اﺳﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﯾﺘﻢ إدﺧﺎﻟﮫ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻛﻤﺎ ﻓﻲ‬
‫اﻟﺴﻄﺮ ]‪ [15‬ﻓﺈذا ﻛﺎن ﻣﺴﺎوي ﻟﻼﺳﻢ اﻟﻨﺎﺗﺞ ﻟﻠﻤ ﺆﺷﺮ ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [18‬وھﻮ‬
‫‪ DBMS_LOB.READ‬وذﻟﻚ ﻟﻘﺮاءة ﺑﯿﺎﻧﺎت ھﺬا اﻟﻤﻮﻇﻒ وﯾﺤﺘﻮي ھﺬا اﻹﺟﺮاء ﻋﻠﻰ أرﺑﻌﺔ ﻣﻌﻄﯿﺎت ‪:‬‬
‫اﻟﻤﻌﻄﻰ اﻷول ‪ Directions‬ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺆﺷﺮ ‪ Locator‬اﻟﺬي ﯾﺸﯿﺮ اﻟﻰ ﻣﻜﺎن اﻟﻘﺮاءة وھﻮ اﻟﻌﻤﻮد‬
‫‪ . Locator‬واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ‬ ‫‪emp_info‬‬ ‫‪ emp_info‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ‬
‫‪ amount‬وھﻮ ﻋﺒﺎرة ﻋﻦ ﺣﺠﻢ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻗﺮاءﺗﮭﺎ ﻣﻦ اﻟﻌﻤﻮد ‪ . emp_info‬واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ‪Offset‬‬
‫ﻋﺒﺎرة ﻋﻦ اﻟﻤﻮﺿﻊ اﻟﺬي ﺳﯿﺒﺪأ اﻹﺟﺮاء اﻟﻘﺮاءة ﻣﻨﮫ وھﻮ واﺣﺪ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ أي أﻧﮫ ﺳﺘﺒﺪأ ﻋﻤﻠﯿﺔ اﻟﻘﺮاءة ﺑﺪاﯾﺔ ﻣﻦ‬
‫اﻟﺤﺮف اﻷول ‪ .‬واﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ ‪ Out_Put‬ھﻮ ﻋﺒﺎرة ﻋﻦ اﻟﻤﺘﻐﯿﺮ اﻟﺬي ﺳﯿﺘﻢ ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻨﺎﺗﺠﺔ ﻣﻦ ھﺬه‬
‫اﻟﻮﻇﯿﻔﺔ ﺑﮫ ‪ .‬أﻣﺎ أذا ﻛﺎن اﻻﺳﻢ اﻟﺬي ﺗﻢ إدﺧﺎﻟﮫ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻏﯿﺮ ﻣﺴﺎوي ﻟﻼﺳﻢ اﻟﻤﺴﺘﺮﺟﻊ ﻟﻠﻤﺆﺷﺮ ﻧﻘﻮم‬
‫ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Goto‬ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ]‪ [20‬وذﻟﻚ ﻟﺘﻜﺮار ﻋﻤﻠﯿﺔ اﺳﺘﺨﻼص اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﻤﺆﺷﺮ وھﻜﺬا ‪.‬‬
‫ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻋﺮض اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﻇﻒ وﻟﯿﻜﻦ ‪ Alsaeedi‬ﻣﺜﻼً ﻓﻨﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٨٥‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Begin‬‬
‫;))'‪DBMS_Output.put_line(Read_func('Alsaeedi‬‬
‫‪End : /‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﺳﻢ اﻟﻤﻮﻇﻒ ‪ Alsaeedi‬ﻛﻤﻌﻄﻰ ﻟﻠﻮﻇﯿﻔﺔ ‪ Read_Function‬ﺛﻢ ﻋﺮض اﻟﻨﺎﺗﺞ ﻣﻦ ﺧﻼل اﻹﺟﺮاء‬
‫‪ Put_Line‬ﺛﻢ اﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح ‪ Enter‬ﯾﺘﻢ اﻟﻌﺮض اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻟﻤﻮﻇﻒ ‪.‬‬
‫************************************************‬
‫‪LOB‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ ﺣﺬف اﻟﺒﯿﺎﻧﺎت ‪ LOB‬وھﻨﺎك ﻃﺮﯾﻘﺘﯿﻦ ﻟﺤﺬف اﻟﺒﯿﺎﻧﺎت ‪: LOB‬‬
‫اﻟﻄﺮﯾﻘﺔ اﻷوﻟﻰ ‪ :‬ﻋﻦ ﻃﺮﯾﻖ ﺣﺬف اﻟﺼﻒ اﻟﻤﻮﺟﻮد ﺑﮫ اﻟﺒﯿﺎﻧﺎت ‪ LOB‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Delete‬ﻣﻦ ﺟﻤﻞ‬
‫ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪ . DML‬أﻣﺎ أذا أردﻧﺎ اﻟﺤﻔﺎظ ﻋﻠﻰ ﺑﯿﺎﻧﺎت اﻟﺼﻒ وﺣﺬف اﻟﺒﯿﺎﻧﺎت ‪ LOB‬ﻓﻘﻂ ﻓﺘﻘﻮم ﺑﺘﻌﺪﯾﻞ ﺑﯿﺎﻧﺎت‬
‫ھﺬا اﻟﺤﻘﻞ وذﻟﻚ أﻣﺎ ﺑﺘﻌﺪﯾﻞ ھﺬا اﻟﺤﻘﻞ إﻟﻰ اﻟﻘﯿﻤﺔ ‪ Null‬أو إﻟﻰ ﻧﺺ ﻓﺎرغ ‪ Empty string‬أو ﻋﺮض ﻃﺮﯾﻖ‬
‫اﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ ‪ empty C/BLOB‬ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﺣﺬف ﺟﻤﯿﻊ اﻟﻘﯿﻢ اﻟﻤﻮﺟﻮدة داﺧﻞ اﻟﻌﻤﻮد‬
‫‪ emp_info‬ﻓﻲ اﻟﺠﺪول ‪ ex‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد ‪:‬‬

‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺘﻌﯿﯿﻦ اﻟﻘﯿﻤﺔ اﻟﻨﺎﺗﺠﺔ ﻣﻦ اﻟﻮﻇﯿﻔﺔ ‪ empty_Clob‬إﻟﻰ اﻟﻌﻤﻮد ‪ emp_info‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ‬
‫‪. Update‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٨٦‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪‬‬ ‫‪Triggers         ‬‬ ‫‪‬‬

‫‪Triggers        ‬‬


‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻷﺟﺰاء اﻟﺴﺎﺑﻘﺔ ﻣﻦ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺘﻌﻠﯿﻤﺔ ﻋﻠﻰ ﻋﺪد ﻣﻦ أﻧﻮاع اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﻤﺴﺘﺨﺪﻣﺔ ﻓﻲ اﻟﻠﻐﺔ‬
‫‪Subprograms‬‬ ‫‪PL/SQL‬‬ ‫‪: PL/SQL‬‬
‫وﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺠﺰء ﻋﻠﻰ ﻧﻮع آﺧﺮ ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ وھﻮ ﻣﻦ أھﻢ أﻧﻮاﻋﮭﺎ وذﻟﻚ ﻟﻤﺎ ﻟﮫ ﻣﻦ ﻣﻤﯿﺰات‬
‫ﺧﺎﺻﺔ واﺳﺘﺨﺪاﻣﺎت ﻛﺜﯿﺮة اﻟﺘﺪاول ھﻮ اﻟﻤﻌﻄﯿﺎت ‪-: Triggers‬‬
‫ھﻮ ﻋﺒﺎرة ﻋﻦ ﻗﺎﻟﺐ ‪ BLOCK‬أو إﺟﺮاء ‪ Stored Procedure‬ﻣﺨﺰن ﻓﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وﺗﺴﺘﺨﺪم اﻟﻤﻄﻠﻘﺎت‬
‫‪ Triggers‬ﻟﻀﻤﺎن ﺗﻨﻔﯿﺬ إﺟﺮاء ﻣﻌﯿﻦ ﻋﻨﺪ وﻗﻮع ﺣﺪث ﻣﻌﯿﻦ ‪ Event‬ﻛﻤﺎ ﺗﺴﺘﺨﺪم أﯾﻀﺎً ﻟﺘﻌﻤﯿﻢ ﻋﻤﻠﯿﺔ ﻣﻌﯿﻨﺔ ﺑﺤﯿﺚ‬
‫ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ ﺣﺪوث ﻓﻌﻞ ﻣﻌﯿﻦ ﺑﻐﺾ اﻟﻨﻈﺮ ﻋﻦ اﻟﻤﺴﺘﺨﺪم أو اﻟﺘﻄﺒﯿﻖ اﻟﺬي ﻗﺎم ﺑﺈﺻﺪار ھﺬا اﻟﻔﻌﻞ ﻟﺬﻟﻚ ﯾﻤﻜﻦ‬
‫ﺗﻌﺮﯾﻒ اﻟﻤﻄﻠﻖ ﻋﻠﻰ أﻧﮫ إﺟﺮاء ‪ Procedure‬ﯾﺘﻢ ﺗﻨﻔﯿﺬه ﺗﻠﻘﺎﺋﯿﺎً ﻋﻨﺪ وﻗﻮع أﺣﺪاث ﻣﻌﯿﻨﺔ ‪ Events‬وﺗﻨﻘﺴﻢ اﻟﻤﻄﻠﻘﺎت‬
‫‪ Triggers‬إﻟﻰ ﻧﻮﻋﯿﻦ ‪- :‬‬
‫• ﻧﻮع ﺧﺎص ﺑﺎﻟﺘﻄﺒﯿﻘﺎت ‪ Application Trigger‬وﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﻄﻠﻘﺎت ﺗﻠﻘﺎﺋﯿﺎً ﻋﻨﺪ وﻗﻮع ﺣﺪث‬
‫ﻣﻌﯿﻦ ﻣﻦ أﺣﺪاث ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪ DML Events‬داﺧﻞ اﻟﺘﻄﺒﯿﻖ ‪. Application‬‬
‫• ﻧﻮع ﺧﺎص ﺑﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ Database Triggers‬ﯾﺘﻢ ﺗﻨﻔﯿﺬه ﺗﻠﻘﺎﺋﯿﺎً ﻋﻨﺪ وﻗﻮع ﺣﺪث ﻣﺮﺗﺒﻂ ﺑﺎﻟﺘﻌﺎﻣﻞ ﻣﻊ‬
‫اﻟﺒﯿﺎﻧﺎت ﻣﺜﻞ اﺳﺘﺨﺪام ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪ DML‬ﻣﻊ اﻟﺠﺪاول وذﻟﻚ ﻣﺜﻞ اﺳﺘﺨﺪام اﻟﺠﻤﻞ ‪، Insert - :‬‬
‫‪ Delete ، Update‬ﻹﺿﺎﻓﺔ وﺗﻌﺪﯾﻞ وﺣﺬف اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﺠﺪاول أو اﺳﺘﺨﺪام ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﻣﻊ‬
‫اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ ‪ Views‬وﺗﺴﻤﻰ اﻟﻤﻄﻠﻘﺎت ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺑﺎﻻﺳﻢ ‪ Instead of Triggers‬أو اﺳﺘﺨﺪام أﺣﺪ‬
‫اﻟﺠﻤﻞ ‪ DDL‬ﻣﺜﻞ اﻟﺠﻤﻞ ‪. Alter ، Create -:‬‬
‫ﻛﻤﺎ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻘﺎت ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ Data base Triggers‬ﺗﻠﻘﺎﺋﯿﺎً ﻋﻨﺪ ﺣﺪوث أﻓﻌﺎل ﻣﻌﯿﻨﺔ ﻣﻦ اﻟﻤﺴﺘﺨﺪم أو‬
‫ﺻﺪور أﻓﻌﺎل ﻣﻌﯿﻨﺔ ﻣﻦ ﻧﻈﺎم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ Data base system‬وذﻟﻚ ﻣﺜﻞ ﻗﯿﺎم اﻟﻤﺴﺘﺨﺪم ﺑﺎﻟﺪﺧﻮل ‪ Login‬اﻟﻰ‬
‫ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أو ﻗﯿﺎم ﻣﺪﯾﺮ اﻟﻨﻈﺎم ‪ DBA‬ﺑﻌﻤﻞ إﻏﻼق ‪ Shutdown‬ﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت وﯾﺠﺐ ﻣﻼﺣﻈﺔ أﻧﮫ ﯾﻤﻜﻦ‬
‫ﺗﻌﺮﯾﻒ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﻋﻠﻰ اﻟﺠﺪاول ‪ Tables‬واﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ‪ View‬ﻓﺈن اﻟﻤﻄﻠﻘﺎت ‪Instead of‬‬
‫‪ Trigger‬ﺗﻘﻮم ﺑﻮﺻﻒ اﻷﻓﻌﺎل اﻟﺘﻲ ﺳﻮف ﯾﺘﻢ ﺣﺪوﺛﮭﺎ وﻓﻲ ﺣﺎﻟﺔ أﺣﺘﻮاء ھﺬه اﻷﻓﻌﺎل ﻋﻠﻰ أي ﻋﻤﻠﯿﺎت ﻣﻌﺎﻟﺠﺔ‬
‫اﻟﺒﯿﺎﻧﺎت ‪ DML‬ﻋﻠﻰ اﻟﺠﺪاول اﻷﺳﺎﺳﯿﺔ ‪ Base Table‬ﻓﺈن ذﻟﻚ ﯾﻌﻤﻞ ﻋﻠﻰ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻘﺎت اﻟﻤﺮﺗﺒﻄﺔ ‪ trigger‬ﻓﻲ‬
‫ھﺬه اﻟﺠﺪاول وﯾﻤﻜﻦ ﺗﻄﺒﯿﻖ اﻟﻤﻄﻠﻘﺎت ‪ Database Triggers‬إﻟﻰ ‪-:‬‬
‫• ﻣﻄﻠﻘﺎت ﻧﻈﺎم ‪ System Triggers‬ﻣﺮﺗﺒﻄﺔ ﺑﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪. Data base‬‬
‫• ﻣﻄﻠﻘﺎت ﻧﻈﺎم ﻣﺮﺗﺒﻄﺔ ﺑﻤﺴﺘﺨﺪم ‪ Schema‬ﻣﻌﯿﻦ ‪.‬‬
‫ﻓﻔﻲ اﻟﻤﻄﻠﻘﺎت اﻟﻤﺮﺗﺒﻄﺔ ﺑﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Database‬ﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬه اﻟﻤﻄﻠﻘﺎت ﻟﻜﻞ ﺣﺪث ﻋﻨﺪ ﺟﻤﯿﻊ اﻟﻤﺴﺘﺨﺪﻣﯿﻦ ‪،‬‬
‫وﻓﻲ اﻟﻤﻄﻠﻘﺎت اﻟﻤﺮﺗﺒﻄﺔ ﺑﻤﺴﺘﺨﺪم ‪ Schema‬ﻣﻌﯿﻦ ﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬه اﻟﻤﻄﻠﻘﺎت ﻟﻜﻞ ﺣﺪث ﻋﻦ ھﺬا اﻟﻤﺴﺘﺨﺪم ﻓﻘﻂ‬
‫)ﻣﺴﺘﺨﺪم واﺣﺪ(‬
‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٨٧‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫وﻧﺬﻛﺮ ھﻨﺎ أﻧﮫ ﯾﺠﺐ ﻋﺪم اﺳﺘﺨﺪام اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﺑﻜﺜﺮة وذﻟﻚ ﺣﺘﻰ ﻻﯾﺼﺒﺢ اﻟﻜﻮد أﻛﺜﺮ ﺗﻌﻘﯿﺪاً ﻣﻦ ﺣﯿﺚ اﻋﺘﻤﺎد‬
‫اﻟﻌﻨﺎﺻﺮ ﻋﻠﻰ ﺑﻌﻀﮭﺎ اﻟﺒﻌﺾ ‪ Interdependencies‬ﻣﻤﺎ ﯾﺠﻌﻞ ﻋﻤﻠﯿﺔ ﺗﺤﺪﯾﺚ اﻟﺒﺮاﻣﺞ أﻛﺜﺮ ﺻﻌﻮﺑﺔً ﻋﻠﻰ اﻟﻤﺒﺮﻣﺠﯿﻦ‬
‫ﻛﻤﺎ ﯾﻤﻜﻦ إﻧﺸﺎء اﻹﺟﺮاءات ‪ Procedure‬واﺳﺘﺪﻋﺎءھﺎ داﺧﻞ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﻟﺘﻘﻠﯿﻞ ﺣﺠﻢ اﻻﻛﻮاد ﺑﮭﺎ ‪.‬‬
‫*****************************************************‬
‫‪Triggers    ‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ اﻟﻤﻜﻮﻧﺎت اﻟﺮﺋﯿﺴﯿﺔ ﻟﻠﻤﻄﻠﻘﺎت ‪ Triggers‬وأول ھﺬه اﻟﻤﻜﻮﻧﺎت اﻟﻤﻜﻮن اﻟﺨﺎص‬
‫ﺑﺘﺤﺪﯾﺪ وﻗﻒ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ‪ Trigger Timing‬وﯾﻌﻤﻞ ھﺬا اﻟﻤﻜﻮن ﻋﻠﻰ ﺗﺤﺪﯾﺪ اﻟﺰﻣﻦ اﻟﺬي ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻓﯿﮫ‬
‫وﯾﻤﻜﻦ أن ﯾﺤﺘﻮي ھﺬا اﻟﻤﻜﻮن ﻋﻠﻰ أﺣﺪ ﺛﻼث ﺧﺼﺎﺋﺺ وھﻲ ‪-:‬‬
‫‪Instead Of، After ، Before‬‬
‫ﻓﻌﻨﺪ اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ ‪ Before‬ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻜﻮد اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﺠﺰء ‪ Trigger body‬ﻗﺒﻞ وﻗﻮع اﻟﺤﺪث اﻟﺨﺎص‬
‫ﺑﺠﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪ DML Event‬ﻋﻠﻰ اﻟﺠﺪول وﯾﺘﻢ اﺳﺘﺨﺪام ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﻄﻠﻘﺎت ﻓﻲ اﻟﻤﻮاﻗﻒ اﻟﺘﺎﻟﯿﺔ‪:‬‬
‫• ﻟﻔﺤﺺ اﻟﺠﻤﻠﺔ اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ‪ Trigger‬ھﻞ ﺳﯿﺘﻢ إﻛﻤﺎل ﺗﻨﻔﯿﺬھﺎ أم ﻻ ‪.‬‬
‫• ﻟﻤﻌﺮﻓﺔ ﻗﯿﻢ اﻷﻋﻤﺪة ﻗﺒﻞ ﺗﻨﻔﯿﺬ أي ﺟﻤﻠﺔ ﻣﻦ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﻋﻠﯿﮭﺎ ‪.‬‬
‫• ﻟﺘﺠﮭﯿﺰ ووﺿﻊ اﻟﻘﯿﻢ اﻻﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﺘﻐﯿﺮات اﻟﻌﺎﻣﺔ ‪. Global Variable‬‬
‫وﻋﻨﺪ اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ ‪ After‬ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻜﻮد اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﺠﺰء ‪ Trigger body‬ﺑﻌﺪ وﻗﻮع اﻟﺤﺪث اﻟﺨﺎص‬
‫ﺑﺠﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪ DML Event‬ﻋﻠﻰ اﻟﺠﺪول وﯾﺘﻢ اﺳﺘﺨﺪام ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﻄﻠﻘﺎت ‪-:‬‬
‫• ﻹﺗﻤﺎم اﻟﺠﻤﻠﺔ اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ‪ trigger‬ﻗﺒﻞ ﺗﻨﻔﯿﺬ اﻟﻜﻮد اﻟﻤﻮﺟﻮد ﺑﺎﻟﺠﺰء ‪. Trigger body‬‬
‫• ﻹﺟﺮاء ﻋﺪد ﻣﻦ اﻷﻋﻤﺎل اﻟﻤﺨﺘﻠﻔﺔ ﻋﻨﺪ ﺣﺪوث ﺟﻤﻠﺔ واﺣﺪة ﻣﻦ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪.‬‬
‫وﻋﻨﺪ اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ ‪ Instead Of‬ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻜﻮد اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﺠﺰء ‪ Trigger Body‬ﺑﺪﻻ ﻣﻦ اﻟﺠﻤﻠﺔ اﻟﻤﺴﺒﺒﺔ‬
‫ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ‪ Trigger‬وﺗﺴﺘﺨﺪم ھﺬه اﻟﻄﺮﯾﻘﺔ ﻋﺎدةً ﻣﻊ اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ ‪ Views‬ﻏﯿﺮ ﻗﺎﺑﻠﺔ ﻟﻠﺘﻌﺪﯾﻞ أو إﺟﺮاء‬
‫ﻋﻤﻠﯿﺔ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﻋﻠﯿﮭﺎ ‪.‬‬
‫أﻣﺎ ﺛﺎﻧﻲ ﻣﻜﻮن ﻣﻦ ﻣﻜﻮﻧﺎت اﻟﻤﻄﻠﻘﺎت ھﻮ اﻟﺤﺪث اﻟﻤﺴﺒﺐ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ‪ Trigger Event‬وﯾﻌﻤﻞ ھﺬا اﻟﻤﻜﻮن ﻋﻠﻰ‬
‫ﺗﺤﺪﯾﺪ ﻧﻮع اﻟﺠﻤﻠﺔ اﻟﺘﻲ ﺳﯿﺘﻢ ﺑﻤﻘﺘﻀﺎھﺎ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ‪ Trigger‬وھﻲ أﺣﺪى ﺛﻼث ﺟﻤﻞ ‪:‬‬
‫‪Delete ،‬‬ ‫‪Update‬‬ ‫‪،‬‬ ‫‪Insert‬‬
‫وﻓﻲ ﺣﺎﻟﺔ أن اﻟﺠﻤﻠﺔ اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ھﻲ اﻟﺠﻤﻠﺔ ‪ Update‬ﯾﻤﻜﻦ ﺗﺤﺪﯾﺪ ﻗﺎﺋﻤﺔ اﻷﻋﻤﺪة اﻟﺘﻲ ﯾﺠﺐ ﺗﻌﺪﯾﻠﮭﺎ ﻟﻜﻲ‬
‫ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ وﯾﺠﺐ ﻣﻼﺣﻈﺔ أﻧﮫ ﻻ ﯾﺘﻢ ﺗﺤﺪﯾﺪ ﻗﺎﺋﻤﺔ ﺑﺎﻷﻋﻤﺪة ﻓﻲ ﺣﺎﻟﺔ اﺳﺘﺨﺪام اﻟﺠﻤﻞ ‪ Delete ، insert‬وذﻟﻚ‬
‫ﻷن ﺗﺄﺛﯿﺮ ھﺬه اﻟﺠﻤﻞ ﯾﻜﻮن ﻋﻠﻰ اﻟﺼﻒ ﺑﺎﻟﻜﺎﻣﻞ وﯾﻤﻜﻦ أن ﺗﺤﺘﻮي اﻟﺤﺪث اﻟﻤﺴﺒﺐ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﻠﻰ ﺟﻤﻠﺔ واﺣﺪة ﻣﻦ‬
‫ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت وھﻲ ‪ insert‬أو ‪ Update‬أو ‪ Delete‬أو ﺟﻤﻠﺘﯿﻦ أو ﺟﻤﯿﻊ ھﺬه اﻟﺠﻤﻞ ‪.‬‬
‫أﻣﺎ اﻟﻤﻜﻮن اﻟﺜﺎﻟﺚ ھﻮ ﻧﻮع اﻟﻤﻄﻠﻖ ‪ Trigger Type‬وﯾﻌﻤﻞ ھﺬا اﻟﻤﻜﻮن ﻋﻠﻰ ﺗﺤﺪﯾﺪ ﻋﺪد ﻣﺮات ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ‬
‫‪ Trigger‬وھﻮ أﺣﺪى اﻟﻨﻮﻋﯿﻦ ‪ Row -:‬أو ‪. Statement‬‬
‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٨٨‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻓﻔﻲ اﻟﻨﻮع ‪ Row‬ﯾﺘﻢ ﺗﻨﻔﯿﺬ ﻛﻮد اﻟﻤﻄﻠﻖ ‪ Trigger body‬ﻋﺪد ﻣﻦ اﻟﻤﺮات ﻣﺴﺎوي ﻟﻌﺪد اﻟﺼﻔﻮف اﻟﺘﻲ ﺗﺄﺛﺮت ﺑﺎﻟﺠﻤﻠﺔ‬
‫اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ‪ .‬أﻣﺎ ﻓﻲ اﻟﻨﻮع ‪ Statement‬ﯾﺘﻢ ﺗﻨﻔﯿﺬ ﻛﻮد اﻟﻤﻄﻠﻖ ﻣﺮة واﺣﺪة ﻓﻘﻂ ﺑﻐﺾ اﻟﻨﻈﺮ ﻋﻦ ﻋﺪد‬
‫اﻟﺼﻔﻮف اﻟﺬي ﺗﻢ ﻣﻌﺎﻟﺠﺘﮭﺎ ‪.‬‬
‫أﻣﺎ اﻟﻤﻜﻮن اﻷﺧﯿﺮ ﻣﻦ ﻣﻜﻮﻧﺎت اﻟﻤﻄﻠﻖ ھﻮ ﺟﺴﻢ اﻟﻤﻄﻠﻖ ‪ Trigger body‬وﯾﺤﺘﻮي ھﺬا اﻟﺠﺰء ﻋﻠﻰ اﻹﺟﺮاءات‬
‫واﻟﻌﻤﻠﯿﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻣﻦ ﺧﻼل ھﺬا اﻟﻤﻄﻠﻖ ﯾﻤﻜﻦ أن ﯾﺤﺘﻮي ﻛﻮد اﻟﻤﻄﻠﻖ ‪ Trigger‬ﻋﻠﻰ ﺟﻤﻞ ‪ SQL‬أو‬
‫ﻋﻨﺎﺻﺮ ﻣﻦ اﻟﻠﻐﺔ ‪ PL/SQL‬ﻣﺜﻞ ‪:‬‬
‫اﻟﻤﺘﻐﯿﺮات ‪Variables‬‬
‫اﻟﻤﺆﺷﺮات ‪Cursors‬‬
‫اﻻﺳﺘﺜﻨﺎءات ‪Exceptions‬‬
‫ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ اﺳﺘﺪﻋﺎء إﺟﺮاء ‪ PL/SQL Procedure‬أو ‪ Java Procedure‬داﺧﻞ ھﺬا اﻟﺠﺰء ‪..‬‬
‫****************************************‬
‫‪Triggers   ‬‬
‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ ﻋﻠﻰ ﻣﻜﻮﻧﺎت اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬وﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ أﻧﺸﺎء‬
‫اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬وﻹﻧﺸﺎء اﻟﻤﻄﻠﻘﺎت ﻧﺴﺘﺨﺪم اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ ‪:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ ‪ Create [Or Replace] Trigger‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ ‪ Trigger_name‬ﺛﻢ اﻟﻌﺒﺎرة‬
‫‪ timing‬اﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻟﻮﻗﺖ اﻟﺬي ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻓﯿﮫ وھﻮ أﻣﺎ ‪ Before‬أو ‪ After‬ﺛﻢ اﻟﻜﻠﻤﺎت ‪Event[Or‬‬
‫]‪ event2 Or event3‬واﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻟﺠﻤﻞ اﻟﺘﻲ ﺗﺆدي إﻟﻰ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ وھﻲ أﺣﺪ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪-:‬‬
‫‪ Insert‬أو ‪ Update‬أو ‪ Delete‬ﯾﻠﯿﮭﺎ اﻟﻌﺒﺎرة ‪ On‬ﺛﻢ اﺳﻢ اﻟﺠﺪول ‪ table_name‬أو اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ‬
‫‪ view_name‬ﯾﻠﯿﮫ اﻟﺠﺰء اﻟﺨﺎص ﺑﻜﻮد ھﺬا اﻟﻤﻄﻠﻖ وﯾﺤﺘﻮي ھﺬا اﻟﺠﺰء ﻋﻠﻰ اﻟﻌﻤﻠﯿﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ ﺗﻨﻔﯿﺬ‬
‫أﺣﺪ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت اﻟﺬي ﺗﻢ ﺗﺤﺪﯾﺪھﺎ ﺳﺎﺑﻘﺎً وھﻮ ﻋﺒﺎرة ﻋﻦ ﻗﺎﻟﺐ ‪ PL/SQL‬وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ أﻧﮫ ﯾﻤﻜﻦ‬
‫اﺳﺘﺪﻋﺎء إﺟﺮاء ﺧﺎرﺟﻲ داﺧﻞ ھﺬا اﻟﺠﺰء وﻋﻨﺪ اﺧﺘﯿﺎرﻧﺎ اﻻﺳﻢ اﻟﻤﻄﻠﻖ ‪ Trigger‬ﯾﺠﺐ ﻋﺪم اﺳﺘﺨﺪام ھﺬا اﻻﺳﻢ ﻣﻦ‬
‫ﻗﺒﻞ ‪ Trigger_name‬ﺑﻤﻌﻨﻰ أﻧﮫ ﻻﯾﻤﻜﻦ أن ﯾﻜﻮن ھﻨﺎك أﻛﺜﺮ ﻣﻦ ‪ Trigger‬ﻟﮫ ﻧﻔﺲ اﻻﺳﻢ ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ‬
‫اﻟﻤﺜﺎل أﻧﺸﺎء ‪ Trigger‬ﯾﺘﻢ ﺗﻨﻔﯿﺬه ﺗﻠﻘﺎﺋﯿﺎً ﻋﻨﺪ إﺟﺮاء ﻋﻤﻠﯿﺔ إﺿﺎﻓﺔ ﻓﻲ اﻟﺠﺪول اﻟﻤﻮﻇﻔﯿﻦ ‪ employees‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ‬
‫ھﺬا اﻟﻜﻮد ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٨٩‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﻜﺘﺎﺑﺔ اﻟﺠﻤﻠﺔ ‪ Create Or Replace Trigger‬ﺛﻢ اﺳﻢ اﻟﻤﻄﻠﻖ ‪ Secure_emp‬ﺛﻢ اﻟﺨﺎﺻﯿﺔ‬
‫‪ Before‬واﻟﺘﻲ ﯾﺘﻢ ﻣﻦ ﺧﻼﻟﮭﺎ ﺗﺤﺪﯾﺪ وﻗﺖ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﺣﯿﺚ ﺗﻌﻤﻞ ھﺬه اﻟﺨﺎﺻﯿﺔ ﻋﻠﻰ ﺗﻨﻔﯿﺬ اﻟﻜﻮد اﻟﺨﺎص ﺑﺎﻟﻤﻄﻠﻖ‬
‫ﻗﺒﻞ ﺗﻨﻔﯿﺬ اﻟﺠﻤﻠﺔ اﻟﺨﺎﺻﺔ ﺑﻤﻌﺎﻟﺠﺔ ﺑﯿﺎﻧﺎت اﻟﺠﺪول ﯾﻠﯿﮭﺎ اﻟﺠﻤﻠﺔ ‪ Insert On‬وھﻲ اﻟﺠﻤﻠﺔ اﻟﺘﻲ ﺗﺆدي إﻟﻰ ﺗﻨﻔﯿﺬ‬
‫اﻟﻤﻄﻠﻖ وھﻲ ﺟﻤﻠﺔ ‪ insert‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﯾﻠﯿﮫ اﺳﻢ اﻟﺠﺪول اﻟﺬي ﻧﺮﯾﺪ اﻟﺘﻄﺒﯿﻖ ھﺬا اﻹﺟﺮاء ﻋﻠﯿﮫ وھﻮ‬
‫‪ employees‬ﺛﻢ اﻟﻜﻮد اﻟﺨﺎص ﺑﺎﻟﻤﻄﻠﻖ ﻣﻦ ‪ Begin‬إﻟﻰ ‪ End‬وھﻮ ﻋﺒﺎرة ﻋﻦ ﺟﻤﻠﺔ ﺷﺮﻃﯿﺔ ﺗﻘﻮم ﺑﺎﺧﺘﺒﺎر اﻟﺘﻮﻗﯿﺖ‬
‫اﻟﺤﺎﻟﻲ ﻗﺒﻞ إﺿﺎﻓﺔ أي ﺳﺠﻞ ﻓﻲ اﻟﺠﺪول ‪ Employees‬ﻓﺈذا ﻛﺎن ھﺬا اﻟﺘﻮﻗﯿﺖ أي ﺗﻮﻗﯿﺖ آﺧﺮ ﺧﻼف ﺗﻮﻗﯿﺖ اﻟﻌﻤﻞ‬
‫ﯾﻘﻮم اﻟﺒﺮﻧﺎﻣﺞ ﺑﻤﻨﻊ ﻋﻤﻠﯿﺔ اﻹﺿﺎﻓﺔ وإﻇﮭﺎر رﺳﺎﻟﺔ اﻟﺨﻄﺄ ‪ .‬وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ أﻧﮫ ﯾﻤﻜﻨﻨﺎ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﺑﻨﺎءً ﻋﻠﻰ‬
‫أﻛﺜﺮ ﻣﻦ ﺟﻤﻠﺔ ﻣﻦ ﺟﻤﻞ اﻟﻤﺴﺒﺒﺔ ﻓﻲ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ اﻟﺴﺎﺑﻖ ﻋﻨﺪ إﺟﺮاء‬
‫ﻋﻤﻠﯿﺔ اﻹﺿﺎﻓﺔ ‪ Insert‬أو اﻟﺘﻌﺪﯾﻞ ‪ Update‬أو اﻟﺤﺬف ‪ Delete‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد ‪:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩٠‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬا اﻟﻜﻮد اﻟﺨﺎص ﺑﮭﺬا اﻟﻤﻄﻠﻖ ﻓﻲ ﺣﺎﻟﺔ ﻗﯿﺎم أﺣﺪ اﻟﻤﺴﺘﺨﺪﻣﯿﻦ ﺑﺈﺟﺮاء ﻋﻤﻠﯿﺔ اﻹﺿﺎﻓﺔ ‪ Insert‬أو‬
‫اﻟﺘﻌﺪﯾﻞ ‪ Update‬أو اﻟﺤﺬف ‪ Delete‬ﻟﺒﯿﺎﻧﺎت اﻟﺠﺪول ‪. Employees‬‬
‫***************************************************‬
‫‪DML Row    ‬‬
‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪروس اﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ أﻧﻮاع اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬وذﻛﺮﻧﺎ أن اﻟﻤﻄﻠﻖ ﯾﻨﻘﺴﻢ إﻟﻰ ﻧﻮﻋﯿﻦ‪-:‬‬
‫ٌ‪Row Triggers‬‬
‫‪Statement‬‬
‫وﻓﻲ ھﺬا اﻟﺪرس ﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﻧﺸﺎء اﻟﻨﻮع ‪ Row Triggers‬وﻹﻧﺸﺎء ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﻄﻠﻘﺎت ﻧﻘﻮم‬
‫ﺑﺎﺳﺘﺨﺪام اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪-:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ ‪ Create (or Replace)Trigger‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ ‪ Trigger_name‬ﺛﻢ اﻟﻜﻠﻤﺔ‬
‫‪timing‬واﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ وﻗﻒ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ وھﻲ أﻣﺎ ‪before‬أو ‪ After‬ﺛﻢ اﻟﻜﻠﻤﺎت ‪Event (or event or‬‬
‫)‪ ….‬واﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻟﺠﻤﻞ اﻟﺘﻲ ﺗﺆدي إﻟﻰ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﺛﻢ اﻟﻌﺒﺎرة ‪ ON‬ﯾﻠﯿﮫ اﺳﻢ اﻟﺠﺪول ‪ table_Name‬أو‬
‫اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ﺛﻢ ھﺬه اﻟﺠﻤﻠﺔ ‪-:‬‬
‫]‪[Referencing old As old_name / New AS new_name‬‬
‫وﺗﺴﻤﺢ ھﺬه اﻟﺠﻤﻠﺔ ﺑﺘﻐﯿﯿﺮ اﻷﺳﻤﺎء اﻻﻓﺘﺮاﺿﯿﺔ ﻟﻠﻘﯿﻢ اﻟﻤﻮﺟﻮدة ﺑﺎﻟﻔﻌﻞ و اﻟﻘﯿﻢ اﻟﺤﺪﯾﺜﺔ اﻟﺘﻲ ﺳﯿﺘﻢ إدﺧﺎﻟﮭﺎ أو‬
‫اﺳﺘﺮﺟﺎﻋﮭﺎ ﻣﻦ ﺻﻔﻮف اﻟﺠﺪول اﻟﺘﻲ ﺳﯿﺘﻢ ﻣﻌﺎﻟﺠﺘﮭﺎ ﺑﮭﺬا اﻟﻤﻄﻠﻖ وھﺬه اﻟﺠﻤﻠﺔ اﺧﺘﯿﺎرﯾﮫ ‪ optional‬ﯾﻠﯿﮭﺎ اﻟﺠﻤﻠﺔ‬
‫‪ For each Row‬وﺗﻌﻤﻞ ھﺬه اﻟﺠﻤﻠﺔ ﻋﻠﻰ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﺪدا ﻣﻦ اﻟﻤﺮات ﻣﺴﺎوي ﻟﻌﺪد ﺻﻔﻮف اﻟﺠﺪول اﻟﺘﻲ ﯾﺘﻢ‬
‫ﻣﻌﺎﻟﺠﺘﮭﺎ ﻋﻦ ﻃﺮﯾﻖ ﺟﻤﻠﮫ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﺛﻢ اﻟﺠﻤﻠﺔ ‪ When‬اﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ ﺗﻘﯿﯿﺪ اﻟﻤﻄﻠﻖ ‪ Trigger‬ﺑﻌﺪدا ًﻣﻦ‬
‫اﻟﺸﺮوط وﻓﻲ ﺣﺎﻟﺔ ﺻﺤﺔ ھﺬه اﻟﺸﺮوط ﯾﺘﻢ ﺗﻨﻔﯿﺬ أﻛﻮاد اﻟﻤﻄﻠﻖ ‪ Trigger_body‬وﻓﻲ ﺣﺎﻟﺔ ﻋﺪم ﺻﺤﺔ ھﺬه‬
‫اﻟﺸﺮوط ﻻ ﯾﺘﻢ ﺗﻨﻔﯿﺬ أﻛﻮاد اﻟﻤﻄﻠﻖ ‪Trigger_body‬وھﺬه اﻟﺠﻤﻠﺔ ﺟﻤﻠﺔ اﺧﺘﯿﺎرﯾﮫ أﯾﻀﺎ ﺛﻢ اﻟﻜﻮد اﻟﺨﺎص ﺑﮭﺬا‬
‫اﻟﻤﻄﻠﻖ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩١‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫وﻟﻔﮭﻢ ھﺬه اﻟﺼﯿﻐﺔ ﻧﻘﻮم ﺑﺈﻧﺸﺎء اﻟﻤﻄﻠﻖ ﻛﻤﺎ ﯾﻠﻲ‪-:‬‬

‫ﺣﯿﺚ ﯾﻘﻮم ﺑﺘﻌﺪﯾﻞ اﻟﻌﻤﻮد ‪ Current_job_id‬ﻓﻲ اﻟﺠﺪول ‪ employee_history‬ﻓﻲ ﺣﺎﻟﺔ ﺗﻌﺪﯾﻞ اﻟﻌﻤﻮد‬
‫‪job_id‬ﻓﻲ اﻟﺠﺪول ‪ employees‬وﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪After Update of‬ﻟﺘﻨﻔﯿﺬ ھﺬا اﻟﻤﻄﻠﻖ ﺑﻌﺪ‬
‫إﺟﺮاء أي ﺗﻌﺪﯾﻞ ﻋﻠﻰ ﺑﯿﺎﻧﺎت اﻟﻌﻤﻮد ‪ job_id‬وذاﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ Update‬ﺛﻢ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﺠﻤﻠﺔ ‪ On‬ﯾﻠﯿﮭﺎ‬
‫اﻟﻜﻠﻤﺔ ‪ employees‬وذﻟﻚ ﻟﺘﺤﺪﯾﺪ اﺳﻢ اﻟﺠﺪول ﺛﻢ اﻟﺠﻤﻠﺔ ‪ Referencing‬ﻟﺘﻐﯿﯿﺮ أﺳﻤﺎء اﻟﻤﺘﻐﯿﺮات ‪ OLD‬و‬
‫‪ New‬ﺑﺎ ﻷﺳﻤﺎء ‪ New-value‬و ‪ old-value‬واﻟﺘﻲ ﺗﺴﺘﺨﺪم ﻛﺄﻋﻤﺪة وھﻤﯿﮫ ﺗﺴﺘﺨﺪم ﻟﺘﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة‬
‫ﺑﺎﻟﻔﻌﻞ ﺑﺎﻟﺠﺪول واﻟﻘﯿﻢ اﻟﺘﻲ ﺳﯿﺘﻢ أﺿﺎﻓﺘﮭﺎ أو ﺗﻌﺪﯾﻠﮭﺎ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﺛﻢ اﻟﺠﻤﻠﺔ ‪ For each Row‬واﻟﺘﻲ ﺗﺸﯿﺮ‬
‫إﻟﻰ أن ھﺬا اﻟﻤﻄﻠﻖ ﺳﯿﺘﻢ ﺗﻜﺮار ﺗﻨﻔﯿﺬه ﻋﺪدا ﻣﻦ اﻟﻤﺮات ﻣﺴﺎوي ﻟﻌﺪد اﻟﺼﻔﻮف اﻟﺘﻲ ﺳﻮف ﯾﺘﻢ ﺗﻌﺪﯾﻠﮭﺎ ﺑﺎﺳﺘﺨﺪام‬
‫اﻟﺠﻤﻠﺔ ‪ Update‬وﻗﺪ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ when‬ﻟﺘﺤﺪﯾﺪ اﻟﺸﺮوط اﻟﺬي ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻜﻮد اﻟﺨﺎص ﺑﺎﻟﻤﻄﻠﻖ ﺑﻨﺎ ءً‬
‫ﻋﻠﯿﮫ وھﻮ ﻓﻲ ھﺬا اﻟﺤﺎﻟﺔ ﻋﺪم ﺗﺴﺎوي اﻟﻘﯿﻢ اﻟﻤﻮﺟﻮدة ﺑﺎﻟﻔﻌﻞ ﺑﺎﻟﺠﺪول ﺑﺎﻟﻘﯿﻢ اﻟﺠﺪﯾﺪة اﻟﺘﻲ ﺳﯿﺘﻢ إدﺧﺎﻟﮭﺎ وﻓﻲ ﺣﺎﻟﺔ‬
‫ﺻﺤﺔ ھﺬه اﻟﺸﺮوط ﯾﺘﻢ ﺗﻨﻔﯿﺬ ﻛﻮد اﻟﻤﻄﻠﻖ ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩٢‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Instead OF     ‬‬

‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻧﻮع آﺧﺮ ﻣﻦ أﻧﻮاع اﻟﻤﻄﻠﻘﺎت ‪Triggers‬وھﺬا اﻟﻨﻮع ‪Instead of Trigger‬‬
‫وﺗﻌﺘﺒﺮ ھﺬا اﻟﻨﻮع أ ﺣﺪ أﻧﻮاع اﻹﺟﺮاءات ‪ Row Triggers‬وﯾﺴﺘﺨﺪم ھﺬا اﻟﻨﻮع ﻟﻤﻌﺎﻟﺠﺔ اﻟﺠﺪاول اﻷﺳﺎﺳﯿﺔ ‪Base‬‬
‫‪ Table‬ﻣﻦ ﺧﻼل اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ ‪ Views‬ﺣﯿﺚ ﯾﻌﻤﻞ ھﺬا اﻟﻤﻄﻠﻖ ﻋﻠﻰ اﺳﺘﺒﺪال ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺮاد‬
‫ﺗﻨﻔﯿﺬھﺎ ﻋﻠﻰ اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ ﺑﻌﻤﻠﯿﺎت أﺧﺮى ﺗﺤﺪد ﺑﺎﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻟﻤﻄﻠﻖ وﺗﻜﻮن ھﺬه اﻟﺠﻤﻠﺔ ھﻲ اﻟﻤﺴﺒﺒﺔ‬
‫ﻟﺘﻨﻔﯿﺬ ھﺬا اﻟﻤﻄﻠﻖ وﻹﻧﺸﺎء ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﻄﻠﻘﺎت ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ‪-:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ )‪ Create (or Replace‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ ‪ Trigger_name‬ﺛﻢ اﻟﺠﻤﻠﺔ ‪Instead‬‬
‫‪ of‬ﯾﻠﯿﮭﺎ ﺟﻤﻠﮫ ﻣﻌﺎﻟﺠﮫ اﻟﺒﯿﺎﻧﺎت ‪ Operation‬اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ ھﺬا اﻟﻤﻄﻠﻖ وﻷن ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﻄﻠﻘﺎت ﯾﺨﺘﻠﻒ ﻋﻦ‬
‫ﺑﺎﻗﻲ اﻷﻧﻮاع اﻟﺴﺎﺑﻘﺔ ﻣﻦ ﺣﯿﺚ ﻃﺮﯾﻘﺔ اﻟﻌﻤﻞ ﻓﺎﻧﮫ ﻻﯾﺘﻢ ﺗﺤﺪﯾﺪ زﻣﻦ اﻟﺘﻨﻔﯿﺬ ﻋﻨﺪ إﻧﺸﺎءه ﺳﻮاء ﻛﺎن ‪Before event‬‬
‫أو ‪ After event‬ﻗﺒﻞ اﻟﺤﺪث أو ﺑﻌﺪ اﻟﺤﺪث ﺣﯿﺚ ﻻﯾﻘﻮم ھﺬا اﻟﻨﻮع ﺑﺘﻨﻔﯿﺬ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﮫ ﻋﻨﺪ وﻗﻮع أي ﺟﻤﻠﮫ‬
‫ﻣﻦ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﻋﻠﻰ اﻟﺠﺪول وﻟﻜﻦ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﮫ ﺑﺪﻻ ﻣﻦ ﺟﻤﻠﺔ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺴﺒﺒﺔ‬
‫ﻟﺘﻨﻔﯿﺬه وﺗﻌﺒﺮ اﻟﻜﻠﻤﺔ ‪operation‬ﻋﻦ اﺧﺬ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻣﺜﻞ ‪-:‬‬
‫‪Delete ,Update‬‬ ‫‪,Insert‬‬
‫ﺛﻢ اﻟﻜﻠﻤﺔ ‪ ON‬ﯾﻠﯿﮫ اﺳﻢ اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ‪ View name‬ﺛﻢ اﻟﺠﻤﻠﺔ ‪ For each Row‬واﻟﺘﻲ ﺗﺸﯿﺮ ﻋﻠﻰ إن ھﺬا‬
‫اﻟﻤﻄﻠﻖ ﺳﻮف ﯾﺘﻢ ﺗﻜﺮار ﺗﻨﻔﯿﺬه ﻓﻲ ﻛﻞ ﻣﺮه ﯾﺘﻢ ﺗﻌﺪﯾﻞ ﺻﻒ ﻣﻦ ﺻﻔﻮف اﻟﺠﺪول وﻧﺬﻛﺮ ھﻨﺎ إن ھﺬا اﻟﻨﻮع ﻣﻦ‬
‫اﻟﻤﻄﻠﻘﺎت ﯾﻜﻮن داﺋﻤﺎ ﻣﻦ اﻟﻨﻮع ‪ Row Triggers‬ﺣﺘﻰ إذا ﺗﻢ ﺗﺠﺎھﻞ ﻛﺘﺎﺑﺔ ھﺬه اﻟﺠﻤﻠﺔ ‪ For each Row‬ﯾﻠﻲ‬
‫ھﺬه اﻟﺠﻤﻠﺔ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻄﻠﻖ ‪ .‬ﻓﺈذا أردﻧﺎ ذﻟﻚ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻋﻨﺪ ﻣﺤﺎوﻟﺔ إﺿﺎﻓﺔ ﺑﯿﺎﻧﺎت ﻟﻠﺠﺪول اﻟﺘﺨﯿﻠﻲ‬
‫‪ emp_Details‬واﻟﻤﺒﻨﯿﺔ ﻋﻠﻰ اﻟﺠﺪاول ‪ New_emp ,New_dept‬إﺿﺎﻓﺔ اﻟﻘﯿﻢ ‪-:‬‬
‫‪ New_emp‬ﺗﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﻜﻮد اﻟﺘﺎﻟﻲ ‪-:‬‬ ‫ﻓﻲ اﻟﺠﺪول‬ ‫‪Ename , job‬‬ ‫‪,sal‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩٣‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫****************************************************‬
‫‪Triggers Procedures‬‬

‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﺑﻌﺾ اﻟﻔﺮوق اﻟﮭﺎﻣﺔ ﺑﯿﻦ اﻹﺟﺮاءات واﻟﻤﻄﻠﻘﺎت ﺣﯿﺚ ﯾﺘﻢ ﺗﺨﺰﯾﻦ اﻟﻤﻄﻠﻘﺎت‬
‫‪ Triggers‬ﺑﻌﺪ إﻧﺸﺎءھﺎ ﻣﺒﺎﺷﺮةً ﻓﻲ اﻟﺠﺪول ‪ User-Triggers‬اﻟﻤﻮﺟﻮد ﻓﻲ ﻗﺎﻣﻮس ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺑﯿﻨﻤﺎ ﯾﺘﻢ‬
‫ﺗﺨﺰﯾﻦ اﻹﺟﺮاءات ‪ Stored_procedure‬ﻓﻲ اﻟﺠﺪول ‪ User_source‬أﻣﺎ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻄﺮﯾﻘﺔ اﻟﺘﻨﻔﯿﺬ ﻓﯿﺘﻢ ﺗﻨﻔﯿﺬ‬
‫اﻹﺟﺮاءات ‪ Procedure‬ﺑﺼﻔﮫ ﻣﺴﺘﻘﻠﺔ ﻋﻦ ﻃﺮﯾﻖ اﺳﺘﺪﻋﺎﺋﮭﺎ ‪Calling Procedure‬أو اﺳﺘﺨﺪام اﻷﻣﺮ‬
‫‪execute‬ﺑﯿﻨﻤﺎ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﺗﻠﻘﺎﺋﯿﺎ ﺑﻤﺠﺮد وﻗﻮع ﺣﺪث ﻣﻌﯿﻦ ‪ events‬ﻣﺜﻞ إﺿﺎﻓﺔ ﺑﻌﺾ‬
‫اﻟﺒﯿﺎﻧﺎت ﻓﻲ ﺟﺪول ﻣﻌﯿﻦ أو ﺣﺬﻓﮭﺎ وھﻜﺬا!!!!!‬
‫وﻣﻦ اﻟﻔﺮوق اﻟﮭﺎﻣﺔ أﯾﻀﺎ اﻧﮫ ﯾﻤﻜﻦ اﺳﺘﺨﺪام ﻛﻼ ﻣﻦ اﻟﺠﻤﻞ ‪-:‬‬
‫‪Commit , savepoint , Rollback‬‬
‫داﺧﻞ اﻹﺟﺮاءات ‪. Procedures‬‬
‫ﻋﻠﻰ اﻟﻌﻜﺲ ﻣﻦ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﻓﺎﻧﮫ ﻻﯾﺴﻤﺢ ﺑﺎﺳﺘﺨﺪام ﻣﺜﻞ ھﺬه اﻟﺠﻤﻞ ‪ .‬وأن ﻛﺎن ﻣﻦ اﻟﻤﻤﻜﻦ اﺳﺘﺨﺪاﻣﮭﺎ‬
‫ﺑﻄﺮﯾﻘﮫ ﻏﯿﺮ ﻣﺒﺎﺷﺮه وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ اﺳﺘﺪﻋﺎء إﺟﺮاء ﯾﺤﺘﻮي ﻋﻠﻰ ھﺬه اﻟﺠﻤﻞ داﺧﻞ اﻟﻤﻄﻠﻖ ‪ Trigger‬وﻟﻜﻦ ﻻ‬
‫ﯾﻨﺼﺢ ﺑﺈﺟﺮاء ﻣﺜﻞ ھﺬه اﻟﻌﻤﻠﯿﺎت وذﻟﻚ ﻟﻤﺎ ﻟﮭﺎ ﻣﻦ أﺿﺮار ﺟﺎﻧﺒﯿﮫ ‪ Side Effects‬ﻋﻠﻰ اﻹﺟﺮاءات ‪Transactions‬‬
‫ﺑﺎﻷﺿﺎﻓﮫ إﻟﻰ ذﻟﻚ ﺗﻮﺟﺪ ﺑﻌﺾ اﻟﻔﺮوق ﺑﯿﻦ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬اﻟﺨﺎﺻﺔ ﺑﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪Data Base‬‬
‫‪Triggers‬واﻟﻤﻄﻠﻘﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﺘﻄﺒﯿﻘﺎت ‪.Application Triggers‬‬
‫ﺣﯿﺚ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻘﺎت ﺑﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪Data Base‬ﻣﻦ ﺧﻼل اﻹﺣﺪاث اﻟﺘﻲ ﺗﻘﻊ ﻋﻦ ﻃﺮﯾﻖ أدوات ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت‬
‫‪.‬‬ ‫أو اﻟﺘﻄﺒﯿﻘﺎت اﻟﺨﺎﺻﺔ ﺑﮭﺎ‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩٤‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫وﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻣﻦ ﺧﻼل ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪ DML‬وﺟﻤﻞ ﺗﻌﺮﯾﻒ اﻟﺒﯿﺎﻧﺎت ‪.DDL‬‬
‫*ﺑﯿﻨﻤﺎ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻘﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﺘﻄﺒﯿﻘﺎت ‪ Application Triggers‬ﻣﻦ ﺧﻼل اﻟﺘﻄﺒﯿﻖ ‪Form‬‬
‫‪builder Application‬‬
‫ﻓﻘﻂ ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻦ ﻃﺮﯾﻖ اﻟﺘﺼﻔﺢ ﻓﻲ ﻧﻮاﻓﺬ اﻟﺘﻄﺒﯿﻘﺎت أو ﻋﻦ ﻃﺮﯾﻖ اﻟﻀﻐﻂ ﻋﻠﻰ أي ﻣﻔﺘﺎح ‪.‬‬
‫* ﻓﻲ ﺣﯿﺚ ﻓﺸﻞ ﻣﻄﻠﻘﺎت ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪ Database Triggers‬ﻓﺎﻧﮫ ﯾﻌﻤﻞ ﻋﻠﻰ اﻟﺘﺮاﺟﻊ ﻋﻦ اﻟﻮﺿﻊ اﻟﺤﺎﻟﻲ‬
‫‪Rollback‬‬
‫أﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﻣﻄﻠﻘﺎت اﻟﺘﻄﺒﯿﻘﺎت ‪ Application Trigger‬ﻓﺎﻧﮫ ﯾﻌﻤﻞ ﻋﻠﻰ إﯾﻘﺎف اﻟﻤﺆﺷﺮ ‪Close Cursor‬‬
‫ﻛﻤﺎ ﯾﻤﻜﻦ أن ﯾﻌﻤﻞ ﻋﻠﻰ اﻟﺘﺮاﺟﻊ ﻋﻦ اﻟﻮﺿﻊ اﻟﺤﺎﻟﻲ ﻟﻺﺟﺮاء ‪ Rollback Transaction‬وﯾﺘﻢ ﺗﻨﻔﯿﺬ ﻣﻄﻠﻘﺎت‬
‫اﻟﺘﻄﺒﯿﻘﺎت ﻓﻲ اﻟﻤﺠﺎل اﻟﺨﺎص ﺑﺎﻟﻤﺴﺘﺨﺪم اﻟﻘﺎﺋﻢ ﻋﻠﻰ اﻟﺘﻄﺒﯿﻖ ‪ Form builder‬ﺑﯿﻨﻤﺎ ﯾﺘﻢ ﺗﻨﻔﯿﺬ ﻣﻄﻠﻘﺎت ﻗﻮاﻋﺪ‬
‫اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﻤﺠﺎل اﻟﺨﺎص ﺑﻤﺎﻟﻚ ھﺬه اﻟﻤﻄﻠﻘﺎت ﻓﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ‪.‬‬
‫***********************************‬
‫‪Triggers ‬‬

‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪروس اﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﻧﺸﺎء اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬وأﻧﻮاﻋﮭﺎ وﻛﯿﻔﯿﺔ اﺳﺘﺨﺪاﻣﮭﺎ ‪.‬وﺳﻮف ﻧﺘﻌﺮف‬
‫ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﺗﺎﺣﺔ أو ﻋﻢ إﺗﺎﺣﺔ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﻟﻼﺳﺘﺨﺪام ‪-:‬‬
‫‪Enable Triggers‬‬ ‫أو‬ ‫‪Disable Triggers‬‬
‫وذﻟﻚ ﻟﺠﻤﯿﻊ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬اﻟﺨﺎﺻﺔ ﺑﺠﺪول ﻣﻌﯿﻦ أو اﻟﻤﻄﻠﻖ ‪ Trigger‬ﻣﺤﺪد ﻛﻤﺎ ﺳﻨﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ‬
‫إﻋﺎدة إﻧﺸﺎء اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﺑﺎﻻﺿﺎﻓﮫ إﻟﻰ ﻛﯿﻔﯿﺔ ﺣﺬف اﻟﻤﻄﻠﻘﺎت ‪ Deleting‬ﻣﻦ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻓﻔﻲ اﻟﻮﺿﻊ‬
‫اﻻﻓﺘﺮاﺿﻲ ﺗﻜﻮن اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﻣﺘﺎﺣﺔ وذﻟﻚ ﺑﻌﺪ إﻧﺸﺎءھﺎ ﻣﺒﺎﺷﺮه وﻟﻠﺘﺤﻜﻢ ﻓﻲ إﺗﺎﺣﺔ أو ﻋﺪم إﺗﺎﺣﺔ اﻟﻤﻄﻠﻘﺎت‬
‫ﻓﻲ اﻻﺳﺘﺨﺪام ‪ enabling and Disabling Triggers‬ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ‪-:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﻜﻠﻤﺎت ‪ Alter_name‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ ‪ Trigger_name‬ﺛﻢ اﻟﻜﻠﻤﺎت ‪Disable‬‬
‫وﺗﺴﺘﺨﺪم ھﺬه اﻟﻜﻠﻤﺔ إذا أردﻧﺎ ﻋﺪم إﺗﺎﺣﺔ ھﺬا اﻟﻤﻄﻠﻖ ﻟﻼﺳﺘﺨﺪام )ﺗﻌﻄﯿﻞ(‪ .‬وﻹﺗﺎﺣﺔ اﻟﻤﻄﻠﻖ ﻟﻼﺳﺘﺨﺪام ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام‬
‫اﻟﻜﻠﻤﺔ ‪ enable‬ﺑﺪﻻ ﻣﻦ ‪.Disable‬‬
‫وﻹﺗﺎﺣﺔ ﺟﻤﯿﻊ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬اﻟﺨﺎﺻﺔ ﺑﺠﺪول ﻣﻌﯿﻦ ﺗﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ ‪-:‬‬

‫‪ :ALL Triggers‬ﺗﻌﻤﻞ ھﺬه أﻟﺠﻤﻠﮫ ﻹﺗﺎﺣﺔ أو ﻋﺪم إﺗﺎﺣﺔ ﺟﻤﯿﻊ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻟﺠﺪول وﻓﻲ‬
‫ﺑﻌﺾ اﻷﺣﯿﺎن ﻗﺪ ﻧﺤﺘﺎج إﻟﻰ ﻋﻤﻞ إﻋﺎدة ﺗﺮﺟﻤﮫ ‪ Recompile‬ﻟﺒﻌﺾ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬اﻟﻐﯿﺮ ﻓﻌَﺎﻟﮫ‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩٥‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫وﻟﻌﻤﻞ ذﻟﻚ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ‪-:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ ‪ Alter Trigger‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ ‪ Trigger‬ﺛﻢ اﻟﻌﺒﺎرة ‪. Compile‬‬
‫وﻟﺤﺬف اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﻧﺴﺘﺨﺪم اﻟﺠﻤﻠﺔ ‪.Drop Trigger‬‬
‫ﻛﻤﺎ ﻓﻲ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪-:‬‬
‫;‪Drop Trigger trigger_name‬‬
‫***************************************************‬
‫‪ Triggers‬‬
‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ أﻧﻮاع أﺧﺮى ﻣﻦ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬وھﻲ اﻟﻤﻄﻠﻘﺎت اﻟﺨﺎﺻﺔ ﺑﻨﻈﺎم ﻗﻮاﻋﺪ‬
‫اﻟﺒﯿﺎﻧﺎت ‪ system event‬ﺳﻮاء ﻛﺎﻧﺖ ﻋﻠﻰ ﻣﺴﺘﻮى ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻛﻜﻞ ‪ Database Level‬أو ﻋﻠﻰ ﻣﺴﺘﻮى‬
‫ﻣﺴﺘﺨﺪم واﺣﺪ ﻓﻘﻂ ‪ . Schema Level‬ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬اﻟﺘﻲ ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ ﻓﺘﺢ أو‬
‫إﻏﻼق ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Open &close Database‬أو ﻋﻨﺪ دﺧﻮل أو ﺧﺮوج ﻣﺴﺘﺨﺪم ﻣﻌﯿﻦ ‪Log on or off‬‬
‫ﻣﻦ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أو ﻋﻨﺪ ﺗﻨﻔﯿﺬ أي ﺟﻤﻠﮫ ﻣﻦ اﻟﺠﻤﻞ ‪ Execute DDL‬ﯾﻤﻜﻦ أن ﺗﻜﻮن ﻋﻠﻰ ﻣﺴﺘﻮى ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت‬
‫أو ﻋﻠﻰ ﻣﺴﺘﻮى اﻟﻤﺴﺘﺨﺪم أﻣﺎ اﻟﻤﻄﻠﻘﺎت اﻟﺘﻲ ﺗﻨﻔﺬ ﻋﻨﺪ ﺗﻨﻔﯿﺬ ﺟﻤﻞ ﻣﻌﺎﻟﺠﮫ اﻟﺒﯿﺎﻧﺎت ‪ DML‬ﻓﺘﻜﻮن ﻋﻠﻰ ﻣﺴﺘﻮى‬
‫ﺟﺪول ﻣﻌﯿﻦ وﻹﻧﺸﺎء ﻣﻄﻠﻘﺎت ‪ Triggers‬ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ ﺗﻨﻔﯿﺬ اﻟﺠﻤﻞ ‪ DDL‬ﯾﺘﻢ اﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ‪-:‬‬

‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ ‪ Create or Replace Trigger‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ ‪ trigger_name‬ﺛﻢ اﻟﻌﺒﺎرة‬
‫‪ timing‬واﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻟﻮﻗﺖ اﻟﺘﻲ ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﺑﮫ وھﻮ أﻣﺎ ‪ After‬أو ‪ before‬ﺛﻢ اﻟﻜﻠﻤﺎت‬
‫]]‪ [ddl_event1[Or ddl_event2 Or …….‬واﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻟﺠﻤﻞ اﻟﺘﻲ ﺗﺆدي إﻟﻰ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻘﺎت‬
‫‪Triggers‬وﺗﻜﻮن ﻣﻦ اﻟﺠﻤﻞ ‪ DDL‬وھﻲ إﺣﺪى اﻟﺜﻼث اﻟﺠﻤﻞ ‪ Create or Alter or Drop‬وﺗﻌﻤﻞ اﻟﺠﻤﻠﺔ‬
‫‪Create‬ﻋﻠﻰ ﺟﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ‪ Oracle server‬ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ‪Trigger‬ﻋﻨﺪ إﺿﺎﻓﺔ أي ﻋﻨﺼﺮ ﺟﺪﯾﺪ‬
‫ﻓﻲ ﻗﺎﻣﻮس ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪. Data Dictionary‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩٦‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫أﻣﺎ اﻟﺠﻤﻠﺔ ‪ Alter‬ﻓﺘﺠﻌﻞ اﻟﺨﺎم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﻨﺪ ﺗﻌﺪﯾﻞ أي ﻋﻨﺼﺮ ﻣﻮﺟﻮد ﻓﻲ ﻗﺎﻣﻮس ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت‬
‫واﻟﺠﻤﻠﺔ ‪ Drop‬ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﻨﺪ ﺣﺬف أي ﻋﻨﺼﺮ ﻣﻦ اﻟﻌﻨﺎﺻﺮ اﻟﻤﻮﺟﻮدة ﻓﻲ ﻗﺎﻣﻮس‬
‫ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ .‬وﺑﻌﺪ ﺗﺤﺪﯾﺪ اﻷﺣﺪاث اﻟﻤﺴﺘﺨﺪﻣﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﻜﻠﻤﺔ ‪ ON‬ﯾﻠﯿﮭﺎ اﺣﺪ اﻟﻌﺒﺎرﺗﯿﻦ أﻣﺎ‬
‫‪ Database‬واﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ ﺗﻄﺒﯿﻖ اﻟﻤﻄﻠﻖ ﻋﻠﻰ ﻣﺴﺘﻮى ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أو ‪ Schema‬واﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ ﺗﻄﺒﯿﻖ‬
‫اﻟﻤﻄﻠﻖ ﻋﻠﻰ ﻣﺴﺘﻮى اﻟﻤﺴﺘﺨﺪم ﺛﻢ اﻟﻜﻠﻤﺔ ‪ Trigger_body‬واﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻻﻛﻮاد اﻟﺘﻲ ﺳﻮف ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ‬
‫ﺗﻨﻔﺬ اﻟﻤﻄﻠﻖ ‪ Trigger‬ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ أﯾﻀﺎ إﻧﺸﺎء ﻣﻄﻠﻘﺎت ‪ Triggers‬ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ وﻗﻮع ﺣﺪث ﻣﻌﯿﻦ ﻓﻲ ﻧﻈﺎم‬
‫ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺑﻨﻔﺲ اﻟﺼﯿﻐﺔ اﻟﺴﺎﺑﻘﺔ ﻣﻊ اﺧﺘﻼف اﻷﺳﺒﺎب اﻟﻤﺆدﯾﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ‬
‫اﻟﺘﺎﻟﻲ ‪-:‬‬

‫وﺗﺪل اﻟﻜﻠﻤﺎت ‪ database_event1 OR database_event2‬ﻋﻠﻰ ﺑﻌﺾ اﻟﻌﻤﻠﯿﺎت اﻟﺘﻲ ﯾﻤﻜﻦ أن ﺗﺤﺪث ﻓﻲ‬
‫ﻧﻈﺎم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وھﻲ إﺣﺪى اﻟﻌﻤﻠﯿﺎت‪-:‬‬
‫‪* After server_error‬‬
‫واﻟﺘﻲ ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﻨﺪ إﺻﺪار أي رﺳﺎﻟﺔ ﺧﻄﺄ ‪.‬‬
‫‪* After Logon‬‬
‫واﻟﺘﻲ ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﻨﺪ دﺧﻮل أي ﻣﺴﺘﺨﺪم إﻟﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪.‬‬
‫‪* Before Logon‬‬
‫واﻟﺘﻲ ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﻨﺪ ﺧﺮوج أي ﻣﺴﺘﺨﺪم ﻣﻦ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪.‬‬
‫‪*After startup‬‬
‫واﻟﺘﻲ ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﺑﻌﺪ ﻓﺘﺢ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻣﺒﺎﺷﺮةً‪.‬‬
‫‪*Before shut Down‬‬
‫اﻟﺘﻲ ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻗﺒﻞ إﻏﻼق ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪.‬‬
‫وﯾﺠﺐ ﻣﻼﺣﻈﺔ اﻧﮫ ﯾﻤﻜﻦ ﺗﻄﺒﯿﻖ ﺟﻤﯿﻊ ھﺬه اﻷﺣﺪاث ﻋﻠﻰ ﻣﺴﺘﻮى ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت وﻋﻠﻰ ﻣﺴﺘﻮى اﻟﻤﺴﺘﺨﺪم ﻣﻌﺎ ﻓﮭﻲ‬
‫ﻣﺎﻋﺪا اﻟﺤﺪﺛﯿﻦ‪-:‬‬
‫‪After Startup‬‬
‫‪Before Shutdown‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩٧‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺣﯿﺚ ﯾﺘﻢ ﺗﻄﺒﯿﻘﮭﺎ ﻋﻠﻰ ﻣﺴﺘﻮى ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻓﻘﻂ ‪ .‬ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﺗﺨﺰﯾﻦ اﻷرﻗﺎم اﻟﺘﺴﻠﺴﻠﯿﺔ‬
‫ﻟﻠﻤﺴﺘﺨﺪﻣﯿﻦ ﺗﻠﻘﺎﺋﯿﺎ ﺑﻌﺪ دﺧﻮﻟﮭﻢ ﻋﻠﻰ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد ‪-:‬‬

‫ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء ‪ Trigger‬ﻟﮫ اﻻﺳﻢ ‪ Logon_trig‬ﺑﺤﯿﺚ ﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬا اﻟﻤﻄﻠﻖ ﺗﻠﻘﺎﺋﯿﺎ ﻋﻨﺪ دﺧﻮل أي ﻣﺴﺘﺨﺪم‬
‫إﻟﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺤﺪث ‪ After Logon‬وﻗﺪ ﻗﻤﻨﺎ ﺑﺘﻄﺒﯿﻖ ھﺬا اﻟﻤﻄﻠﻖ ﻋﻠﻰ ﻣﺴﺘﻮى اﻟﻤﺴﺘﺨﺪم‬
‫وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ ﻛﺘﺎﺑﺔ اﻟﻌﺒﺎرة ‪ Schema‬ﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻜﻮد‪.‬‬
‫**************************************************‬
‫‪Call  Mutating Table‬‬
‫ﻋﺎدة ﻣﺎ ﺗﻤﺮ اﻟﺠﺪاول ﺑﺤﺎﻟﮫ ﺗﻌﺮف ﺑﺎﻟﺤﺎﻟﺔ ‪ mutating table‬وﺗﺤﺪث ھﺬه اﻟﺤﺎﻟﺔ ﻋﻨﺪﻣﺎ ﻧﺤﺎول اﻟﻘﺮاءة أو اﻟﻜﺘﺎﺑﺔ‬
‫ﻋﻠﻰ اﻟﺠﺪاول ﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ اﻟﺘﻲ ﺗﺠﺮي ﻋﻠﯿﮭﺎ ﻋﻤﻠﯿﺎت ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﻣﺜﻞ‪-:‬‬
‫اﻻﺿﺎﻓﮫ ‪ Insert‬أو اﻟﺤﺬف ‪ Delete‬أو اﻟﺘﻌﺪﯾﻞ ‪ Update‬وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻤﻄﻠﻘﺎت ‪Triggers‬ﻣﻦ اﻟﻨﻮع‬
‫ﻓﺈذا‬ ‫‪ Row_Level‬وﻓﻲ ﺣﺎﻟﺔ وﻗﻮع ھﺬه اﻟﺤﺎﻟﺔ ﺗﻘﻮم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ ﺑﺈﺻﺪار رﺳﺎﻟﺔ اﻟﺨﻄﺄ ‪Ora-4091‬‬
‫أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل وﺿﻊ ﺷﺮﻃﺎ ﺧﺎﺻﺎ ﻋﻠﻰ اﻟﺠﺪول ‪ employees‬ﻟﺘﺄﻛﺪ ﻣﻦ اﻧﮫ ﻋﻨﺪ إﺿﺎﻓﺔ ﻋﻼوة ﻷي ﻣﻮﻇﻒ‬
‫ﻣﻦ اﻟﻤﻮﻇﻔﯿﻦ ﻻﯾﺰﯾﺪ اﻟﺮاﺗﺐ اﻟﺨﺎص ﺑﮭﺬا اﻟﻤﻮﻇﻒ ﻋﻦ ‪ 20%‬ﻣﻦ ﻗﯿﻤﺔ اﻛﺒﺮ راﺗﺐ ﻟﮭﺬا اﻟﻘﺴﻢ ﺗﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا‬
‫اﻟﻜﻮد‪-:‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩٨‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﺗﻮﺿﯿﺢ‬

‫ﯾﻌﻤﻞ ھﺬا اﻟﻜﻮد ﻋﻠﻰ إﻧﺸﺎء ‪ Trigger‬ﻣﻦ اﻟﻨﻮع ‪ Row_Level‬واﻟﺬي ﯾﻌﻤﻞ ﻋﻠﻰ إﺟﺮاء ﻋﻤﻠﯿﺔ ﻓﺤﺺ ﻟﻘﯿﻢ‬
‫رواﺗﺐ اﻟﻤﻮﻇﻔﯿﻦ وﻓﻲ ﺣﺎﻟﺔ ﻗﯿﺎﻣﻨﺎ ﺑﻌﻤﻞ ﺗﻌﺪﯾﻞ ﻋﻠﻰ رواﺗﺐ اﻟﻤﻮﻇﻔﯿﻦ ﻧﻼﺣﻆ ﻇﮭﻮر رﺳﺎﻟﺔ اﻟﺨﻄﺄ وذﻟﻚ ﻻن اﻟﺠﺪول‬
‫‪ employees‬ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﯾﻌﺘﺒﺮ ﻣﻦ اﻟﺠﺪاول ‪ mutating table‬ﻟﺬاﻟﻚ ﯾﻔﻀﻞ ﻋﺪم اﺳﺘﺨﺪام ھﺬا اﻟﻨﻮع ﻣﻦ‬
‫اﻟﻤﻄﻠﻘﺎت ‪ Trigger‬وﻟﺤﻞ ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﺸﺎﻛﻞ ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻨﻮع ‪ Statement Trigger‬ﺑﺪﻻ ﻣﻦ اﻟﻨﻮع‬
‫‪ Row_Level‬أو ﺟﻌﻞ اﻟﻤﻄﻠﻖ ‪ Trigger‬ﻣﺴﺘﻘﻼ ﻋﻦ ﻃﺮﯾﻖ إﺿﺎﻓﺔ ھﺬه اﻟﺠﻤﻠﺔ‪-:‬‬
‫‪PRAGMA AUTONOMOUS TRANSACTION‬‬
‫ﻣﻤﺎ ﯾﺘﯿﺢ ﻟﻨﺎ ﻓﺮﺻﺔ اﻻﺳﺘﻌﻼم ﻣﻦ ھﺬا اﻟﺠﺪول ﻣﻊ ﻋﺪم اﻟﻘﺪرة ﻋﻠﻰ اﻻﺿﺎﻓﮫ أو اﻟﺘﻌﺪﯾﻞ ﻓﻲ ﻣﺤﺘﻮاه‪ .‬ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ أﯾﻀﺎ‬
‫اﺳﺘﺪﻋﺎء اﻹﺟﺮاءات داﺧﻞ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ‪ CALL‬وذﻟﻚ ﺑﺪﻻ ﻣﻦ ﺗﻜﺮار اﻻﻛﻮاد‬
‫ﺣﯿﺚ ﯾﻤﻜﻨﻨﺎ وﺿﻊ اﻟﻜﻮد اﻟﺬي ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪاﻣﮫ ﺑﻄﺮﯾﻘﮫ ﻣﺘﻜﺮرة داﺧﻞ إﺟﺮاء ‪ Procedure‬ﺛﻢ ﻧﻘﻮم ﺑﺎﺳﺘﺪﻋﺎء ھﺬا‬
‫اﻹﺟﺮاء ﻋﻠﻰ ﺣﺴﺐ اﺣﺘﯿﺎﺟﺎﺗﻨﺎ داﺧﻞ ﻋﻨﺎﺻﺮ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت اﻷﺧﺮى ﺳﻮاءاً ﻛﺎﻧﺖ ﻣﻄﻠﻘﺎت ‪ Triggers‬أو وﻇﺎﺋﻒ‬
‫‪ Functions‬أو ﺣﺘﻰ إﺟﺮاءات أﺧﺮى ‪ Procedures‬وﺗﺄﺧﺬ اﻟﻜﻠﻤﺔ ‪ Call‬اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ‪-:‬‬
‫;‪Call Procedure_name‬‬
‫وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﻜﻠﻤﺔ ‪ Call‬ﯾﻠﯿﮭﺎ اﺳﻢ اﻹﺟﺮاء اﻟﺬي ﻧﺮﯾﺪ اﺳﺘﺪﻋﺎﺋﮫ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﯾﻤﻜﻨﻨﺎ ﺣﻔﻆ اﻟﻜﻮد اﻟﺨﺎص‬
‫ﺑﺎﻟﻤﻄﻠﻖ اﻟﺴﺎﺑﻖ داﺧﻞ إﺟﺮاء ﺗﻢ اﺳﺘﺪﻋﺎء ھﺬا اﻹﺟﺮاء ﻣﻦ داﺧﻞ اﻟﻤﻄﻠﻖ ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ ‪-:‬‬

‫وﯾﺠﺐ ﻣﻼﺣﻈﺔ أن اﻟﻜﻠﻤﺔ ‪ CALL‬ﻻ ﺗﻨﺘﮭﻲ ﺑﺎﻟﻔﺎﺻﻠﺔ اﻟﻤﻨﻘﻮﻃﺔ );( ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪٩٩‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫‪Triggers  ‬‬

‫ﺗﻌﺮﻓﻨﺎ ﻓﻲ ﻣﺎ ﺳﺒﻖ ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﻧﺸﺎء وﺗﻌﺪﯾﻞ وإدارة اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﺑﻮاﺳﻄﺔ اﻟﺠﻤﻞ‪-:‬‬

‫وﻣﺎ إﻟﻰ ذﻟﻚ ﻣﻦ ﺟﻤﻞ ‪DDL‬‬

‫وﺳﻮ ف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ اﻻﻣﺘﯿﺎزات اﻟﻼزﻣﺔ ﻟﺴﻤﺎح اﻟﻤﺴﺘﺨﺪم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أو ﻟﻤﺪﯾﺮ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت‬
‫ﻟﻠﻘﯿﺎم ﺑﮭﺬه اﻟﻌﻤﻠﯿﺎت ﻓﻺﻧﺸﺎء اﻟﻤﻄﻠﻖ ‪ Trigger‬ﻻﺑﺪ ﻣﻦ اﻟﺤﺼﻮل ﻋﻠﻰ اﻣﺘﯿﺎز اﻟﻨﻈﺎم ‪ Create Trigger‬ﺑﺎ ﻹﺿﺎﻓﺔ‬
‫إﻟﻰ اﻣﺘﻼك اﻟﺠﺪول اﻟﻤﺤﺪد ﻓﻲ اﻟﻤﻄﻠﻖ أو اﻟﺤﺼﻮل ﻋﻠﻰ اﻣﺘﯿﺎز اﻟﻨﻈﺎم ‪ Alter‬ﻟﻠﺠﺪول اﻟﻤﺤﺪد ﻓﻲ اﻟﻤﻄﻠﻖ وﻟﺘﻌﺪﯾﻞ أو‬
‫ﺣﺬف اﻟﻤﻄﻠﻘﺎت ‪Triggers‬ﺑﺪون أي اﻣﺘﯿﺎزات أﺧﺮى‪ .‬وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ اﻧﮫ ﯾﺘﻢ اﺳﺘﺪﻋﺎء اﻟﻤﻄﻠﻘﺎت ‪Triggers‬‬
‫ﺑﻄﺮﯾﻘﮫ ﺗﻠﻘﺎﺋﯿﺔ ﻋﻨﺪ اﺳﺘﺨﺪام ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪ DML‬ﻓﺬﻟﻚ ﻓﺈﻧﻨﺎ ﻻ ﻧﺤﺘﺎج ﻟﻠﺤﺼﻮل ﻋﻠﻰ أي اﻣﺘﯿﺎزات ﻻﺳﺘﺪﻋﺎء‬
‫اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬ﻓﻲ ﻧﻔﺲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪.Schema‬‬
‫وﻟﻜﻦ إذا ﻛﺎن ھﺬا اﻟﻤﻄﻠﻖ ﯾﺸﯿﺮ إﻟﻰ أي ﻋﻨﺎﺻﺮ أﺧﺮى ﻣﻮﺟﻮدة ﺧﺎرج ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪ Schema‬ﻓﻼﺑﺪ ﻟﻤﻨﺸﺊ ھﺬا‬
‫اﻟﻤﻄﻠﻖ أن ﯾﻜﻮن ﻟﮫ اﻻﻣﺘﯿﺎز ‪ Execute‬ﻋﻠﻰ ھﺬه اﻟﻌﻨﺎﺻﺮ وﻣﻦ اﻟﻤﻤﻜﻦ إﻧﺸﺎء ﻣﻄﻠﻘﺎت ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وذﻟﻚ ﻣﻦ‬
‫ﺧﻼل اﻻﻣﺘﯿﺎز ‪ . Administer Data base Trigger :‬وﻓﻲ ﺣﺎﻟﺔ ﺳﺤﺐ ھﺬا اﻻﻣﺘﯿﺎز ﯾﻤﻜﻨﻨﺎ ﺣﺬف اﻟﻤﻄﻠﻘﺎت‬
‫‪ Triggers‬ﻓﻘﻂ ﺑﺪون أﻣﻜﺎﻧﯿﮫ إﻧﺸﺎءھﺎ ‪ Create‬أو ﺗﻌﺪﯾﻠﮭﺎ ‪. Alter‬‬
‫*****************************************************‬
‫‪Triggers ‬‬

‫ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ ﻋﺮض اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻄﻠﻘﺎت ‪ Triggers‬وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺠﺪاول‬
‫اﻟﺘﺨﯿﻠﯿﺔ ‪ Views‬ﺣﯿﺚ ﯾﺴﺘﺨﺪم اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ‪ User_object‬ﻟﻌﺮض ﻛﻼ ﻣﻦ أﺳﻤﺎء وﺣﺎﻟﺔ اﻟﻤﻄﻠﻖ‪-:‬‬

‫ﻛﻤﺎ ﯾﺤﺘﻮي ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت ﻋﻦ ﺗﺎرﯾﺦ ووﻗﺖ إﻧﺸﺎء اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬وﯾﺤﺘﻮي اﻟﺠﺪول ‪ User_Errors‬ﻋﻠﻰ‬
‫ﻣﻌﻠﻮﻣﺎت ﻋﻦ اﻷﺧﻄﺎء اﻟﺘﻲ ﺣﺪﺛﺖ أﺛﻨﺎء ﺗﺮﺟﻤﺔ اﻟﻤﻄﻠﻖ ‪-:‬‬

‫أﻣﺎ اﻟﺠﺪول ‪ User_Triggers‬ﻓﯿﺤﺘﻮي ﻋﻠﻰ ﺟﻤﯿﻊ اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻄﻠﻖ‪-:‬‬

‫ﺣﯿﺚ ﯾﺤﺘﻮي ﻋﻠﻰ اﺳﻢ اﻟﻤﻄﻠﻖ وﻧﻮﻋﮫ واﻷﺣﺪاث اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ واﻟﺠﺪول اﻟﺬي ﻗﺎم ﻋﻠﻰ أﺳﺎﺳﮫ ھﺬا اﻟﻤﻄﻠﻖ‬
‫واﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﻟﮭﺬا اﻟﻤﻄﻠﻖ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٠٠‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


‫ﻛﻤﺎ ﯾﻤﻜﻦ أﯾﻀﺎ ﻋﺮض ﺟﻤﯿﻊ ھﺬه اﻟﺒﯿﺎﻧﺎت ﺑﺎﺳﺘﺨﺪام اﻟﺠﺪاول ‪-:‬‬
‫‪ALL_Triggers‬‬
‫‪DBA_Triggers‬‬

‫وﺗﺘﻤﯿﺰ ھﺬه اﻟﺠﺪاول ﺑﺄﻧﮭﺎ ﺗﺤﺘﻮي ﻋﻠﻰ ﻋﻤﻮد إﺿﺎﻓﻲ ﯾﻌﺮض اﺳﻢ اﻟﺠﺪول اﻟﻤﺮﺗﺒﻂ ﺑﮫ ھﺬه اﻟﻤﻄﻠﻘﺎت ﻓﻔﻲ اﻟﻤﺜﺎل‬
‫اﻟﺘﺎﻟﻲ ‪-:‬‬
‫; ‪Select * From all_Triggers‬‬
‫ﯾﺘﻢ ﻋﺮض ﺟﻤﯿﻊ اﻟﻤﻄﻠﻘﺎت ‪ Triggers‬اﻟﺘﺎﺑﻌﺔ ﻟﻠﻤﺴﺘﺨﺪم ‪ . Scott‬وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﺪول ‪ALL_Triggers‬‬
‫واﻵن إذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻣﻌﺮﻓﺔ ﻧﻮع اﻟﻤﻄﻠﻖ ‪ Update_job_History‬ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد ‪-:‬‬
‫‪Select trigger_type‬‬
‫‪From User_triggers‬‬
‫; '‪Where trigger_Name ='Update_job_History‬‬
‫**************************************************‬
‫ﻣﻼﺣﻈﺎت ﻋﻠﻰ ھﺬا اﻟﻔﺼﻞ‬

‫• ﻋﻨﺪ اﺳﺘﺨﺪام ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﻣﻊ اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ ‪ Views‬ﺗﺴﻤﻰ اﻟﻤﻄﻠﻘﺎت ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺑﺎﻻﺳﻢ‬
‫‪. Instead of Triggers‬‬
‫• ﻋﻨﺪ اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ ‪ After‬ﻓﻲ اﻟﻤﻜﻮن اﻟﺨﺎص ﺑﺘﺤﺪﯾﺪ وﻗﺖ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ‪ Trigger Timing‬ﯾﺘﻢ ﺗﻨﻔﯿﺬ‬
‫اﻟﻜﻮد اﻟﻤﻮﺟﻮد ﺑﺎﻟﺠﺰء ‪ Trigger body‬ﺑﻌﺪ وﻗﻮع اﻟﺤﺪث اﻟﺨﺎص ﺑﺠﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ‪ DML Event‬ﻋﻠﻰ‬
‫اﻟﺠﺪاول‪.‬‬
‫• ﻓﻲ اﻟﻤﻜﻮن ‪ Trigger Type‬ﻟﻠﻤﻄﻠﻘﺎت ‪ Triggers‬ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻨﻮع ‪Row‬ﻟﺘﻨﻔﯿﺬ ﻛﻮد اﻟﻤﻄﻠﻖ ‪Trigger‬‬
‫‪Body‬ﻋﺪد ﻣﻦ اﻟﻤﺮات ﻣﺴﺎوي ﻟﻌﺪد اﻟﺼﻔﻮف اﻟﺘﻲ ﺗﺄﺛﺮت ﺑﺎﻟﺠﻤﻠﺔ اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ‪.‬‬

‫‪Alsaeedi999@hotmail.com‬‬ ‫‪١٠١‬‬ ‫أﻋﺪاد ‪ /‬ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬

‫‪PDF created with pdfFactory Pro trial version www.pdffactory.com‬‬


 

 

 

 


 
Form builder And Reports builder

 

 

Alsaeedi999@hotmail.com ١٠٢ ‫ ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي‬/ ‫أﻋﺪاد‬

PDF created with pdfFactory Pro trial version www.pdffactory.com

You might also like