تعليم اوراكل

Page 1


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻛﻠﻤﺔ ﻻﺑﺪ ﻣﻨﻬﺎ‬ ‫ﺍﻟﺘﺤﺪﻱ ﻛﺒﲑ ﻭﺍﳌﺴﺌﻮﻟﻴﺔ ﻫﻲ ﻣﺴﺌﻮﻟﻴﺔ ﺍﳉﻤﻴﻊ ‪ .‬ﳓﻦ ﻧﻌﻴﺶ ﰲ ﻋﺎﱂ ﺟﺪﻳﺪ ﳛﻜﻤﻪ‬ ‫ﺍﻟﻌﻠﻢ ﻭﺍﳌﻌﺮﻓﺔ‪ .‬ﻧﻌﻴﺶ ﰲ ﻋﺎﱂ ﺟﺪﻳﺪ ﻗﻮﺍﻣﻪ ﻗﻮﻯ ﺑﺸﺮﻳﺔ ﻣﺘﻌﻠﻤﺔ‪ ،‬ﻣﺪﺭﺑﺔ ﻭﻓـﻌﺎﻟﺔ‪.‬‬ ‫ﻧﻌﻴﺶ ﰲ ﻋﺎﱂ ﺟﺪﻳﺪ ﺃﺻﺒﺤﺖ ﻓﻴﻪ ﺍﳌﻌﺎﻳﲑ ﻛﻠﻬﺎ ﻋﺎﳌﻴﺔ ‪ ،‬ﰲ ﺍﻟﺘﻌﻠﻴﻢ ‪ ،‬ﰲ ﺍﻟﺘﺪﺭﻳﺐ ‪،‬‬ ‫ﰲ ﺍﻻﻗﺘﺼﺎﺩ ‪ ،‬ﺑﻞ ﰲ ﻛـﻞ ﻧﻮﺍﺣـﻲ ﺍﳊـﻴﺎﺓ ‪ .‬ﻟـﺪﻳﻨﺎ ﰲ ﻣﺼﺮ ‪ ،‬ﻭﻋﻦ ﺣـﻖ ﻗـﻮﻯ ﺑﺸﺮﻳﺔ‬ ‫ﻣﺘﻌﻠﻤﺔ ﻫــﺎﺋﻠﺔ ‪ ،‬ﻟـﺪﻳﻨﺎ ﰲ ﻣﺼﺮ ﻃـﺎﻗﺔ ﺷﺒﺎﺑﻴﺔ ﻛـﺒﲑﺓ‪ .‬ﻓﻘﻮﺓ ﳎﺘﻤﻌﻨﺎ ﻣﻦ ﻗـﻮﺓ‬ ‫ﺷﺒﺎﺑﻨﺎ ‪ ،‬ﻣﻦ ﺗﻌﻠﻴﻤﻪ ﻭﺗﺪﺭﻳﺒﻪ ﻋﻠﻰ ﺁﻟﻴﺎﺕ ﺍﻟﻌﺼﺮ ﻭﺃﺳﺎﺳﻴﺎﺗﻪ‪.‬‬ ‫ﺗﻘﺪﻣﻨﺎ ﺍﻻﻗﺘـﺼﺎﺩﻱ ﺑﻞ ﻭﺍﻻﺟـﺘﻤﺎﻋﻲ ﻭﺍﻟﺴـﻴﺎﺳﻲ ‪ ،‬ﻳﺘﻮﻗﻒ ﻛﺜﲑﺍﹰ ﻋﻠﻰ ﻣﺪﻯ ﻗﺪﺭﺗﻨﺎ‬ ‫ﻋﻠﻰ ﺍﻻﺭﺗـﻘﺎﺀ ‪‬ﺬﻩ ﺍﻟﻘﻮﺓ ﺍﻟﺒـﺸﺮﻳﺔ ﺍﻟﺸﺒـﺎﺑﻴﺔ ‪ ،‬ﻳﺘـﻮﻗـﻒ ﻛـﺜﲑﺍﹰ ﻋـﻠﻰ ﻣﺪﻯ ﻗﺪﺭﺗﻨﺎ‬ ‫ﻋﻠﻰ ﺇﺗﺎﺣﺔ ﺍﻟﻔﺮﺻﺔ ﳍﻢ ﻟﻠﺘﺪﺭﻳﺐ ﺍﳌﺘﻤﻴﺰ ﺍﻟﺬﻱ ﻳﺆﻫﻠﻬﻢ ﻟﻠﺤﻴﺎﺓ ﺍﻟﻌﻤﻠﻴﺔ ﺍﳌﻌﺎﺻﺮﺓ‬ ‫‪ ،‬ﻳﺘـﻮﻗﻒ ﻛـﺜﲑﺍﹰ ﻋـﻠﻰ ﻣـﺪﻯ ﻗـﺪﺭﺗـﻨﺎ ﻋـﻠﻰ ﺯﻳـﺎﺩﺓ ﺛـﻘﺘﻪ ﺑﻨﻔﺴﻪ ﻭﺇﻋﻄﺎﺅﻩ ﺍﻷﻣﻞ ﰲ‬ ‫ﺍﳌﺴﺘﻘﺒﻞ‪.‬‬ ‫ﻫﺬﻩ ﻫﻲ ﺭﺳﺎﻟﺘﻨﺎ ﻭﻣﺴﺌﻮﻟﻴﺘﻨﺎ ﺍﲡـﺎﻩ ﺑـﻼﺩﻧﺎ ﺍﻟـﱵ ﻧﻮﺍﺟﻬـﻬـﺎ ﺑﻜﻞ ﺇﺧﻼﺹ ﻭﲪﺎﺱ ‪.‬‬ ‫ﻭﻟﻜﻦ ﻛﻤﺎ ﻗﻠﺖ ﺍﳌﺴﺌﻮﻟﻴﺔ ﻫﻲ ﻣﺴﺌﻮﻟﻴﺔ ﺍﳉﻤﻴﻊ‪.‬‬ ‫ﻓﻠﻨﻌﻤﻞ ﻣﻌﺎﹰ ﲨﻴﻌﺎﹶ ﻣﻦ ﺃﺟﻞ ﻏﺪﺍﹰ ﺃﻓﻀﻞ ‪ ،‬ﻣﻦ ﺃﺟﻞ ﺟﻴﻞ ﺍﳌﺴﺘﻘﺒﻞ‬ ‫ﲨﺎﻝ ﻣﺒﺎﺭﻙ‬

‫‪-٢-‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫* ﻤﻘﺩﻤﻪ ﻋﻥ ﺃل ‪: PL/SQL‬‬ ‫ﻫﻲ ﺇﺤﺩﻯ ﺍﻟﻠﻐﺎﺕ ﺍﻟﻤﺴﺘﺨﺩﻤﺔ ﻓﻲ ‪ Oracle‬ﻭﻴﻤﻜﻥ ﺍﺴﺘﺨﺩﺍﻤﻬﺎ ﻓﻲ ﺍﻟﻌﺩﻴﺩ ﻤﻥ ﺍﻟﻤﻬﺎﻡ ﻤﺜل ﻋﻤل ﺇﺠﺭﺍﺀﺍﺕ ﺃﻭ‬ ‫ﺍﻟﺩﻭﺍل ﻋﻠﻰ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺤﻴﺙ ﺍﻨﻪ ﻴﺘﻡ ﺇﺩﺨﺎل ﺠﻤل ‪ SQL‬ﺩﺍﺨل ﻟﻐﺔ ‪ PL/SQL‬ﻭﻴﺘﻡ ﺍﺴﺘﺩﻋﺎﺀ ﺃﻭﺍﻤﺭ‬ ‫ﺃل‪ SQL‬ﺒﺴﻬﻭﻟﻪ ﺩﺍﺨل ‪ PL/SQL‬ﻟﺫﻟﻙ ﻴﻌﺘﺒﺭ ‪ PL/SQL‬ﺨﻠﻴﻁ ﻤﻥ ‪ PL‬ﻭﺠﻤل ﺃل ‪ SQL‬ﺤﻴﺙ ﺃﻥ ﺩﺍﺨل‬ ‫‪ PL‬ﻴﺘﻡ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺠﻤل ‪ SQL‬ﺒﺩﻭﻥ ﺇﻋﺩﺍﺩ ﻤﺴﺒﻕ ﺤﻴﺙ ﻓﻲ ﻟﻐﺎﺕ ﺍﻟﺒﺭﻤﺠﺔ ﺍﻷﺨﺭﻯ ﻤﺜل ‪ VB‬ﻴﺘﻁﻠﺏ ﻹﺩﺨﺎل‬ ‫ﺠﻤل ‪ SQL‬ﺩﺍﺨﻠﻬﺎ ﺍﺴﺘﻌﻤﺎل‬ ‫ﺘﻌﺭﻴﻔﺎﺕ ﻤﻌﻴﻨﻪ ﺜﻡ ﻨﻘﻭﻡ ﺒﺎﺴﺘﻌﻤﺎل ﺍﻟﺩﺍﻟﺔ ‪ EXEAUTE‬ﻟﺘﻨﻔﻴﺫ ﺃﻭﺍﻤﺭ ﺃل ‪ SQL‬ﻭﻫﺫﻩ ﺘﻌﺘﺒﺭ ﻤﻥ ﻨﻘﺎﻁ ﺍﻟﻘﻭﻩ ﻓﻲ‬ ‫ﺃل‪ PL/SQL‬ﻭﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻜﻭﺩ ﻴﺘﻡ ﻜﺘﺎﺒﺘﻪ ‪ ،‬ﻫﺫﺍ ﺍﻟﻜﻭﺩ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺠﻤل ﺃل ‪ SQL‬ﺤﻴﺙ ﺘﻘﻭﻡ‬ ‫ﺠﻤﻠﻪ‬ ‫ﺃل‪ PL/SQL‬ﺘﻘﻭﻡ ﺒﺩﻭﺭ ﻤﻬﻡ ﻓﻲ ﺃل ‪ ORACLE‬ﻭﺫﻟﻙ ﻷﻨﻬﺎ ﺘﺤﺘﻭﻱ ﻋﻠﻰ ﺇﺠﺭﺍﺀﺍﺕ ﻭﻤﺠﻤﻭﻋﻪ ﻤﻥ‬ ‫ﺍﻹﺤﺩﺍﺙ ﻭﺘﺤﺘﻭﻱ ﻋﻠﻰ ﻤﻜﺘﺒﻪ ﻫﺫﻩ ﺍﻟﻤﻜﺘﺒﺔ ﻫﺫﻩ ﺍﻟﻤﻜﺘﺒﺔ ﺘﺴﻤﻰ ‪ PACKAGE‬ﻭﻫﻲ ﺘﺤﺘﻭﻱ ﻋﻠﻰ ﻤﺠﻤﻭﻋﻪ ﻤﻥ‬ ‫ﺍﻹﺠﺭﺍﺀﺍﺕ‬ ‫ﻭﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺍﻟﺩﻭﺍل‬ ‫ﻭﺘﻭﺠﺩ ﻤﻤﻴﺯﺍﺕ ﻻﺴﺘﺨﺩﺍﻡ ﺠﻤل ‪: PL/SQL‬‬ ‫‪- ١‬ﺘﺴﺘﻁﻴﻊ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻷﺨﻁﺎﺀ ﺍﻟﺘﻲ ﺘﻅﻬﺭ‬ ‫‪ - ٢‬ﺘﻘﻭﻡ ﺒﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ‬ ‫‪ - ٣‬ﻴﻤﻜﻥ ﻨﻘل ﺍﻟﺒﺭﻨﺎﻤﺞ ﺍﻟﻤﻜﺘﻭﺏ ﺒﻠﻐﻪ ‪ PL/SQL‬ﺇﻟﻰ ﺃﻱ ﺒﻴﺌﺔ ﺃﺨﺭﻯ ﻏﻴﺭ ﺒﻴﺌﺔ ﺍﻻﻭﺭﺍﻜل‬ ‫‪- ٤‬ﻴﻤﻜﻥ ﻜﺘﺎﺒﻪ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺠﻤل ﺃل ‪ SQL‬ﺒﺩﺍﺨل ﻜﻭﺩ ﻭﺍﺤﺩ‬ ‫ﻭﺠﻤﻠﻪ ‪ PL/SQL‬ﻋﺒﺎﺭﺓ ﻋﻥ ﻜﻭﺩ ﻤﻜﺘﻭﺏ ﻫﺫﺍ ﺍﻟﻜﻭﺩ ﻴﺴﻤﻰ ‪ Block‬ﻭﻴﺘﻜﻭﻥ ﻫﺫﺍ ﺍﻟﻜﻭﺩ ﻤﻥ ‪:‬‬ ‫‪ : declaration - ١‬ﻭﻴﺘﻡ ﻤﻥ ﺨﻼل ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﺘﻌﺭﻴﻑ ﻤﺎ ﻴﻭﺠﺩ ﺩﺍﺨل ﺃل ‪ block‬ﻤﻥ ﻤﺘﻐﻴﺭﺍﺕ‬ ‫‪variables‬‬ ‫‪ : executable command - ٢‬ﻴﺴﺘﺨﺩﻡ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻟﺘﻨﻔﻴﺫ ﺍﻷﻭﺍﻤﺭ ﺍﻟﻤﻜﺘﻭﺒﺔ ﺩﺍﺨل ‪ code‬ﻭﺘﻌﻴﻴﻥ ﺍﻟﻘﻴﻡ‬ ‫ﻟﻠﻤﺘﻐﻴﺭﺍﺕ ﻭﺍﻷﻭﺍﻤﺭ ﺍﻟﺘﻲ ﻴﺘﻡ ﻜﺘﺎﺒﺘﻬﺎ ﻋﺒﺎﺭﺓ ﻋﻥ ﺠﻤل ‪ SQL‬ﺃﻭ ﺇﺠﺭﺍﺀﺍﺕ ﺃﻭ ﺩﻭﺍل ﺃﻭ ﺃﺤﺩﺍﺙ ﺃﻭ ﺃﺸﻴﺎﺀ ﻤﺜل ﺫﻟﻙ‬ ‫‪ : exception handling - ٣‬ﻓﻲ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﺘﺘﻡ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻷﺨﻁﺎﺀ‬ ‫ﻤﺜﻼ ﺇﺫﺍ ﺤﺩﺙ ﺨﻁﺄ ﻤﻌﻴﻥ ﻭﻨﺭﻴﺩ ﻫﺫﺍ ﺍﻟﺨﻁﺄ ﻻﻴﺅﺜﺭ ﺩﺍﺨل ﺍﻟﻜﻭﺩ ﺃﻱ ﻻ ﻴﺤﺩﺙ ﺨﻁﺄ‬ ‫ﻨﺴﺘﺨﺩﻡ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻤﻥ ﺍﻟﻜﻭﺩ‬ ‫ﺃﻭﻻ ﺍﻟﺠﺯﺀ ﺍﻷﻭل ﻤﻥ ﺍﻟﻜﻭﺩ ﻭﻫﻭ ‪: Declaration‬‬ ‫ﻓﻲ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻴﺘﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﻤﺴﺘﺨﺩﻤﺔ ﺩﺍﺨل ﺍﻟﻜﻭﺩ ﻓﻴﺘﻡ ﺍﻟﺒﺩﺀ ﺒﻜﻠﻤﻪ ‪ Declare‬ﺜﻡ ﺘﻌﺭﻴﻑ‬ ‫ﺍﻟﻤﺘﻐﻴﺭﺍﺕ‬ ‫ﻭﻴﻨﺘﻬﻲ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻋﻨﺩ ﻜﻠﻤﻪ ‪begin‬‬ ‫ﺜﺎﻨﻴﺎ ﺍﻟﺠﺯﺀ ﺍﻟﺜﺎﻨﻲ ﻤﻥ ﺍﻟﻜﻭﺩ ﻭﻫﻭ ‪:executable command‬ﻴﺒﺩﺃ ﺒﺎﻟﻜﻠﻤﺔ ‪ begin‬ﻭﺒﻌﺩ ﻫﺫﻩ ﺍﻟﻜﻠﻤﺔ ﻴﺘﻡ ﻜﺘﺎﺒﻪ‬ ‫ﺍﻟﻜﻭﺩ ﺍﻟﻤﻁﻠﻭﺏ‬ ‫ﺜﺎﻟﺜﺎ ﺍﻟﺠﺯﺀ ﺍﻟﺜﺎﻟﺙ ﻤﻥ ﺍﻟﻜﻭﺩ ﻭﻫﻭ ‪ :exception handling‬ﺤﻴﺙ ﺍﻨﻪ ﻓﻲ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻴﺘﻡ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻷﺨﻁﺎﺀ‬ ‫ﺍﻟﺘﻲ ﺘﺤﺩﺙ ﻨﺘﻴﺠﺔ ﻟﻜﺘﺎﺒﻪ ﺍﻟﻜﻭﺩ‬ ‫ﻭﺒﻬﺫﺍ ﻨﻜﻭﻥ ﻗﺩ ﺘﻌﺭﻓﻨﺎ ﻋﻠﻰ ﻤﺤﺘﻭﻴﺎﺕ ﺠﻤﻠﻪ ‪PL/SQL‬‬ ‫ﻭﺍﻵﻥ ﺴﻨﻘﻭﻡ ﺒﻜﺘﺎﺒﻪ ﺒﻌﺽ ﺍﻟﺘﻌﺭﻴﻔﺎﺕ ﺍﻟﺨﺎﺼﺔ ﺏ ‪: PL/SQL‬‬ ‫‪- ١‬ﺒﻠﻭﻙ ﺍﻷﻭﺍﻤﺭ‪:PL/SQL‬‬ ‫ﻫﻭ ﺍﻟﺸﻜل ﺍﻟﻤﻁﻠﻭﺏ ﻟﻜﺘﺎﺒﻪ ﺃﻭﺍﻤﺭ ‪ PL/SQL‬ﺤﻴﺙ ﺍﻨﻪ ﻴﺸﻤل ﺍﻹﻋﻼﻥ ﻋﻥ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻷﺨﻁﺎﺀ‬ ‫‪ - ٢‬ﺍﻟﺒﺭﺍﻤﺞ ﺍﻟﻔﺭﻋﻴﺔ‪:‬ﻭﻫﻲ ﺘﻨﻘﺴﻡ ﺇﻟﻰ ﻗﺴﻤﺎﻥ ﻭﻫﻤﺎ‪:‬‬ ‫‪ : Procedure-١‬ﻫﻭ ﺒﺭﻨﺎﻤﺞ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺍﻷﻭﺍﻤﺭ ﺘﻘﻭﻡ ﺒﺎﺴﺘﻘﺒﺎل ﻤﻌﺎﻤﻼﺕ ﺃﻭ ﻻ ﺘﺴﺘﻘﺒل‬ ‫ﻤﻌﺎﻤﻼﺕ ﻭﺘﻜﻭﻥ ﺍﻟﻤﻌﺎﻤﻼﺕ ‪ IN‬ﺃﻱ ﺒﻴﻌﺕ ﻟﻪ ﻗﻴﻡ ﻭﻴﻤﻜﻥ ﺃﻥ ﺘﻜﻭﻥ ﺍﻟﻤﻌﺎﻤﻼﺕ ﻤﻥ ﺍﻟﻨﻭﻉ ‪ OUT‬ﺃﻱ ﺘﻘﻭﻡ ﺒﺈﺭﺴﺎل‬ ‫ﻗﻴﻡ ﺇﻟﻰ ﺠﻤﻠﻪ ‪Select‬‬ ‫‪ : function-٢‬ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺍﻟﺴﻁﻭﺭ ﻤﻥ ﺍﻷﻭﺍﻤﺭ ﻟﻬﺎ ﺍﺴﻡ ﻴﻤﻜﻥ ﺃﻥ ﻴﺴﺘﻘﺒل ﻤﻌﺎﻤﻼﺕ ﻭﻟﻜﻥ‬ ‫ﻻﺒﺩ ﺃﻥ ﻴﻌﻴﺩ ﻗﻴﻤﻪ‬

‫‪-٣-‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫‪-٣‬ﺍﻟﻤﻜﺘﺒﺔ ‪ :package‬ﻫﻲ ﺘﺠﻤﻴﻊ ﻟﻤﺠﻤﻭﻋﻪ ﻤﻥ ‪ procedure‬ﻭﺍﻟﺩﻭﺍل ‪ function‬ﻭﻫﻲ ﺘﺤﺘﻭﻱ ﻋﻠﻰ ﻗﺴﻡ‬ ‫ﺘﻌﺭﻴﻑ ﺍﻟﺩﻭﺍل ﻭﺍﻟﺒﺭﺍﻤﺞ ﺍﻟﻔﺭﻋﻴﺔ ﻭﻜﺫﻟﻙ ﻗﺴﻡ ﻤﺤﺘﻭﻯ ﻫﺫﻩ ﺍﻟﺩﻭﺍل ﻭﻋﻨﺩ ﺍﺴﺘﻌﻤﺎﻟﻬﺎ ﻴﺘﻡ ﺘﺤﺩﻴﺩ ﺍﺴﻡ ﺃل ‪package‬‬ ‫ﺜﻡ ﺍﺴﻡ ﺍﻟﺩﺍﻟﺔ ﺁﻭ ﺍﻟﺒﺭﻨﺎﻤﺞ ﺍﻟﻔﺭﻋﻲ‬ ‫‪ - ٤‬ﺍﻟﺤﺩﺙ ‪ :trigger‬ﻫﻲ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺍﻷﻭﺍﻤﺭ ﺍﻟﺘﻲ ﺘﻜﺘﺏ ﻤﻼﺼﻘﻪ ﻟﺤﺩﺙ ﻤﻥ ﺃﺤﺩﺍﺙ ﻗﻭﺍﻋﺩ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻤﺜل‬ ‫‪ Insert ,update ,delete‬ﻟﺘﻨﻔﻴﺫ ﺃﻭﺍﻤﺭ ﻋﻨﺩ ﻫﺫﻩ ﺍﻟﻌﻤﻠﻴﺔ‬ ‫ل ﻤﺎ ﺴﺒﻕ ﻴﺴﻤﻰ ﺒﻠﻭﻙ ‪ pl/sql‬ﺒﻠﻭﻙ ‪.‬‬ ‫*** ﻭ ﺘﻘﺴﻡ ﻟﻐﺔ ﺃل ‪ pl/sql‬ﺇﻟﻰ ﻤﺠﻤﻭﻋﺔ ﻤﻥ ﺍﻟﺒﻠﻭﻜﺎﺕ ﻭ ﺘﺤﺘﻭﻯ ﻋﻠﻰ ﺃﻜﺜﺭ ﻤﻥ ‪ ٣‬ﺃﻗﺴﺎﻡ ﻭ ﻫﻲ‬ ‫‪ -١‬ﺠﺯﺀ ﺍﻟﺘﻌﺭﻴﻑ ‪ declarative‬ﻭ ﻫﻭ ﺠﺯﺀ ﺍﺨﺘﻴﺎﺭﻱ ﻭ ﻫﻭ ﻴﺤﺘﻭﻯ ﻋﻠﻰ ﺠﻤﻴﻊ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭ ﺍﻟﺜﻭﺍﺒﺕ ﻭ‬ ‫ﺍﻟﻤﺅﺸﺭﺍﺕ ﻭﻫﻭ ﻴﺸﻴﺭ ﺇﻟﻰ ﺍﻟﺠﺯﺀ ﺍﻟﺘﻨﻔﻴﺫﻱ ﻭﻫﺫﺍ ﺍﻟﺠﺯﺀ ﺍﺨﺘﻴﺎﺭﻱ ﺍﻯ ﻴﻤﻜﻨﻨﺎ ﻋﺩﻡ ﻭﻀﻌﺔ ‪.‬‬ ‫‪ -٢‬ﺍﻟﺠﺯﺀ ﺍﻟﺘﻨﻔﻴﺫﻱ ‪ executable‬ﻭ ﻫﻭ ﺠﺯﺀ ﻀﺭﻭﺭﻱ ﺠﺩﺍ‬ ‫ﺍﻯ ﺇﺠﺒﺎﺭﻱ ﻋﻠﻰ ﺍﻟﻤﺴﺘﺨﺩﻡ ﻭ ﻴﺤﺘﻭﻯ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻋﻠﻰ ﺠﻤل ﺃل ‪ sql‬ﺍﻟﺘﻲ ﺘﻘﻭﻡ ﺒﻤﻌﺎﻟﺠﺔ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻓﻲ ﻗﺎﻋﺩﺓ‬ ‫ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫‪ -٣‬ﺠﺯﺀ ﺍﻻﺴﺘﺜﻨﺎﺀﺍﺕ ‪ exception‬ﻭ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﺍﺨﺘﻴﺎﺭﻱ ﺍﻯ ﻴﻤﻜﻨﻨﺎ ﻭﻀﻌﻪ ﺃﻭ ﻋﺩﻡ ﻭﻀﻌﻪ ﻭ ﻫﺫﺍ‬ ‫ﺍﻟﺠﺯﺀ ﻴﻘﻭﻡ ﺒﺘﺼﺤﻴﺢ ﺍﻷﺨﻁﺎﺀ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺍﻟﻜﻭﺩ‬ ‫********************************‬ ‫ﺘﺭﻜﻴﺏ ﺍﻟﺒﺭﻨﺎﻤﺞ ﻓﻲ ﻟﻐﺔ ﺃل ‪PL/SQL‬‬ ‫ﺠﺯﺀ ﺍﻟﺘﻌﺭﻴﻑ ‪Declare‬‬ ‫‪Variables , Cursor , user defined exception‬‬ ‫ﺍﻟﺠﺯﺀ ﺍﻟﺘﻨﻔﻴﺫﻱ ‪Begin‬‬ ‫‪Sql – Statement‬‬ ‫‪Pl/Sql – Statement‬‬ ‫ﺠﺯﺀ ﺘﺼﺤﻴﺢ ﺍﻷﺨﻁﺎﺀ ‪Exception‬‬ ‫‪Action To Perform When Error Occur‬‬ ‫; ‪End‬‬ ‫ﻭﺍﻵﻥ ﺴﻨﻘﻭﻡ ﺒﺎﻋﻁﺎﺀ ﺸﻜل ﻴﻭﻀﺢ ﻤﺎ ﻫﻭ ﺸﻜل ﺍﻟﻜﻭﺩ ﻓﻲ ﺍل ‪: pl/sql‬‬

‫ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻴﻭﻀﺢ ﺸﻜل ﺍﻟﻜﻭﺩ ﻓﻲ ﺒﻴﺌﺔ ﺃل ‪ pl/sql‬ﺤﻴﺙ ﺍﻨﻪ ﻴﺘﻜﻭﻥ ﻤﻥ ‪ ٣‬ﺃﺠﺯﺍﺀ ﺭﺌﻴﺴﻴﻪ ‪:‬‬

‫‪-٤-‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺍﻟﺠﺯﺀ ﺍﻷﻭل ﻭﻫﻭ ﺃل‪ declare‬ﻭﻴﺴﺘﺨﺩﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ‬ ‫ﺍﻟﺠﺯﺀ ﺍﻟﺜﺎﻨﻲ ﻭﻫﻭ ﺠﺯﺀ ﺃل ‪ begin‬ﻭﻴﺴﺘﺨﺩﻡ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻟﻜﺘﺎﺒﻪ ﻜﻭﺩ ‪pl/sql‬‬ ‫ﺍﻟﺠﺯﺀ ﺍﻟﺜﺎﻟﺙ ﻫﻭ ﺍﻟﺠﺯﺀ ﺍﻟﺨﺎﺹ ﺒﻤﻌﺎﻟﺠﻪ ﺍﻷﺨﻁﺎﺀ ﺍﻟﺘﻲ ﺘﻅﻬﺭ ﻨﺘﻴﺠﺔ ﻟﻜﺘﺎﺒﻪ ﺍﻟﻜﻭﺩ‬ ‫ﻴﺴﻤﻰ ﺃل ‪ block‬ﻓﻲ ﺃل ‪ pl/sql‬ﺏ ‪ subprogrames‬ﻭﻴﻨﻘﺴﻡ ﺃل ‪ subprogrames‬ﺇﻟﻰ ﻗﺴﻤﺎﻥ ‪:‬‬ ‫‪: procedure-١‬ﻭﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﺇﺠﺭﺍﺀ ﺃﻭ ﺤﺩﺙ ﻴﺘﻡ ﻋﻤﻠﻪ ﻻﺴﺘﻘﺒﺎل ﺒﻌﺽ ﺍﻟﻤﻌﺎﻤﻼﺕ ﻭﺍﻟﻤﻌﺎﻤﻼﺕ ﻫﻲ ﻋﺒﺎﺭﺓ‬ ‫ﻋﻥ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﺘﻲ ﺘﺄﺨﺫ ﻗﻴﻤﻪ ﺃﻭ ﺘﻌﻁﻲ ﻗﻴﻤﻪ ﻟﻠﻜﻭﺩ‬ ‫‪ :function- ٢‬ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻥ ﺩﺍﻟﻪ ﺘﻘﻭﻡ ﺒﺤﺴﺎﺏ ﻗﻴﻤﻪ ﻤﻌﻴﻨﻪ ﻭﺃﻴﻀﺎ ﺘﻘﻭﻡ ﻫﺫﻩ ﺍﻟﺩﺍﻟﺔ ﺒﺎﺴﺘﻘﺒﺎل ﺍﻟﻤﻌﺎﻤﻼﺕ ﻭﻟﻜﻥ‬ ‫ﻻﺒﺩ ﺃﻥ ﺘﻘﻭﻡ ﺍﻟﺩﺍﻟﺔ ﺒﺎﺴﺘﺭﺠﺎﻉ ﻗﻴﻤﻪ ﻟﻬﺎ‬ ‫ﻭﺴﻨﻘﻭﻡ ﺒﺩﺭﺍﺴﺔ ﻜل ﻤﻥ ﺃل ‪ procedure‬ﻭﺍل ‪ function‬ﻤﻘﺩﻤﺎ‬ ‫ﻤﺜﺎل ﺘﺠﺭﻴﺒﻲ ‪:‬‬

‫‪ -١‬ﻴﺠﺏ ﺍﻟﻭﻀﻊ ﻓﻲ ﺍﻻﻋﺘﺒﺎﺭ ﺍﻨﻪ ﻻ ﺒﺩ ﻤﻥ ﻭﺠﻭﺩ ; ﻓﻲ ﻨﻬﺎﻴﺔ ﺠﻤﻠﻪ ﺃل ‪ SQL‬ﺃﻭ ﺠﻤﻠﻪ ‪PL/SQL‬‬ ‫‪ - ٢‬ﺍﺴﺘﺨﺩﺍﻡ ‪ /‬ﻟﻜﻲ ﺘﻘﻭﻡ ﺒﺘﺸﻐﻴل ﺍﻟﻜﻭﺩ ﻓﻲ ﺠﻤﻠﻪ ‪ PL/SQL‬ﺍﻯ ﺍﻨﻪ ﺍﻟﺒﺭﻨﺎﻤﺞ ﻻ ﻴﻌﺭﻑ ﻨﻬﺎﻴﺔ ﺍﻟﻜﻭﺩ ﺇﻻ ﻋﻨﺩ‬ ‫ﻭﻀﻊ ﻫﺫﻩ ﺍﻟﻌﻼﻤﺔ‬ ‫‪ - ٣‬ﺍﺴﺘﺨﺩﺍﻡ )‪ (.‬ﺍﻟﺘﻲ ﺘﻤﻜﻨﻙ ﺒﻌﺩﻫﺎ ﺒﻜﺘﺎﺒﻪ ﺍﻯ ﺠﻤﻠﻪ ‪ PL/SQL‬ﺃﻭ ﺍﻯ ﺃﻤﺭ ﺃﺨﺭ‬ ‫** ﻻﺤﻅ ﺃﻥ ﺍﻟﻜﻠﻤﺎﺕ ‪ EXCEPTION , BEGIN , DECLARE‬ﻻ ﻴﻨﺘﻬﻭﺍ ﺏ ; ﻋﻠﻰ ﺍﻟﻌﻜﺱ ﻜﻠﻤﻪ‬ ‫‪ END‬ﻴﺠﺏ ﺃﻥ ﺘﻨﺘﻬﻲ ﺏ ;‬ ‫ﺍﻟﺒﻠﻭﻙ ‪ :‬ﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺠﻤل ﺃل ‪ SQL‬ﻭ ‪ PL/SQL‬ﺘﻜﻭﻥ ﻤﻜﺘﻭﺒﺔ ﻓﻲ ﺠﺯﺀ‬ ‫‪ EXCUTABLE‬ﻭ ﻫﺫﻩ ﺍﻟﺠﻤﻠﺔ ﺘﻜﻭﻥ ﻤﻬﻤﺔ ﺠﺩﺍ ﻓﻲ ﻜﻭﺩ ‪ PL/SQL‬ﺤﻴﺙ ﺍﻨﻪ ﺒﺩﻭﻥ ﻫﺫﻩ ﺍﻟﺠﻤﻠﺔ ﻻ‬ ‫ﻨﺴﺘﻁﻴﻊ ﺃﻥ ﻨﻜﻭﻥ ﺠﻤﻠﻪ ‪ PL/SQL‬ﻭ ﺍﻯ ﺃﻥ ﺍﻯ ﻭﺤﺩﺓ ﻓﻲ ﺃل ‪ PL/SQL‬ﺘﺸﻤل ﺒﻠﻭﻙ ﺃﻭ ﺃﻜﺜﺭ ﻭ ﻫﺫﻩ‬ ‫ﺍﻟﺒﻠﻭﻜﺎﺕ ﻤﻤﻜﻥ ﺃﻥ ﺘﻨﻔﺼل ﻋﻥ ﺍﻷﺨﺭﻯ ﻭ ﺍﻟﻭﺤﺩﺍﺕ ﺍﻻﺴﺎﺴﻴﻪ ﻫﻲ ‪( PROCEDURE ,FUNCTION ,‬‬ ‫) ‪SYNONYMOUS‬‬ ‫ﻭ ﺘﻌﺭﻑ ﺃل ‪ PROCEDURE , FUNCTION‬ﺏ ﺃل ‪ SUBPROGRAMS‬ﻭ ﺃل‬ ‫‪ SYNONYMOUS‬ﻭ ﺘﺴﻤﻰ ﺒﺎﻟﺒﻠﻭﻜﺎﺕ ﺍﻟﺘﻲ ﻟﻴﺱ ﻟﻬﺎ ﺍﺴﻡ ﻭ ﻫﻲ ﺍﻟﺘﻲ ﺘﺠﻌل ﺃل ‪ PL/SQL‬ﺒﻠﻭﻙ ﻤﻨﻁﻘﻲ‬ ‫ﺇﻟﻰ ﻤﻤﻜﻥ ﺃﻥ ﻴﺤﺘﻭﻯ ﻋﻠﻰ ﺃﺭﻗﺎﻡ ﻭ ﺒﻠﻭﻙ ﻭﺍﺤﺩ ﻴﻤﻜﻥ ﺃﻥ ﻴﻘﺩﻡ ﺠﺯﺀ ﺼﻐﻴﺭ ﻤﻥ ﺒﻠﻭﻙ ﺃﺨﺭ ﻭ ﺍﻟﺫﻱ ﻴﻜﻭﻥ ﺠﺯﺀ‬ ‫ﻤﻥ ﻭﺤﺩﺓ ﻜﻭﺩ ﻜﺒﻴﺭﺓ ‪.‬‬ ‫‪ SYNONYMOUS‬ﻫﻲ ﺍﻟﺒﻠﻭﻜﺎﺕ ﺍﻟﻐﺭ ﻤﺴﻤﺎﺓ ﻭ ﺘﺩﺨل ﻓﻲ ﺍﻟﺘﻁﺒﻴﻘﺎﺕ ﺒﻔﺎﻋﻠﻴﻪ‬ ‫‪ SUBPROGRAM‬ﻭ ﻫﻲ ﺘﺴﻤﻰ ﺒﻠﻭﻜﺎﺕ ﺃل ‪ PL/SQL‬ﻭ ﻤﻤﻜﻥ ﺃﻥ ﺘﺄﺨﺫ ﻤﻌﺎﻤﻼﺕ ‪PARAMETERS‬‬ ‫ﻭ ﻤﻤﻜﻥ ﺃﻥ ﻨﺤﻀﺭﻫﺎ ﻤﻥ ﺍﻯ ﻤﻜﺎﻥ ﺃﺨﺭ ﻭ ﻤﻤﻜﻥ ﺃﻥ ﺘﻌﺭﻑ ﺏ ‪ PROCEDURE , FUNCTION‬ﻋﻤﻭﻤﺎ‬

‫‪-٥-‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺘﺴﺘﺨﺩﻡ ﺃل ‪ PROCEDURE‬ﻓﻲ ﻋﻤل ﺍﻹﺤﺩﺍﺙ‬ ‫ﻭ ﺃل ‪ FUNCTION‬ﻓﻲ ﺤﺴﺎﺏ ﺍﻟﻘﻴﻡ‬ ‫ﻭ ﻴﻤﻜﻨﻙ ﺘﺨﺯﻴﻥ ﺃل ‪ SUBPROGRAM‬ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺍﻟﺘﻁﺒﻴﻕ ﺃﻭ ﻋﻠﻰ ﺍﻟﺴﻴﺭ ﻓﺭ ﺍﻟﺨﺎﺹ ﺏ ﺍﻻﻭﺭﺍﻜل‬ ‫ﻭﺴﻨﻘﻭﻡ ﺒﺩﺭﺍﺴﺔ ﻜل ﻤﻥ ﺃل ‪ procedure‬ﻭﺍل ‪ function‬ﻤﻘﺩﻤﺎ‬ ‫** ﻤﻼﺤﻅﻪ ﺃل ‪ FUNCTION‬ﻤﺸﺎﺒﻪ ل ‪ PROCEDURE‬ﻤﻊ ﺍﺨﺘﻼﻑ ﺃﻥ ﺃل ‪ FUNCTION‬ﻴﺠﺏ ﺃﻥ‬ ‫ﻴﺴﺘﺭﺠﻊ ﻗﻴﻡ‬ ‫ﻭ ﺘﻌﺭﻴﻑ ﺃل ‪ PROCEDURE‬ﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺠﻤﻭﻋﺔ ﻤﻥ ﺍﻷﻭﺍﻤﺭ ﻟﻬﺎ ﺍﺴﻡ ﺘﺴﺘﻘﺒل ﻤﻌﺎﻤﻼﺕ ﺃﻭ ﻻ ﺘﺴﺘﻘﺒل‬ ‫ﻭ ﺘﻌﻴﺩ ﻗﻴﺩ ﺃﻭ ﻻ ﺘﻌﻴﺩ‬ ‫ﺃﻤﺎ ‪ FUNCTION‬ﻓﻬﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺠﻤﻭﻋﺔ ﻤﻥ ﺍﻟﺴﻁﻭﺭ ﻤﻥ ﺍﻷﻭﺍﻤﺭ ﻟﻬﺎ ﺍﺴﻡ ﻴﻤﻜﻥ ﺃﻥ ﺘﺴﺘﻘﺒل ﻤﻌﺎﻤﻼﺕ ﻭ‬ ‫ﻟﻜﻥ ﻻﺒﺩ ﻤﻥ ﺃﻥ ﺘﻌﻴﺩ ﻗﻴﻡ ﻋﻨﺩ ﺍﺴﺘﺩﻋﺎﺌﻬﺎ ‪.‬‬ ‫** ﻭﺃﻻﻥ ﺴﻨﻘﻭﻡ ﺒﺎﻟﺘﻌﺭﻑ ﻋﻠﻰ ﻓﺎﺌﺩﺓ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﺘﻲ ﻴﺘﻡ ﻜﺘﺎﺒﺘﻬﺎ ﻓﻲ ﺠﺯﺀ ﺃل ‪declare‬‬ ‫ﻟﻤﺎﺫﺍ ﻴﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ؟‬ ‫ﻷﻨﻪ ﻤﻥ ﻓﻭﺍﺌﺩ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ‪: variable‬‬ ‫‪- ١‬ﻴﺘﻡ ﺘﺨﺯﻴﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻓﻴﻬﺎ ﺤﻴﺙ ﺘﻌﺘﺒﺭ ﻫﺫﻩ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻜﺄﻨﻬﺎ ﺫﺍﻜﺭﻩ ﻤﺅﻗﺘﺔ‬ ‫‪- ٢‬ﺘﺴﺘﺨﺩﻡ ﺃﻴﻀﺎ ﻫﺫﻩ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻓﻲ ﺍﻟﺤﺴﺎﺒﺎﺕ ﺒﺩﻭﻥ ﺍﻟﺭﺠﻭﻉ ﺇﻟﻰ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫‪- ٣‬ﻴﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﻫﺫﻩ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻓﻲ ﺃﺠﺯﺍﺀ ﻤﺘﻌﺩﺩﺓ ﻤﻥ ﻜﻭﺩ ‪pl/sql‬‬ ‫‪ - ٤‬ﻴﻤﻜﻥ ﺘﻌﺭﻴﻑ ﻨﻭﻉ ﺍﻟﻤﺘﻐﻴﺭ ﻤﻌﺘﻤﺩﺍ ﻋﻠﻰ ﻨﻭﻉ ﺃﻋﻤﺩﻩ ﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺠﺩﻭل ﺃﺨﺭ‬ ‫ﻜﻴﻔﻴﻪ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻓﻲ ﺒﻴﺌﺔ ‪: pl/sql‬‬ ‫‪ - ١‬ﻴﺘﻡ ﺃﻭﻻ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻓﻲ ﺒﻴﺌﺔ ﺃل ‪ pl/sql‬ﻓﻲ ﺃﻱ ﺠﺯﺀ ﻤﻥ ﺃﺠﺯﺍﺀ ‪ pl/sql‬ﺃﻭ ﻓﻲ ‪ procedure‬ﺍﻭ‬ ‫‪ function‬ﻭﻨﻘﻭﻡ ﺒﺎﺨﺘﻴﺎﺭ ﻨﻭﻉ ﺍﻟﻤﺘﻐﻴﺭ ﺴﻭﺍﺀ ﻜﺎﻥ ﺭﻗﻡ ﺃﻭ ﺤﺭﻭﻑ ﺃﻭ ﺘﺎﺭﻴﺦ‬ ‫‪- ٢‬ﻴﻤﻜﻥ ﺇﻋﻁﺎﺀ ﺍﻟﻤﺘﻐﻴﺭ ﻗﻴﻤﻪ ﺍﺒﺘﺩﺍﺌﻴﺔ ﻤﺜﻼ ﺍﻟﻤﺘﻐﻴﺭ ﻴﺒﺩﺃ ﺒﺎﻟﻘﻴﻤﺔ ‪٦‬‬ ‫‪- ٣‬ﻴﻭﺠﺩ ﺃﻨﻭﺍﻉ ﻤﻥ ﺍﻟﻤﻌﺎﻤﻼﺕ ﺃﻭ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺩﺍﺨل ﺒﻴﺌﺔ ‪ pl/sql‬ﻭﻤﻨﻬﺎ‪:‬‬ ‫• ﻤﺘﻐﻴﺭ ﻤﻥ ﺍﻟﻨﻭﻉ ‪ :in‬ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﺃﻭ ﺍﻟﻤﻌﺎﻤل ﻻﺒﺩ ﻤﻥ ﺘﺤﺩﻴﺩ ﻗﻴﻤﻪ ﻟﻪ ﻋﻨﺩ ﺍﺴﺘﺩﻋﺎﺀﻩ‬ ‫• ﻤﺘﻐﻴﺭ ﻤﻥ ﺍﻟﻨﻭﻉ ‪ :out‬ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﻴﻘﻭﻡ ﺒﺈﺭﺴﺎل ﻗﻴﻡ ﺇﻟﻰ ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ ﻓﻲ ﻟﻐﺔ ﺃل ‪pl/sql‬‬ ‫• ﻤﺘﻐﻴﺭ ﻤﻥ ﺍﻟﻨﻭﻉ ‪: in out‬ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﻻﺒﺩ ﻤﻥ ﺘﺤﺩﻴﺩ ﻗﻴﻡ ﻟﻪ ﻭﺃﻴﻀﺎ ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﻴﻘﻭﻡ ﺒﺈﺭﺴﺎل ﻗﻴﻡ ﺇﻟﻰ‬ ‫ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ ﻓﻲ ﺃل ‪pl/sql‬‬ ‫** ﻭﺍﻟﻤﺘﻐﻴﺭ ﻟﻪ ﺃﻨﻭﺍﻉ ﻤﻥ ﻫﺫﻩ ﺍﻷﻨﻭﺍﻉ ﻤﺎ ﻴﻠﻲ‪:‬‬ ‫‪ : Scalar data type-١‬ﻭﻤﻌﻨﺎﻫﺎ ﺍﻨﻪ ﻴﺄﺨﺫ ﻨﻭﻉ ﻭﺍﺤﺩ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻫﺫﻩ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺇﻤﺎ ﺭﻗﻤﻲ ﺃﻭ ﺤﺭﻓﻲ ﺃﻭ‬ ‫ﺘﺎﺭﻴﺨﻲ‬ ‫‪ : composite data type-٢‬ﻭﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﺨﺘﻠﻔﺔ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﺭﻗﻤﻴﺔ‬ ‫ﻭﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﺤﺭﻓﻴﺔ ﻭﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﺘﺎﺭﻴﺨﻴﺔ ﻤﺜل ﺍﻟﺴﺠل ﺤﻴﺙ ﻴﺤﺘﻭﻱ ﺍﻟﺴﺠل ﻋﻠﻰ ﺠﻤﻴﻊ ﺃﻨﻭﺍﻉ ﻫﺫﻩ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫‪ : lob data type-٣‬ﻫﺫﺍ ﺍﻟﻨﻭﻉ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻴﺴﺘﺨﺩﻡ ﻟﺘﺨﺯﻴﻥ ﺒﻴﺎﻨﺎﺕ ﻁﻭﻴﻠﺔ ﻗﺩ ﺘﺼل ﻓﻲ ﻁﻭﻟﻬﺎ ﺇﻟﻰ ‪٤‬‬ ‫ﺠﻴﺠﺎﺒﺎﻴﺕ ﻭﺘﺴﺘﺨﺩﻡ ﺃﻴﻀﺎ ﻓﻲ ﺘﺨﺯﻴﻥ ﺍﻟﺼﻭﺭ ﺫﺍﺕ ﺍﻟﻤﺴﺎﺤﺎﺕ ﺍﻟﻜﺒﻴﺭﺓ ﻭﻴﻭﺠﺩ ﺃﻨﻭﺍﻉ ﻤﺨﺘﻠﻔﺔ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ‪ lob‬ﻤﻥ‬ ‫ﻫﺫﻩ ﺍﻟﺒﻴﺎﻨﺎﺕ‪:‬‬ ‫**‪ :blob‬ﻨﻭﻉ ﻤﻥ ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺤﻴﺙ ﺍﻨﻪ ﻴﻘﻭﻡ ﺒﺘﺨﺯﻴﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻋﻠﻰ ﻫﻴﺌﻪ ﺒﻴﺎﻨﺎﺕ ﺜﻨﺎﺌﻴﻪ ﺤﺘﻰ ﻴﺴﺘﻁﻴﻊ ﺍﻟﺘﻌﺎﻤل‬ ‫ﻤﻌﻬﺎ ﺤﻴﺙ ﺍﻨﻪ ﻭﻫﺫﺍ ﺍﻟﻨﻭﻉ ﺨﺎﺹ ﺒﺎﻟﺼﻭﺭ ﻭ ﻤﻠﻔﺎﺕ ﻨﺼﻴﻪ ﻤﺜﻼ ﻴﻘﻭﻡ ﺒﺘﺤﻭﻴل ﺍﻟﺼﻭﺭ ﺇﻟﻰ ﻤﻠﻔﺎﺕ ﺜﻨﺎﺌﻴﻪ‬ ‫ﺘﺴﻤﻰ)‪ (Binary‬ﻭﺍﻟﻤﻠﻔﺎﺕ ﺍﻟﺜﻨﺎﺌﻴﺔ ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﻠﻔﺎﺕ ﻟﻬﺎ ﺍﻤﺘﺩﺍﺩ ﻤﻌﻴﻥ ﻴﻘﻭﻡ ﺍﻻﻭﺭﺍﻜل ﺒﺎﻟﺘﻌﺎﻤل ﻤﻊ ﻫﺫﺍ‬ ‫ﺍﻻﻤﺘﺩﺍﺩ ﻟﺫﻟﻙ ﻴﻘﻭﻡ ﺒﺘﺤﻭﻴل ﺍﻟﺼﻭﺭ ﺇﻟﻰ ﻤﻠﻔﺎﺕ ﺜﻨﺎﺌﻴﻪ‬ ‫**‪ :clob‬ﻫﻲ ﻨﻭﻉ ﻤﻥ ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﺘﻲ ﺘﺘﻌﺎﻤل ﻤﻊ ﺍﻟﺤﺭﻭﻑ ﺃﻭ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﺤﺭﻓﻴﺔ ﺍﻟﻜﺒﻴﺭﺓ ﻓﻲ ﺍﻟﻤﺴﺎﺤﺔ ﻭﺍﻟﺘﻲ‬ ‫ﻴﺼل ﻁﻭﻟﻬﺎ ﺇﻟﻰ ‪ ٤‬ﺠﻴﺠﺎﺒﺎﻴﺕ ﺤﻴﺙ ﺍﻨﻪ ﺃﻴﻀﺎ ﻴﺘﻡ ﺘﺤﻭﻴﻠﻪ ﺇﻟﻰ ﺒﻴﺎﻨﺎﺕ ﺜﻨﺎﺌﻴﻪ ﺤﺘﻰ ﻴﺴﺘﻁﻴﻊ ﺍﻻﻭﺭﺍﻜل ﺍﻟﺘﻌﺎﻤل ﻤﻌﻪ‬ ‫**‪ :Bfile‬ﻫﺫﺍ ﺃﻴﻀﺎ ﻨﻭﻉ ﺁﺨﺭ ﻤﻥ ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻫﺫﺍ ﺍﻟﻨﻭﻉ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻴﺘﻌﺎﻤل ﻤﻊ ﺃل ‪ file‬ﺃﻭ ﻤﻘﺎﻁﻊ ﻤﻥ‬ ‫ﺃﻓﻼﻡ ﺃﻭ ﻤﺴﻠﺴﻼﺕ ‪ movie‬ﻭﻴﺘﻡ ﺃﻴﻀﺎ ﺘﺤﻭﻴﻠﻪ ﺇﻟﻰ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﺜﻨﺎﺌﻴﺔ ﺤﺘﻰ ﻴﺴﺘﻁﻴﻊ ﺍﻻﻭﺭﺍﻜل ﺍﻟﺘﻌﺎﻤل ﻤﻌﻬﺎ‬ ‫‪ : Boolean data type-٤‬ﻭﻫﻲ ﺘﺨﺘﺒﺭ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻫل ﻫﻲ ﺼﺤﻴﺤﺔ ﺃﻡ ﺨﺎﻁﺌﺔ ﻭﺘﺄﺨﺫ ﺍﻟﻘﻴﻡ ‪ true‬ﺃﻭ‪false‬‬ ‫ﻭﺘﻭﺠﺩ ﻤﺘﻐﻴﺭﺍﺕ ﺃﺨﺭﻯ ﻻ ﺘﻌﺘﺒﺭ ﻫﺫﻩ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻤﻥ ﺒﻴﺌﺔ ﺇل ‪ pl/sql‬ﻤﻥ ﻫﺫﻩ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻤﺘﻐﻴﺭﺍﺕ ﺘﺴﻤﻰ‪:‬‬ ‫‪:Bind variable‬ﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺘﻐﻴﺭ ﻴﺘﻡ ﺘﻌﺭﻴﻔﻪ ﻓﻲ ﺠﻤﻠﻪ ﺃل ‪ declare‬ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﻴﻌﺎﺩ ﺍﺴﺘﺨﺩﺍﻤﻪ ﻤﺭﻩ‬ ‫ﺃﺨﺭﻯ‬ ‫‪-٦-‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫**‪:Scaler data type‬‬ ‫ﻟﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻓﻲ ﺒﻴﺌﺔ ﺃل ‪ pl/sql‬ﻤﺎ ﻓﻲ ﺍﻟﻤﺜﺎل ﺍﻵﺘﻲ‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻓﻲ ﺠﺯﺀ ‪ Declare‬ﺍﻟﻤﺘﻐﻴﺭ ﺍﻷﻭل ﻭﻫﻭ ﺍﻟﺭﻗﻡ ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺭﻗﻤﻲ ﻭﻁﻭل‬ ‫ﺍﻷﺭﻗﺎﻡ ﺒﺩﺍﺨﻠﻪ ﻻ ﻴﺘﻌﺩﻯ ‪ ٨‬ﺃﺭﻗﺎﻡ ﻭﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﺜﺎﻨﻲ ﻫﻭ ﺍﻻﺴﻡ ﻭﻫﻭ ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺤﺭﻓﻲ ﺜﻡ ﻓﻲ ﺠﺯﺀ ﺃل ‪Begin‬‬ ‫ﻨﺭﻴﺩ ﺃﻥ ﻴﻀﻊ ﺒﻴﺎﻨﺎﺕ ﺍﻟﻁﻼﺏ ﺩﺍﺨل ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ‪ v_id ,v_name‬ﻭﻴﺴﻤﻰ ﻫﺫﺍ ﺃﻴﻀﺎ ﺏ ‪Scalar variable‬‬ ‫ﻭﺫﻟﻙ ﻷﻨﻪ ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﻨﻭﻉ ﻭﺍﺤﺩ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺃﻤﺎ ﺭﻗﻤﻲ ﺁﻭ ﺤﺭﻓﻲ ﺃﻭ ﺘﺎﺭﻴﺨﻲ ﻓﺎﻟﻤﺘﻐﻴﺭ ﺍﻷﻭل ﻨﻭﻋﻪ ﺭﻗﻤﻲ‬ ‫ﻭﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﺜﺎﻨﻲ ﻨﻭﻋﻪ ﺤﺭﻓﻲ ﻟﺫﻟﻙ ﻴﺘﻡ ﺍﻋﺘﺒﺎﺭﻫﻡ ‪Scalar variable‬‬ ‫ﻭﻟﻜﻥ ﺍﻟﺴﺅﺍل ﻫل ﺍﻟﻤﺘﻐﻴﺭ ﻤﻤﻜﻥ ﺃﻥ ﻴﻭﺠﺩ ﺒﺩﺍﺨﻠﻪ ﻗﻴﻤﻪ ﺨﺎﻟﻴﻪ ﻭﺇﺫﺍ ﺤﺩﺙ ﺇﺠﺭﺍﺀ ﺃﻱ ﻋﻤﻠﻴﻪ ﺤﺴﺎﺒﻴﻪ ﻋﻠﻰ ﺍﻟﻘﻴﻡ‬ ‫ﺍﻟﺨﺎﻟﻴﺔ ﻜﻴﻑ ﺴﻴﺘﻡ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻟﻘﻴﻡ ﺍﻟﺨﺎﻟﻴﺔ‬ ‫ﺍﻟﻘﻴﻡ ﺍﻟﺨﺎﻟﻴﺔ ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻥ ﻗﻴﻡ ﻻ ﺘﺴﺎﻭﻱ ﺍﻟﺼﻔﺭ ﻭﻟﻜﻥ ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻥ ﻗﻴﻡ ﻏﻴﺭ ﻤﻭﺠﻭﺩﺓ ﺃﻱ ﻟﻡ ﻴﺘﻡ ﺇﺩﺨﺎل ﻗﻴﻡ‬ ‫ﻟﻬﺫﺍ ﺍﻟﺤﻘل ﻭﻴﺘﻡ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﻫﺫﻩ ﺍﻟﻘﻴﻡ ﻜﻤﺎ ﻴﻠﻲ‪:‬‬ ‫‪- ١‬ﺇﺫﺍ ﺘﻡ ﺘﻁﺒﻴﻕ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺤﺴﺎﺒﻴﺔ ﻤﺜل)‪ (+‬ﺃﻭ ) –( ﺃﻭ)*( ﻓﻌﻨﺩ ﺠﻤﻪ ﺃﻭ ﻁﺭﺡ ﺃﻭ ﻀﺭﺏ ﺃﻱ ﻗﻴﻤﻪ ﻓﻲ ‪Null‬‬ ‫ﺘﺭﺠﻊ‬ ‫ﺒﺎﻟﻘﻴﻤﺔ ‪ null‬ﻓﻤﺜﻼ ﻟﻭ ﻟﺩﻴﻨﺎ ‪ x=null‬ﻭ‪ y=5‬ﻋﻨﺩ ﻋﻤل ﺍﻟﻌﻤﻠﻴﺔ ﺍﻟﺤﺴﺎﺒﻴﺔ ‪ x+y‬ﺍﻟﻨﺎﺘﺞ ﻴﻜﻭﻥ ﻤﺴﺎﻭﻱ ﻟﻠﻘﻴﻤﺔ ‪null‬‬ ‫ﺃﻱ ﺍﻨﻪ ﻓﻲ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺤﺴﺎﺒﻴﺔ ﻴﺭﺠﻊ ﺒﺎﻟﻘﻴﻤﺔ ‪Null‬‬ ‫‪- ٢‬ﻋﻨﺩ ﺘﻁﺒﻴﻕ ﻋﻼﻤﺎﺕ ﺍﻟﻤﻘﺎﺭﻨﺔ ﻤﺜل ‪ If‬ﻓﺈﻨﻬﺎ ﺃﻴﻀﺎ ﺘﺭﺠﻊ ﺒﻘﻴﻤﻪ ‪ Null‬ﻓﻤﺜﻼ ﻟﻭ ﻟﺩﻴﻨﺎ ﺍﻟﻤﺘﻐﻴﺭ ‪x= null‬‬ ‫ﻭﺍﻟﻤﺘﻐﻴﺭ ‪ y=5‬ﻭﻋﻨﺩ ﺘﻁﺒﻴﻕ ﺍﻟﺩﺍﻟﺔ ‪ If‬ﻋﻠﻰ ‪ x‬ﻭ ‪ y‬ﻤﺜل ‪ if x!=y‬ﻴﻜﻭﻥ ﺍﻟﻨﺎﺘﺞ =‪Null‬‬ ‫‪- ٣‬ﻋﻨﺩ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻤﻌﺎﻤل ‪ And‬ﺃﻭ ﺍﻟﻤﻌﺎﻤل ‪ Not‬ﺃﻭ ﺍﻟﻤﻌﺎﻤل ‪ Or‬ﻤﻊ ﺍﻟﻘﻴﻡ ﺍﻟﺨﺎﻟﻴﺔ ﻴﻜﻭﻥ ﺍﻟﻨﺎﺘﺞ ﺃﻴﻀﺎ ﻗﻴﻤﻪ ﺨﺎﻟﻴﻪ‬ ‫ﺃﻭﻻ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻤﻌﺎﻤل ‪ AND‬ﻤﻊ ﺍﻟﻘﻴﻡ ﺍﻟﺨﺎﻟﻴﺔ‬ ‫ﺍﻟﻘﻴﻤﺔ ‪NULL‬‬ ‫ﺍﻟﻨﺎﺘﺞ ‪NULL‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ ﻭﻟﻜﻥ‬ ‫ﺨﺎﻟﻲ ﻤﻥ ﺍﻟﻘﻴﻡ‬ ‫ﺍﻟﻨﺎﺘﺞ ‪FALSE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ‬ ‫ﺍﻟﻨﺎﺘﺞ ‪NULL‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ ﻭﻟﻜﻥ‬

‫ﺍﻟﻘﻴﻤﺔ‪FALSE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ‪FALSE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻻ ﻴﻅﻬﺭ‬ ‫ﺍﻟﻨﺎﺘﺞ‬ ‫ﺍﻟﻨﺎﺘﺞ‬ ‫ﺍﻟﻨﺎﺘﺞ‬ ‫ﺍﻟﻨﺎﺘﺞ‬

‫‪FALSE‬‬ ‫ﻻ ﻴﻅﻬﺭ‬ ‫‪FALSE‬‬ ‫ﻴﻅﻬﺭ‬

‫ﺍﻟﻘﻴﻤﺔ ‪TRUE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ‪TRUE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ‬

‫ﺍﻟﻤﻌﺎﻤل ‪AND‬‬ ‫ﺍﻟﻘﻴﻤﺔ ‪TRUE‬‬

‫ﺍﻟﻨﺎﺘﺞ‪FALSE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻻ ﻴﻅﻬﺭ‬ ‫ﺍﻟﻨﺎﺘﺞ ‪NULL‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ ﻭﻟﻥ‬

‫ﺍﻟﻘﻴﻤﺔ ‪FALSE‬‬

‫‪-٧-‬‬

‫ﺍﻟﻘﻴﻤﺔ ‪NULL‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻴﻜﻭﻥ ﺨﺎﻟﻲ ﻤﻥ ﻗﻴﻡ‬

‫ﺨﺎﻟﻲ ﻤﻥ ﺍﻟﻘﻴﻡ‬

‫ﺜﺎﻨﻴﺎ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻤﻌﺎﻤل ‪ OR‬ﻤﻊ ﺍﻟﻘﻴﻡ ﺍﻟﺨﺎﻟﻴﺔ‬ ‫ﺍﻟﻘﻴﻤﺔ ‪NULL‬‬ ‫ﺍﻟﻨﺎﺘﺞ ‪TRUE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ‬ ‫ﺍﻟﻨﺎﺘﺞ ‪FALSE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ‬ ‫ﺍﻟﻨﺎﺘﺞ ‪NULL‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ ﻭﻟﻜﻥ‬ ‫ﺨﺎﻟﻲ ﻤﻥ ﺍﻟﻘﻴﻡ‬

‫ﺍﻟﻘﻴﻤﺔ‪FALSE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ‪TRUE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ‬ ‫ﺍﻟﻨﺎﺘﺞ ‪FALSE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻻ ﻴﻅﻬﺭ‬ ‫ﺍﻟﻨﺎﺘﺞ ‪NULL‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ ﻭﺍﻥ‬ ‫ﺨﺎﻟﻲ ﻤﻥ ﺍﻟﻘﻴﻡ‬

‫ﺍﻟﻨﺎﺘﺞ ‪TRUE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ‬ ‫ﺍﻟﻨﺎﺘﺞ‪TRUE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ‬ ‫ﺍﻟﻨﺎﺘﺞ ‪TRUE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻴﻅﻬﺭ‬

‫ﺍﻟﻤﻌﺎﻤل ‪OR‬‬ ‫ﺍﻟﻘﻴﻤﺔ ‪TRUE‬‬ ‫ﺍﻟﻘﻴﻤﺔ ‪FALSE‬‬ ‫ﺍﻟﻘﻴﻤﺔ ‪NULL‬‬

‫ﻭﻟﻜﻥ ﻫل ﻴﻭﺠﺩ ﻁﺭﻴﻘﻪ ﺃﺨﺭﻯ ﻟﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺃﻭ ﻁﺭﻴﻘﻪ ﺃﺨﺭﻯ ﻟﻤﻌﺭﻓﻪ ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺩﻭﻥ ﻜﺘﺎﺒﻪ ﻜل ﻨﻭﻉ‬ ‫ﺍﻟﺒﻴﺎﻥ ﺍﻟﻤﻁﻠﻭﺏ‬ ‫ﻴﻤﻜﻥ ﺍﺴﺘﺨﺩﺍﻡ ‪ %Type‬ﻭﻤﻌﻨﺎﻫﺎ ﺍﻨﻪ ﻴﺭﻴﺩ ﻨﻔﺱ ﻨﻭﻉ ﺍﻟﺒﻴﺎﻥ ﺴﻭﺍﺀ ﻜﺎﻥ ﺭﻗﻤﻲ ﺍﻭ ﺤﺭﻓﻲ ﺍﻭ ﺘﺎﺭﻴﺨﻲ‬ ‫ﻤﺜﺎل ﻋﻠﻰ ﺍﺴﺘﺨﺩﺍﻡ ‪: %Type‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺒﺎﺴﺘﺨﺩﺍﻡ ‪ %Type‬ﻭﻤﻌﻨﺎﻫﺎ ﻨﻔﺱ ﻨﻭﻉ ﺍﻟﺒﻴﺎﻥ ﻓﻤﺜﻼ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻼﺤﻅ ﺃﻥ‬ ‫ﺍﻟﻤﺘﻐﻴﺭ ‪ Id‬ﻫﻭ ﻨﻔﺱ ﻨﻭﻉ ﺍﻟﺒﻴﺎﻥ ﻟﻠﻌﻤﻭﺩ ﺃﺭﻗﺎﻡ ﺍﻟﻁﻼﺏ ‪ stud_id‬ﺍﻟﻤﻭﺠﻭﺩ ﻓﻲ ﺠﺩﻭل ﺍﻟﻁﻼﺏ ﺤﻴﺙ ﺃﻥ ﻨﻭﻉ‬ ‫ﺍﻟﺒﻴﺎﻥ ﻓﻲ ﻋﻤﻭﺩ ﺃﺭﻗﺎﻡ ﺍﻟﻁﻼﺏ ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺭﻗﻤﻲ ﻟﺫﻟﻙ ﻴﺄﺨﺫ ﻫﻭ ﺃﻴﻀﺎ ﻫﺫﺍ ﺍﻟﻨﻭﻉ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻭﻫﻭ ﺍﻟﺭﻗﻤﻲ‬ ‫ﻭﻴﻭﺠﺩ ﻤﺘﻐﻴﺭ ﺃﺨﺭ ﻭﻫﻭ ﺍﻻﺴﻡ ﻴﺄﺨﺫ ﺃﻴﻀﺎ ﻨﻔﺱ ﻨﻭﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﻋﻤﻭﺩ ﺃﺴﻤﺎﺀ ﺍﻟﻁﻼﺏ ﻭﻫﻲ ﺍﻟﻨﻭﻉ‬ ‫ﺍﻟﺤﺭﻓﻲ ﻭﻫﺫﻩ ﻫﻲ ﻓﺎﺌﺩﺓ ﺍﺴﺘﺨﺩﺍﻡ ‪. %type‬‬ ‫ﻣﺜﺎل‪:‬‬

‫‪-٨-‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﺗﻌﺮﯾﻒ ﻣﺘﻐﯿﺮ ھﺬا اﻟﻤﺘﻐﯿﺮ اﺳﻤﮫ ‪ Stud_id‬وھﻮ رﻗﻢ اﻟﻄﺎﻟﺐ وﻧﺮﯾﺪ ﻣﻦ اﻟﺠﺪول أرﻗﺎم اﻟﻄﻼب‬ ‫وھﺬا اﻟﻌﻤﻮد اﺳﻤﮫ ‪ stud_id‬أي ھﻮ ﻧﻔﺲ اﺳﻢ اﻟﻤﺘﻐﯿﺮ وھﺬا ﯾﺆدي إﻟﻰ ﺗﻀﺎرب وﯾﻨﺘﺞ ﺧﻄﺄ ﻣﻌﻨﺎه اﻧﮫ ﯾﻮﺟﺪ ﺻﻔﻮف‬ ‫ﻛﺜﯿﺮة ﺗﺄﺗﻲ ﻣﻦ اﻟﺠﺪول وﻟﺤﻞ اﻟﻤﺸﻜﻠﺔ ﻟﻠﺘﺪاﺧﻞ ﺑﯿﻦ اﻷﺳﻤﺎء‬ ‫ﻧﺘﺒﻊ اﻵﺗﻲ‪:‬‬

‫‪-٩-‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﺗﻐﯿﯿﺮ اﺳﻢ اﻟﻤﺘﻐﯿﺮ ﺑﻮﺿﻊ اﻟﺤﺮف ‪ v‬ﻗﺒﻞ اﺳﻤﮫ وھﺬا ﯾﺆدي اﻟﻰ اﻻﺧﺘﻼف ﺑﯿﻦ اﺳﻢ اﻟﻌﻤﻮد واﺳﻢ‬ ‫اﻟﻤﺘﻐﯿﺮ وﯾﺆدي إﻟﻰ ﻧﺠﺎح اﻟﻌﻤﻠﯿﺔ‬ ‫وﻟﻜﻦ إذا ﺣﺪث ﺧﻄﺄ ﻋﻨﺪ ﻛﺘﺎﺑﮫ اﻟﻜﻮد ﻓﻲ أل ‪ pl/sql‬ﯾﻤﻜﻦ اﻟﺘﻌﺎﻣﻞ ﻣﻌﮫ‬ ‫ﻣﺜﻞ ھﺬا اﻟﻤﺜﺎل‪:‬‬

‫ﻣﻌﻨﻰ ھﺬا اﻟﺨﻄﺄ اﻧﮫ ﯾﻮﺟﺪ أﺳﻤﺎء ﻛﺜﯿﺮة ﺗﺄﺗﻲ ﻣﻦ ﺟﺪول اﻟﻄﻼب‬ ‫وﻟﻜﻦ إذا أردﻧﺎ ﻣﻌﺎﻟﺠﮫ ھﺬا اﻟﺨﻄﺄ ﻧﺮى اﻟﻤﺜﺎل اﻷﺗﻲ‪:‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﻣﻌﺎﻟﺠﮫ اﻟﺨﻄﺄ اﻟﺬي ﻇﮭﺮ ﺳﺎﺑﻘﺎ وھﻮ اﻧﮫ ﯾﻮﺟﺪ ﻋﺪد ﻛﺒﯿﺮ ﻣﻦ اﻷﺳﻤﺎء ﺗﺄﺗﻲ ﻣﻦ اﻟﺠﺪول ﻓﯿﺘﻢ ﻛﺘﺎﺑﮫ‬ ‫ﺟﺰء أل ‪ Exception‬اﻟﺬي ﯾﺴﺘﺨﺪم ﻓﻲ ﻣﻌﺎﻟﺠﮫ اﻷﺧﻄﺎء ﺛﻢ ﻧﻜﺘﺐ ﺑﯿﻦ ‪ when‬و ‪ then‬اﻟﺨﻄﺄ اﻟﺬي ﯾﻈﮭﺮ‬ ‫ﺛﻢ ﻧﻜﺘﺐ ﺟﻤﻠﮫ ﺗﺤﻞ ھﺬا اﻟﺨﻄﺄ وھﻲ ﻣﺜﻼ ﺟﻤﻠﮫ ﻃﺒﺎﻋﮫ ﻣﺜﻞ اﻟﺠﻤﻠﺔ اﻟﺴﺎﺑﻘﺔ وﺑﮭﺬا ﻧﻜﻮن ﻗﺪ ﻋﺎﻟﺠﻨﺎ اﻷﺧﻄﺎء‬ ‫ﺍﻟﻜﻭﺩ ﺩﺍﺨل ﺃل ‪ Pl/sql‬ﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺠﻤل ﺃل ‪ Sql‬ﻭﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺃﻥ ﺘﺤﺘﻭﻱ ﻋﻠﻰ ﻋﻼﻤﺎﺕ‬ ‫ﺤﺴﺎﺒﻴﻪ ﻤﻥ ﻫﺫﻩ ﺍﻟﻌﻼﻤﺎﺕ )=‪ (+,-,*,/,‬ﻭﺘﺴﻤﻰ ﻫﺫﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺒﺎﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺒﺴﻴﻁﺔ ﻭﺘﻭﺠﺩ ﺃﻴﻀﺎ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﻤﻌﻘﺩﺓ‬ ‫ﻤﺜل )=‪ (<>,||,!=,/*,*/,:‬ﻭﻜل ﻫﺫﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻴﺘﻡ ﺍﺴﺘﺨﺩﺍﻤﻬﺎ ﺩﺍﺨل ﺠﻤل ﺃل ‪pl/sql‬‬ ‫ﻭﻴﻭﺠﺩ ﺠﺯﺀ ﺍﻟﺘﻌﺭﻴﻔﺎﺕ ﻓﻲ ﺠﻤﻠﻪ ﺃل ‪ pl/sql‬ﻭﻫﻭ ﺠﺯﺀ ﺃل ‪ declare‬ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻴﺴﺘﺨﺩﻡ ﻓﻲ ﺘﻌﺭﻴﻑ‬ ‫ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻜﻤﺎ ﺘﻡ ﻤﻌﺭﻓﺘﻪ ﺴﺎﺒﻘﺎ ﻭﻟﻜﻥ ﺘﻭﺠﺩ ﺸﺭﻭﻁ ﻋﻨﺩ ﺍﺴﺘﺨﺩﺍﻡ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻭﻫﻲ ‪:‬‬ ‫‪- ١‬ﺍﻟﻤﺘﻐﻴﺭ ﻤﻤﻜﻥ ﺃﻥ ﻴﺼل ﻁﻭل ﺍﻟﻜﻠﻤﺔ ﺇﻟﻰ ﺃﻜﺜﺭ ﻤﻥ ‪٣٠‬ﺤﺭﻑ‬ ‫‪- ٢‬ﻴﺠﺏ ﺃﻥ ﻴﺒﺩﺃ ﺍﻟﻤﺘﻐﻴﺭ ﺒﺤﺭﻭﻑ ﺃﺒﺠﺩﻴﻪ ﻭﻟﻴﺱ ﺃﺭﻗﺎﻡ ﺃﻭ ﻋﻼﻤﺎﺕ ﺨﺎﺼﺔ‬ ‫‪- ١٠ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫‪- ٣‬ﻻ ﻴﺠﺏ ﺃﻥ ﻨﺨﺘﺎﺭ ﺍﺴﻡ ﺍﻟﻤﺘﻐﻴﺭ ﻴﻜﻭﻥ ﻫﺫﺍ ﺍﻻﺴﻡ ﻤﻭﺠﻭﺩ ﻜﺎﺴﻡ ﻋﻤﻭﺩ ﻓﻲ ﺍﻟﺠﺩﻭل ﺤﻴﺙ ﺍﻨﻪ ﻴﺤﺩﺙ ﺘﻀﺎﺭﺏ‬ ‫ﺒﻴﻥ ﺍﺴﻡ ﺍﻟﻌﻤﻭﺩ ﻭﺍﺴﻡ ﺍﻟﻤﺘﻐﻴﺭ‬ ‫‪- ٤‬ﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺃﻥ ﻴﻜﺘﺏ ﺩﺍﺨل ﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﻌﻼﻤﺎﺕ) ‪ $‬ﺃﻭ _ ﺃﻭ ‪( space‬‬ ‫‪- ٥‬ﻋﻨﺩﻤﺎ ﻨﻌﻁﻲ ﻟﻠﻤﺘﻐﻴﺭ ﻗﻴﻤﻪ ﻫﺫﻩ ﺍﻟﻘﻴﻤﺔ ﻋﺒﺎﺭﺓ ﻋﻥ ﺤﺭﻭﻑ ﺘﻭﻀﻊ ﻫﺫﻩ ﺍﻟﺤﺭﻭﻑ ﺒﻴﻥ‪single quotation‬‬ ‫)' '( ﻭﻟﻜﻥ ﺍﻷﺭﻗﺎﻡ ﻻ ﺘﻭﻀﻊ ﺒﻴﻥ )' '(‬ ‫‪ - ٦‬ﻴﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺃل )‪(/‬ﻓﻲ ﺃﺨﺭ ﺍﻟﺠﻤﻠﺔ ﻟﻌﻤل ﺘﺸﻐﻴل ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ ﺤﻴﺙ ﺍﻨﻪ ﺒﺩﻭﻥ ﻜﺘﺎﺒﻪ ﻫﺫﻩ ﺍﻟﻌﻼﻤﺔ ﻻ ﻴﺘﻡ‬ ‫ﺘﺸﻐﻴل ﺍﻟﻜﻭﺩ‬ ‫ﻭﻟﻜﻥ ﻓﻲ ﺃﺠﺯﺍﺀ ﺃﺨﺭﻯ ﻤﻥ ﺠﻤل ‪pl/sql‬‬ ‫‪ : Host variable‬ھﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺘﻐﯿﺮ ﯾﺴﺘﺨﺪم ﻓﻲ ﺟﻤﻠﮫ أل ‪ declear‬أوﻻ ﺛﻢ ﯾﻌﺎد اﺳﺘﺨﺪاﻣﮫ ﻣﺮه أﺧﺮى ﻓﻲ‬ ‫ﺟﺰء ‪ executable block‬ﻓﻌﻨﺪ اﺳﺘﺨﺪاﻣﮫ ﻓﻲ ‪ executable block‬ﻣﺮه أﺧﺮى ﯾﺘﻢ وﺿﻊ )‪(:‬وھﺬه اﻟﻌﻼﻣﺔ‬ ‫ﺗﻮﺿﻊ ﻗﺒﻞ اﻟﻤﺘﻐﯿﺮ وھﺬه اﻟﻌﻼﻣﺔ ﺗﺪل ﻋﻠﻰ اﻧﮫ ‪Host variable‬‬ ‫وﻟﻜﻲ ﻧﺄﺗﻲ ﺑﺎﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﺠﺪول ﻧﺴﺘﺨﺪم ﺟﻤﻠﮫ أل ‪ Select‬اﻟﺘﻲ ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮭﺎ ﻓﻲ أل ‪ Sql‬ﻣﻊ إﺟﺮاء ﻋﻤﻠﯿﺎت أل‬ ‫‪Insert‬و ‪ Update‬و ‪ Delete‬ﻛﻤﺎ ﻧﻔﻌﻞ ﻓﻲ أل ‪Sql‬‬ ‫ﻭﺃﻻﻥ ﺴﻨﻘﻭﻡ ﺒﺘﻭﻀﻴﺢ ﻤﺜﺎل ﻟﻠﻤﺘﻐﻴﺭﺍﺕ‪:‬‬

‫وﻟﻜﻦ إذا أردﻧﺎ إﻇﮭﺎر اﻟﻤﺘﻐﯿﺮ اﻟﺬي ﺑﮫ اﻟﻨﺎﺗﺞ ﻧﺘﺒﻊ ﻛﻤﺎ ﻓﻲ اﻟﻤﺜﺎل اﻵﺗﻲ‪:‬‬

‫‪- ١١ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﺇﻅﻬﺎﺭ ﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﺫﻱ ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﺍﻟﻨﺎﺘﺞ ﻨﻜﺘﺏ ﺍﻟﺠﻤﻠﺔ ‪ Print‬ﺜﻡ ﺍﺴﻡ ﺍﻟﻤﺘﻐﻴﺭ ﻨﻼﺤﻅ ﺍﻨﻪ‬ ‫ﻴﻅﻬﺭ ﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ ﺭﻗﻡ ‪ ١‬ﻓﻲ ﺍﻟﻤﺘﻐﻴﺭ‬ ‫ﯾﺠﺐ ان ﯾﻜﻮن اﺳﻢ اﻟﻤﺘﻐﯿﺮ ﻣﺨﺘﻠﻒ ﻋﻦ اﺳﻢ اﻻﻋﻤﺪه اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﺠﺪول وذﻟﻚ ﻷﻧﮫ إذا ﻛﺎن اﺳﻢ اﻟﻤﺘﻐﯿﺮ ھﻮ ﻧﻔﺴﮫ‬ ‫اﺳﻢ اﻟﻌﻤﻮد ﻓﮭﺬا ﯾﺆدي إﻟﻰ ﺗﻀﺎرب ﻓﻲ ﺟﻤﻠﮫ أل ‪ pl/sql‬ھﺬا اﻟﺘﻀﺎرب ﺑﺴﺒﺐ أن اﺳﻢ اﻟﻤﺘﻐﯿﺮ ھﻮ ﻧﻔﺴﮫ اﺳﻢ اﻟﻌﻤﻮد‬ ‫ﻣﺜﺎل‪:‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﺗﻌﺮﯾﻒ ﻣﺘﻐﯿﺮ ھﺬا اﻟﻤﺘﻐﯿﺮ اﺳﻤﮫ ‪ Stud_id‬وھﻮ رﻗﻢ اﻟﻄﺎﻟﺐ وﻧﺮﯾﺪ ﻣﻦ اﻟﺠﺪول أرﻗﺎم اﻟﻄﻼب‬ ‫وھﺬا اﻟﻌﻤﻮد اﺳﻤﮫ ‪ stud_id‬أي ھﻮ ﻧﻔﺲ اﺳﻢ اﻟﻤﺘﻐﯿﺮ وھﺬا ﯾﺆدي إﻟﻰ ﺗﻀﺎرب وﯾﻨﺘﺞ ﺧﻄﺄ ﻣﻌﻨﺎه اﻧﮫ ﯾﻮﺟﺪ ﺻﻔﻮف‬ ‫ﻛﺜﯿﺮة ﺗﺄﺗﻲ ﻣﻦ اﻟﺠﺪول‬ ‫وﻟﺤﻞ اﻟﻤﺸﻜﻠﺔ ﻟﻠﺘﺪاﺧﻞ ﺑﯿﻦ اﻷﺳﻤﺎء ﻧﺘﺒﻊ اﻵﺗﻲ‪:‬‬

‫‪- ١٢ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﺗﻐﯿﯿﺮ اﺳﻢ اﻟﻤﺘﻐﯿﺮ ﺑﻮﺿﻊ اﻟﺤﺮف ‪ v‬ﻗﺒﻞ اﺳﻤﮫ وھﺬا ﯾﺆدي اﻟﻰ اﻻﺧﺘﻼف ﺑﯿﻦ اﺳﻢ اﻟﻌﻤﻮد واﺳﻢ‬ ‫اﻟﻤﺘﻐﯿﺮ وﯾﺆدي إﻟﻰ ﻧﺠﺎح اﻟﻌﻤﻠﯿﺔ‬ ‫وﻟﻜﻦ إذا ﺣﺪث ﺧﻄﺄ ﻋﻨﺪ ﻛﺘﺎﺑﮫ اﻟﻜﻮد ﻓﻲ أل ‪ pl/sql‬ﯾﻤﻜﻦ اﻟﺘﻌﺎﻣﻞ ﻣﻌﮫ‬ ‫ﻣﺜﻞ ھﺬا اﻟﻤﺜﺎل‪:‬‬

‫‪- ١٣ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻣﻌﻨﻰ ھﺬا اﻟﺨﻄﺄ اﻧﮫ ﯾﻮﺟﺪ أﺳﻤﺎء ﻛﺜﯿﺮة ﺗﺄﺗﻲ ﻣﻦ ﺟﺪول اﻟﻄﻼب‬ ‫وﻟﻜﻦ إذا أردﻧﺎ ﻣﻌﺎﻟﺠﮫ ھﺬا اﻟﺨﻄﺄ ﻧﺮى اﻟﻤﺜﺎل اﻷﺗﻲ‪:‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﻣﻌﺎﻟﺠﮫ اﻟﺨﻄﺄ اﻟﺬي ﻇﮭﺮ ﺳﺎﺑﻘﺎ وھﻮ اﻧﮫ ﯾﻮﺟﺪ ﻋﺪد ﻛﺒﯿﺮ ﻣﻦ اﻷﺳﻤﺎء ﺗﺄﺗﻲ ﻣﻦ اﻟﺠﺪول ﻓﯿﺘﻢ ﻛﺘﺎﺑﮫ‬ ‫ﺟﺰء أل ‪ Exception‬اﻟﺬي ﯾﺴﺘﺨﺪم ﻓﻲ ﻣﻌﺎﻟﺠﮫ اﻷﺧﻄﺎء ﺛﻢ ﻧﻜﺘﺐ ﺑﯿﻦ ‪ when‬و ‪ then‬اﻟﺨﻄﺄ اﻟﺬي ﯾﻈﮭﺮ‬ ‫ﺛﻢ ﻧﻜﺘﺐ ﺟﻤﻠﮫ ﺗﺤﻞ ھﺬا اﻟﺨﻄﺄ وھﻲ ﻣﺜﻼ ﺟﻤﻠﮫ ﻃﺒﺎﻋﮫ ﻣﺜﻞ اﻟﺠﻤﻠﺔ اﻟﺴﺎﺑﻘﺔ وﺑﮭﺬا ﻧﻜﻮن ﻗﺪ ﻋﺎﻟﺠﻨﺎ اﻷﺧﻄﺎء‬ ‫ﺍﻟﻜﻭﺩ ﺩﺍﺨل ﺃل ‪ Pl/sql‬ﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺠﻤل ﺃل ‪ Sql‬ﻭﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺃﻥ ﺘﺤﺘﻭﻱ ﻋﻠﻰ ﻋﻼﻤﺎﺕ‬ ‫ﺤﺴﺎﺒﻴﻪ ﻤﻥ ﻫﺫﻩ ﺍﻟﻌﻼﻤﺎﺕ )=‪ (+,-,*,/,‬ﻭﺘﺴﻤﻰ ﻫﺫﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺒﺎﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﺒﺴﻴﻁﺔ ﻭﺘﻭﺠﺩ ﺃﻴﻀﺎ ﺍﻟﻌﻤﻠﻴﺎﺕ ﺍﻟﻤﻌﻘﺩﺓ‬ ‫ﻤﺜل )=‪ (<>,||,!=,/*,*/,:‬ﻭﻜل ﻫﺫﻩ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻴﺘﻡ ﺍﺴﺘﺨﺩﺍﻤﻬﺎ ﺩﺍﺨل ﺠﻤل ﺃل ‪pl/sql‬‬ ‫ﻭﻴﻭﺠﺩ ﺠﺯﺀ ﺍﻟﺘﻌﺭﻴﻔﺎﺕ ﻓﻲ ﺠﻤﻠﻪ ﺃل ‪ pl/sql‬ﻭﻫﻭ ﺠﺯﺀ ﺃل ‪ declare‬ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻴﺴﺘﺨﺩﻡ ﻓﻲ ﺘﻌﺭﻴﻑ‬ ‫ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻜﻤﺎ ﺘﻡ ﻤﻌﺭﻓﺘﻪ ﺴﺎﺒﻘﺎ ﻭﻟﻜﻥ ﺘﻭﺠﺩ ﺸﺭﻭﻁ ﻋﻨﺩ ﺍﺴﺘﺨﺩﺍﻡ ﻫﺫﺍ ﺍﻟﺠﺯﺀ ﻭﻫﻲ ‪:‬‬ ‫‪- ١‬ﺍﻟﻤﺘﻐﻴﺭ ﻤﻤﻜﻥ ﺃﻥ ﻴﺼل ﻁﻭل ﺍﻟﻜﻠﻤﺔ ﺇﻟﻰ ﺃﻜﺜﺭ ﻤﻥ ‪٣٠‬ﺤﺭﻑ‬ ‫‪- ٢‬ﻴﺠﺏ ﺃﻥ ﻴﺒﺩﺃ ﺍﻟﻤﺘﻐﻴﺭ ﺒﺤﺭﻭﻑ ﺃﺒﺠﺩﻴﻪ ﻭﻟﻴﺱ ﺃﺭﻗﺎﻡ ﺃﻭ ﻋﻼﻤﺎﺕ ﺨﺎﺼﺔ‬ ‫‪- ٣‬ﻻ ﻴﺠﺏ ﺃﻥ ﻨﺨﺘﺎﺭ ﺍﺴﻡ ﺍﻟﻤﺘﻐﻴﺭ ﻴﻜﻭﻥ ﻫﺫﺍ ﺍﻻﺴﻡ ﻤﻭﺠﻭﺩ ﻜﺎﺴﻡ ﻋﻤﻭﺩ ﻓﻲ ﺍﻟﺠﺩﻭل ﺤﻴﺙ ﺍﻨﻪ ﻴﺤﺩﺙ ﺘﻀﺎﺭﺏ‬ ‫ﺒﻴﻥ ﺍﺴﻡ ﺍﻟﻌﻤﻭﺩ ﻭﺍﺴﻡ ﺍﻟﻤﺘﻐﻴﺭ‬ ‫‪- ٤‬ﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺃﻥ ﻴﻜﺘﺏ ﺩﺍﺨل ﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﻌﻼﻤﺎﺕ) ‪ $‬ﺍﻭ _ ﺍﻭ ‪( space‬‬ ‫‪- ٥‬ﻋﻨﺩﻤﺎ ﻨﻌﻁﻲ ﻟﻠﻤﺘﻐﻴﺭ ﻗﻴﻤﻪ ﻫﺫﻩ ﺍﻟﻘﻴﻤﺔ ﻋﺒﺎﺭﺓ ﻋﻥ ﺤﺭﻭﻑ ﺘﻭﻀﻊ ﻫﺫﻩ ﺍﻟﺤﺭﻭﻑ ﺒﻴﻥ‪single quotation‬‬ ‫)' '( ﻭﻟﻜﻥ ﺍﻷﺭﻗﺎﻡ ﻻ ﺘﻭﻀﻊ ﺒﻴﻥ )' '(‬ ‫‪ - ٦‬ﻴﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺃل )‪(/‬ﻓﻲ ﺁﺨﺭ ﺍﻟﺠﻤﻠﺔ ﻟﻌﻤل ﺘﺸﻐﻴل ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ ﺤﻴﺙ ﺍﻨﻪ ﺒﺩﻭﻥ ﻜﺘﺎﺒﻪ ﻫﺫﻩ ﺍﻟﻌﻼﻤﺔ ﻻ ﻴﺘﻡ‬ ‫ﺘﺸﻐﻴل ﺍﻟﻜﻭﺩ‬

‫**‪:Scalar data type‬‬ ‫ﻟﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻓﻲ ﺒﻴﺌﺔ ﺃل ‪ pl/sql‬ﻤﺎ ﻓﻲ ﺍﻟﻤﺜﺎل ﺍﻵﺘﻲ‪:‬‬

‫‪- ١٤ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻓﻲ ﺠﺯﺀ ‪ Declare‬ﺍﻟﻤﺘﻐﻴﺭ ﺍﻷﻭل ﻭﻫﻭ ﺍﻟﺭﻗﻡ ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺭﻗﻤﻲ ﻭﻁﻭل‬ ‫ﺍﻷﺭﻗﺎﻡ ﺒﺩﺍﺨﻠﻪ ﻻ ﻴﺘﻌﺩﻯ ‪ ٨‬ﺃﺭﻗﺎﻡ ﻭﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﺜﺎﻨﻲ ﻫﻭ ﺍﻻﺴﻡ ﻭﻫﻭ ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺤﺭﻓﻲ ﺜﻡ ﻓﻲ ﺠﺯﺀ ﺃل ‪Begin‬‬ ‫ﻨﺭﻴﺩ ﺃﻥ ﻴﻀﻊ ﺒﻴﺎﻨﺎﺕ ﺍﻟﻁﻼﺏ ﺩﺍﺨل ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ‪ v_id,v_name‬ﻭﻴﺴﻤﻰ ﻫﺫﺍ ﺃﻴﻀﺎ ﺏ ‪Scalar variable‬‬ ‫ﻭﺫﻟﻙ ﻷﻨﻪ ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﻨﻭﻉ ﻭﺍﺤﺩ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺇﻤﺎ ﺭﻗﻤﻲ ﺃﻭ ﺤﺭﻓﻲ ﺃﻭ ﺘﺎﺭﻴﺨﻲ ﻓﺎﻟﻤﺘﻐﻴﺭ ﺍﻷﻭل ﻨﻭﻋﻪ ﺭﻗﻤﻲ‬ ‫ﻭﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﺜﺎﻨﻲ ﻨﻭﻋﻪ ﺤﺭﻓﻲ ﻟﺫﻟﻙ ﻴﺘﻡ ﺍﻋﺘﺒﺎﺭﻫﻡ ‪Scalar variable‬‬ ‫ﻭﻟﻜﻥ ﻫل ﻴﻭﺠﺩ ﻁﺭﻴﻘﻪ ﺃﺨﺭﻯ ﻟﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺃﻭ ﻁﺭﻴﻘﻪ ﺃﺨﺭﻯ ﻟﻤﻌﺭﻓﻪ ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫ﻴﻤﻜﻥ ﺍﺴﺘﺨﺩﺍﻡ ‪ %Type‬ﻭﻤﻌﻨﺎﻫﺎ ﺍﻨﻪ ﻴﺭﻴﺩ ﻨﻔﺱ ﻨﻭﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻤﺜﻼ ﻓﻲ ﺠﺩﻭل ﺍﻟﻁﻼﺏ ﻟﻬﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ‬ ‫ﻤﺜﺎل ﻋﻠﻰ ﺍﺴﺘﺨﺩﺍﻡ ‪: %Type‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺒﺎﺴﺘﺨﺩﺍﻡ ‪ %Type‬ﻭﻤﻌﻨﺎﻫﺎ ﻨﻔﺱ ﻨﻭﻉ ﺍﻟﺒﻴﺎﻥ ﻓﻤﺜﻼ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻼﺤﻅ ﺃﻥ‬ ‫ﺍﻟﻤﺘﻐﻴﺭ ‪ Id‬ﻫﻭ ﻨﻔﺱ ﻨﻭﻉ ﺍﻟﺒﻴﺎﻥ ﻟﻠﻌﻤﻭﺩ ﺃﺭﻗﺎﻡ ﺍﻟﻁﻼﺏ ‪ stud_id‬ﺍﻟﻤﻭﺠﻭﺩ ﻓﻲ ﺠﺩﻭل ﺍﻟﻁﻼﺏ ﺤﻴﺙ ﺃﻥ ﻨﻭﻉ‬ ‫ﺍﻟﺒﻴﺎﻥ ﻓﻲ ﻋﻤﻭﺩ ﺃﺭﻗﺎﻡ ﺍﻟﻁﻼﺏ ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺭﻗﻤﻲ ﻟﺫﻟﻙ ﻴﺄﺨﺫ ﻫﻭ ﺃﻴﻀﺎ ﻫﺫﺍ ﺍﻟﻨﻭﻉ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻭﻫﻭ ﺍﻟﺭﻗﻤﻲ‬ ‫‪- ١٥ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻭﻴﻭﺠﺩ ﻤﺘﻐﻴﺭ ﺃﺨﺭ ﻭﻫﻭ ﺍﻻﺴﻡ ﻴﺄﺨﺫ ﺃﻴﻀﺎ ﻨﻔﺱ ﻨﻭﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﻋﻤﻭﺩ ﺃﺴﻤﺎﺀ ﺍﻟﻁﻼﺏ ﻭﻫﻲ ﺍﻟﻨﻭﻉ‬ ‫ﺍﻟﺤﺭﻓﻲ ﻭﻫﺫﻩ ﻫﻲ ﻓﺎﺌﺩﺓ ﺍﺴﺘﺨﺩﺍﻡ ‪. %type‬‬ ‫‪:Boolean data type‬‬ ‫ﻟﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﺘﻲ ﺘﺄﺨﺫ ﺼﺢ ﺃﻭ ﺨﻁﺄ ﺇﻱ ﻴﻜﻭﻥ ﻨﻭﻋﻬﺎ ‪:Boolean‬‬ ‫ﻤﻌﻨﻰ ﻜﻠﻤﻪ ‪ Boolean‬ﺍﻨﻪ ﻴﺴﺎﻭﻱ ﺃﻤﺎ ‪ True‬ﺼﺤﻴﺢ ﺃﻭ ‪ False‬ﺨﻁﺄ ﻭﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺩﺍﺌﻤﺎ ﺘﺭﺠﻊ ﺇﻤﺎ‪True‬‬ ‫ﺼﺤﻴﺢ ﺃﻭ ‪ False‬ﺨﻁﺄ ﺃﻭ ﺘﺭﺠﻊ ﻗﻴﻤﻪ ﺏ ‪Null‬‬ ‫ﻤﺜﺎل ‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻤﺘﻐﻴﺭ ‪ V_check‬ﻭﻨﻭﻋﻪ ﻤﻥ ﺍﻟﻨﻭﻉ ‪ Boolean‬ﻭﻗﺩ ﺘﻡ ﻤﻌﺭﻓﻪ ﻤﻌﻨﻰ ﻜﻠﻤﻪ‬ ‫‪ Boolean‬ﻭﻤﻌﻨﺎﻫﺎ ﺇﻤﺎ ﻴﺭﺠﻊ ﺼﺢ ﺃﻭ ﺨﻁﺄ ﻓﻔﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺇﺫﺍ ﻜﺎﻥ ﺜﻤﻥ ﻗﻴﻤﻪ ﺍﻟﺩﻭﺭﺓ ﺍﻜﺒﺭ ﻤﻥ ﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ‬ ‫ﻴﺭﺠﻊ ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﺏ ‪ True‬ﻭﺇﻻ ﻴﺭﺠﻊ ﺏ ‪False‬‬ ‫‪:Composite data type‬‬ ‫ﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ‪ Record‬ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﺃﻨﻭﺍﻉ ﻤﺘﻌﺩﺩﺓ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻤﻨﻬﺎ ﺍﻟﺒﻴﺎﻥ ﺍﻟﺭﻗﻤﻲ ﻭﺍﻟﺤﺭﻓﻲ ﻭﺍﻟﺘﺎﺭﻴﺨﻲ‬ ‫ﺃﻭ ﺍﻟﺠﺩﻭل ﺍﻟﺫﻱ ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﺃﻨﻭﺍﻉ ﻤﺘﻌﺩﺩﺓ ﻤﻥ ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻭﺃﻻﻥ ﺴﻨﻘﻭﻡ ﺒﺈﻋﻁﺎﺀ ﻤﺜﺎل ﻴﻭﻀﺢ ﻤﻌﻨﻰ ﻜﻠﻤﻪ‬ ‫‪Composite data type‬‬ ‫ﻤﺜﺎل‪:‬‬ ‫ﻹﻨﺸﺎﺀ ﺍﻟﺴﺠل ﺃﻭﻻ‬

‫‪- ١٦ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﻋﻤل ﺴﺠل ﺠﺩﻴﺩ ﻴﺴﻤﻰ‪ Stud_record_type‬ﻭﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﺴﺠل ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﺒﻴﺎﻨﺎﺕ‬ ‫ﻤﺘﻌﺩﺩﺓ ﻤﺜل ﺍﻟﺤﺭﻭﻑ ﻭﺍﻷﺭﻗﺎﻡ ﻭﺍﻟﺘﻭﺍﺭﻴﺦ ﻭﻻﺒﺩ ﺃﻥ ﻨﻌﺭﻑ ﺍﻟﺴﺠل ﻋﻠﻰ ﺍﻨﻪ ﻤﺘﻐﻴﺭ ﻭﻨﻭﻋﻪ ﻋﺒﺎﺭﺓ ﻋﻥ ﺴﺠل‬ ‫ﺤﺘﻰ ﻨﺴﺘﻁﻴﻊ ﺇﺩﺨﺎل ﺍﻟﺒﻴﺎﻨﺎﺕ ﻓﻴﻪ ﻜﻤﺎ ﻫﻭ ﻤﻭﻀﺢ ﻓﻲ ﺍﻟﻤﺜﺎل ﺍﻟﺴﺎﺒﻕ‬ ‫ﻭﻟﻜﻥ ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﻜﺘﺎﺒﻪ ﻜل ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻤﺜﻼ ﻓﻲ ﺠﺩﻭل ﺍﻟﻁﻼﺏ ﻭﻟﻜﻥ ﻻ ﻨﺭﻴﺩ ﺃﻥ ﻨﻜﺘﺏ ﻜل ﺍﺴﻡ‬ ‫ﻋﻤﻭﺩ ﻭﻨﻭﻋﻪ ﻟﺤل ﻫﺫﻩ ﺍﻟﻤﺸﻜﻠﺔ ﻨﺴﺘﺨﺩﻡ ﺍﻟﻜﻠﻤﺔ ‪ %Rowtype‬ﻭﻫﻲ ﻤﻌﻨﺎﻫﺎ ﻜل ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻓﻲ ﺍﻟﺠﺩﻭل‬ ‫ﻤﺜﺎل‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻌﺭﻴﻑ ﻨﻭﻉ ﺍﻟﻤﺘﻐﻴﺭ ‪ stud_record‬ﺍﻟﺫﻱ ﺘﻡ ﺘﻜﻭﻴﻨﻪ ﻓﻲ ﺍﻟﻤﺜﺎل ﺍﻟﺴﺎﺒﻕ ﺒﺄﺨﺫ ﻜل ﺃﻨﻭﺍﻉ‬ ‫ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺍﻟﺠﺩﻭل ﺴﻭﺍﺀ ﻜﺎﻨﺕ ﺤﺭﻓﻴﻪ ﺃﻭ ﺭﻗﻤﻴﻪ ﺃﻭ ﺘﺎﺭﻴﺨﻴﻪ ﻭﻟﺫﻟﻙ ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ‪%Rowtype‬‬ ‫ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﻜﺘﺎﺒﻪ ﺘﻌﻠﻴﻕ ﻋﻠﻰ ﺍﻟﻜﻭﺩ ﺒﺩﺍﺨﻠﻪ ﻤﺜﻼ‪:‬‬ ‫ﻟﻠﺘﻌﻠﻴﻕ ﻨﻭﻋﺎﻥ ‪:‬‬ ‫‪ - ١‬ﺍﻟﻨﻭﻉ ﺍﻷﻭل ﺃﻥ ﺍﻟﺘﻌﻠﻴﻕ ﻋﺒﺎﺭﺓ ﻋﻥ ﺴﻁﺭ ﻭﻟﻜﻲ ﻨﻭﻗﻑ ﻋﻤل ﺍﻟﺘﻌﻠﻴﻕ ﻨﻀﻊ ﻓﻲ ﺒﺩﺍﻴﺔ ﺍﻟﺴﻁﺭ )‪ (--‬ﻭﻫﺫﻩ‬ ‫ﺍﻟﻌﻼﻤﺔ ﻤﻌﻨﺎﻫﺎ ﺇﻴﻘﺎﻑ ﻋﻤل ﺍﻟﺘﻌﻠﻴﻕ‬

‫‪- ١٧ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫‪- ٢‬ﺍﻟﻨﻭﻉ ﺍﻟﺜﺎﻨﻲ ﻭﻫﻭ ﺃﻥ ﻴﺘﻜﻭﻥ ﺍﻟﺘﻌﻠﻴﻕ ﻤﻥ ﺃﻜﺜﺭ ﻤﻥ ﺴﻁﺭ ﻭﻹﻴﻘﺎﻑ ﺘﺸﻐﻴل ﻫﺫﺍ ﺍﻟﺘﻌﻠﻴﻕ ﻨﺴﺘﺨﺩﻡ ﺍﻟﻌﻼﻤﺔ‬ ‫)‪ (/* */‬ﻭﻋﻨﻰ ﻫﺫﻩ ﺍﻟﻌﻼﻤﺔ ﺇﻴﻘﺎﻑ ﺘﺸﻐﻴل ﺍﻟﺘﻌﻠﻴﻕ‬ ‫ﻤﺜﺎل ﻋﻠﻰ ﺫﻟﻙ‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﻋﻤل ﺘﻌﻠﻴﻕ ﻴﺴﻤﻰ)‪ (this is my name‬ﻭﻟﻜﻥ ﺘﻡ ﻭﻗﻑ ﻫﺫﺍ ﺍﻟﺘﻌﻠﻴﻕ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻟﻌﻼﻤﺔ)‪(--‬‬ ‫ﻤﺜﺎل ﺃﺨﺭ ﻴﻭﻀﺢ ﻜﺘﺎﺒﻪ ﺍﻟﺘﻌﻠﻴﻕ ﻓﻲ ﺃﻜﺜﺭ ﻤﻥ ﺴﻁﺭ‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﻋﻤل ﺘﻌﻠﻴﻕ ﻋﻠﻰ ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ ﺃل ‪ pl/sql‬ﻭﻟﻜﻥ ﺘﻡ ﻭﻗﻑ ﻋﻤل ﻫﺫﺍ ﺍﻟﺘﻌﻠﻴﻕ ﺒﻭﻀﻊ ﺍﻟﻌﻼﻤﺔ‬ ‫)‪(/* */‬ﻭﻫﻲ ﺘﻌﻨﻲ ﺇﻴﻘﺎﻑ ﺘﺸﻐﻴل ﺍﻟﺘﻌﻠﻴﻕ ﻭﻻﻥ ﺍﻟﺘﻌﻠﻴﻕ ﺃﻜﺜﺭ ﻤﻥ ﺴﻁﺭ ﻟﺫﻟﻙ ﻨﺴﺘﺨﺩﻡ ﻫﺫﻩ ﺍﻟﻌﻼﻤﺔ‬ ‫ﺃﻤﺎ ﺇﺫﺍ ﻜﺎﻥ ﺍﻟﺘﻌﻠﻴﻕ ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﺠﻤﻠﻪ ﻭﺍﺤﺩﻩ ﻓﻨﻀﻊ ﺍﻟﻌﻼﻤﺔ )‪(--‬‬ ‫ﺘﻭﺠﺩ ﺒﻌﺽ ﺍﻷﺸﻴﺎﺀ ﺍﻟﻤﺴﻤﻭﺡ ﺒﻜﺘﺎﺒﺘﻬﺎ ﻓﻲ ﻟﻐﺔ ﺃل ‪ PL/SQL‬ﻤﻥ ﻫﺫﻩ ﺍﻷﺸﻴﺎﺀ ‪:‬‬ ‫‪- ١‬ﺩﻭﺍل ﺍﻟﺘﺤﻭﻴل ﻭﻫﻲ )‪(To_char,To_date,To_number‬‬ ‫‪- ٢‬ﺍﻟﺩﻭﺍل ﺍﻟﺘﻲ ﺘﻁﺒﻕ ﻋﻠﻰ ﺍﻟﺤﺭﻭﻑ )‪(Lower, Upper ,Initcape,concatenate‬‬ ‫‪ - ٣‬ﺍﻟﺩﻭﺍل ﺍﻟﺘﻲ ﺘﻁﺒﻕ ﻋﻠﻰ ﺍﻷﺭﻗﺎﻡ‬ ‫‪- ٤‬ﺍﻟﺩﻭﺍل ﺍﻟﺘﻲ ﺘﻁﺒﻕ ﻋﻠﻰ ﺍﻟﺘﺎﺭﻴﺦ)‪(Monthes_between, Add_monthes,Next_day,Last_day‬‬ ‫‪- ١٨ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻭﺘﻭﺠﺩ ﺃﻴﻀﺎ ﺒﻌﺽ ﺍﻷﺸﻴﺎﺀ ﺍﻟﻐﻴﺭ ﻤﺴﻤﻭﺡ ﺒﻬﺎ ﻓﻲ ﻟﻐﺔ ‪: Pl/sql‬‬ ‫‪- ١‬ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﺍﻟﺔ ‪Decode‬‬ ‫‪- ٢‬ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﻭﺍل ﺍﻟﻤﺠﻤﻌﺔ ﻤﺜل )‪(Max ,Min,Avg,Count,Sum‬‬ ‫ﻤﺜﺎل ﻋﻠﻰ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﻭﺍل ﻓﻲ ﺠﻤل ﺃل ‪: pl/sql‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﺍﻟﺔ )||( ﻭﻫﻲ ﻤﻥ ﺩﻭﺍل ﺃل)‪ (sql‬ﺤﻴﺙ ﺃﻨﻬﺎ ﺘﺴﺘﺨﺩﻡ ﻟﻠﺭﺒﻁ ﺒﻴﻥ ﺍﻟﺤﺭﻭﻑ ﺁﻭ ﺃﺴﻤﺎﺀ‬ ‫ﺍﻻﻋﻤﺩﻩ‬ ‫ﻤﺜﺎل ﺁﺨﺭ ﻴﺒﻴﻥ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﻭﺍل ﻓﻲ ﺠﻤﻠﻪ ﺃل )‪(pl/sql‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﺍﻟﺔ ‪ Upper‬ﺍﻟﺘﻲ ﺘﺴﺘﺨﺩﻡ ﻓﻲ ﺘﺤﻭﻴل ﺍﻟﺤﺭﻭﻑ ﺍﻟﻰ ﺤﺭﻭﻑ ﻜﺒﻴﺭﻩ‬ ‫ﻭﺒﻬﺫﺍ ﻴﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﻭﺍل ﻓﻲ ﻟﻔﻪ ﺃل )‪(pl/sql‬‬ ‫ﻋﻨﺩ ﺍﺴﺘﺨﺩﺍﻡ ﻗﻴﻤﻪ ﻫﺫﻩ ﺍﻟﻘﻴﻤﺔ ﻻ ﺘﺘﺴﺎﻭﻯ ﻤﻊ ﺍﻟﻘﻴﻡ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺍﻟﺠﺩﻭل ﻤﻥ ﻨﺎﺤﻴﺔ ﺸﻜل ﺍﻟﺭﻗﻡ ﺃﻭ ﺸﻜل ﺍﻟﺘﺎﺭﻴﺦ‬ ‫ﻨﺴﺘﺨﺩﻡ ﺩﻭﺍل ﺍﻟﺘﺤﻭﻴل ﻭﻫﻲ )‪(To_char,To_number,To_date‬‬ ‫ﻤﺜﺎل ﻋﻠﻰ ﺍﺴﺘﺨﺩﺍﻡ ﺩﻭﺍل ﺍﻟﺘﺤﻭﻴل ﻓﻲ ﺠﻤل ﺃل ‪: pl/sql‬‬ ‫‪- ١٩ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺍﻅﻬﺭ ﻫﺫﺍ ﺍﻟﺨﻁﺄ ﻷﻨﻪ ﻻ ﻴﻭﺠﺩ ﻫﺫﺍ ﺍﻟﺸﻜل ﻤﻥ ﺍﻷﺭﻗﺎﻡ ﻓﻲ ﺍﻟﺠﺩﻭل ﻟﺫﻟﻙ ﻨﺴﺘﺨﺩﻡ ﺩﻭﺍل ﺍﻟﺘﺤﻭﻴل ﻭﻫﻲ‬ ‫ﺍﻟﺩﺍﻟﺔ )‪ (To_char‬ﻷﻨﻬﺎ ﺘﺴﺘﺨﺩﻡ ﻓﻲ ﺘﺤﻭﻴل ﺍﻷﺭﻗﺎﻡ ﻭﺍﻟﺘﺎﺭﻴﺦ‬ ‫ﻭﻟﻤﻌﺎﻟﺠﻪ ﻫﺫﺍ ﺍﻟﺨﻁﺄ ﻜﻤﺎ ﻓﻲ ﺍﻟﻤﺜﺎل ﺍﻷﺘﻲ‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﺍﻟﺔ ‪ To_char‬ﻟﺘﺤﻭﻴل ﺃﺭﻗﺎﻡ ﻋﻤﻭﺩ ﺘﻠﻴﻔﻭﻥ ﺍﻟﻁﻼﺏ ﺇﻟﻰ ﻫﺫﺍ ﺍﻟﺸﻜل ﻤﻥ ﺍﻷﺭﻗﺎﻡ ﻜﻤﺎ‬ ‫ﻫﻭ ﻤﻭﻀﺢ ﺒﺎﻟﺸﻜل‬ ‫ﻭﺒﺫﻟﻙ ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺩﻭﺍل ﺍﻟﺘﺤﻭﻴل ﻓﻲ ﺠﻤل ﺃل ‪pl/sql‬‬ ‫** ﻜﻴﻔﻴﻪ ﺒﻨﺎﺀ ﺍﻟﺒﻠﻭﻙ ‪PL/SQL BLOCK SYNTAX‬‬ ‫•‬ ‫•‬ ‫•‬ ‫•‬

‫ﻤﻤﻜﻥ ﺃﻥ ﺘﺤﺘﻭﻯ ﻋﻠﻰ ﺃﻜﺜﺭ ﻤﻥ ‪ ٣٠‬ﺤﺭﻑ‬ ‫ﻻ ﻴﻤﻜﻨﻙ ﻭﻀﻊ ﺍﻟﻜﻠﻤﺎﺕ ﺍﻟﻤﺤﺠﻭﺯﺓ ﺇﻻ ﺇﺫﺍ ﻭﻀﻌﻨﺎﻫﺎ ﻓﻲ " "‬ ‫ﻻﺒﺩ ﺃﻥ ﺘﺤﺘﻭﻯ ﻋﻠﻰ ﺤﺭﻑ ﺍﺒﺠﺩﻯ‬ ‫ﻻ ﺘﺨﺘﺎﺭ ﻨﻔﺱ ﺍﻻﺴﻡ ﺍﻟﻤﻁﺎﺒﻕ ﻷﺴﻡ ﺍﻟﺤﻘل ﻟﻠﺠﺩﻭل ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ‬

‫‪- ٢٠ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫** ﻟﻭﻀﻊ ﺒﻌﺽ ﺍﻟﺘﻌﻠﻴﻘﺎﺕ ﻓﻲ ﺍﻟﻜﻭﺩ‬ ‫ﻨﺒﺩﺃ ﺍﻟﺴﻁﺭ ﺏ ‪ -- ٢‬ﺇﺫﺍ ﻜﺎﻨﺕ ﺍﻟﺘﻌﻠﻴﻕ ﺴﻁﺭ ﻭﺍﺤﺩ‬ ‫ﻭ ﺇﺫﺍ ﻜﺎﻥ ﺍﻟﺘﻌﻠﻴﻕ ﻴﺤﺘﻭﻯ ﻋﻠﻰ ﻴﺤﺘﻭﻯ ﻋﻠﻰ ﺴﻁﻭﺭ ﻜﺜﻴﺭﺓ ﻓﻨﻘﻭﻡ ﺒﻭﻀﻊ ﺍﻟﺘﻌﻠﻴﻕ ﺒﻴﻥ *‪ /‬ﻓﻰ ﺍﻟﺒﺩﺍﻴﺔ ﻭ *‪/‬‬ ‫ﻓﻲ ﺍﻟﻨﻬﺎﻴﺔ‬ ‫** ﺍﻟﺩﻭﺍل ‪ FUNCTIONS‬ﻓﻲ ﺃل ‪: PL/SQL‬‬ ‫ﻤﻌﻅﻡ ﺍﻟﺩﻭﺍل ﺘﻜﻭﻥ ﺍﻟﻤﺴﻤﻭﺤﻪ ﻓﻲ ‪ SQL‬ﻭ ﺘﻜﻭﻥ ﻤﺴﻭﺤﻪ ﻓﻲ ﺃل ‪ PL/SQL‬ﻤﺜل‬ ‫•‬ ‫•‬ ‫•‬ ‫•‬

‫‪SINGLE –ROW NUMBER FUNCTIONS‬‬ ‫‪SINGLE – ROW CHARACTER FUNCTIONS‬‬ ‫‪DATATYPE CONVERSION FUNCTION‬‬ ‫‪DATE‬‬

‫ﻭ ﺘﻜﻭﻥ ﻏﻴﺭ ﻤﺴﻭﺤﻪ ﻓﻲ ‪:‬‬ ‫•‬ ‫•‬

‫‪DECODE‬‬ ‫) ‪GROUP FUNCTION (AVG , SUM , MIN , MAX,STDDEV‬‬

‫** ﺘﺤﻭﻴل ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ‪:‬‬ ‫•‬ ‫•‬ ‫•‬

‫ﻤﻤﻜﻥ ﺃﻥ ﺘﺤﻭل ﺍﻟﺒﻴﺎﻨﺎﺕ ﺇﻟﻰ ﺍﻯ ﻨﻭﻉ ﺒﻴﺎﻥ ﺁﺨﺭ‬ ‫ﺍﺨﺘﻼﻁ ﺃﻨﻭﺍﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻤﻤﻜﻥ ﺃﻥ ﻴﻌﻁﻰ ﺃﺨﻁﺎﺀ ﻭﻫﺫﺍ ﻟﻪ ﺘﺄﺜﻴﺭ‬ ‫ﺩﻭﺍل ﺍﻟﺘﺤﻭﻴل‬

‫‪TO_CHAR‬‬ ‫‪TO_DATE‬‬ ‫‪TO_NUMBER‬‬

‫ﺍﻟﺒﻠﻭﻜﺎﺕ ﺍﻟﻤﺘﺩﺍﺨﻠﺔ ‪Nested Block‬‬ ‫ﻤﺜﻠﻤﺎ ﺘﻡ ﻜﺘﺎﺒﻪ ﺠﻤﻠﻪ ‪ Select‬ﺩﺍﺨل ﺠﻤﻠﻪ ‪ Select‬ﻓﻲ ‪ Sql‬ﻭﻜﺎﻨﺕ ﺘﺴﻤﻰ ﺏ ‪ Subquary‬ﻴﻭﺠﺩ ﺃﻴﻀﺎ ﻓﻲ ﻟﻐﺔ‬ ‫‪ pl/sql‬ﻜﺘﺎﺒﻪ ﺒﻠﻭﻙ ﺩﺍﺨل ﺒﻠﻭﻙ ﻭﻫﺫﺍ ﻴﺴﻤﻰ ﺏ ‪ Nested blocks‬ﺍﻟﺒﻠﻭﻜﺎﺕ ﺍﻟﻤﺘﺩﺍﺨﻠﺔ ﻭﻴﺘﻡ ﺍﻟﺘﺩﺍﺨل ﺒﻴﻥ‬

‫‪- ٢١ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺍﻟﺒﻠﻭﻜﺎﺕ ﻓﻲ ﺠﺯﺀ ﺃل ‪ Executable‬ﺃﻱ ﺍﻟﺠﺯﺀ ﺍﻟﺫﻱ ﻴﺘﻡ ﻜﺘﺎﺒﻪ ﺍﻟﻜﻭﺩ ﻓﻴﻪ ﻭﺘﺼﺒﺢ ﻜﻠﻬﺎ ﻜﺠﻤﻠﻪ ﻭﺍﺤﺩﻩ ﺃﻭ ﺒﻠﻭﻙ‬ ‫ﻭﺍﺤﺩ ﻭﻴﻤﻜﻥ ﺃﻴﻀﺎ ﻜﺘﺎﺒﻪ ‪ Nested block‬ﻓﻲ ﺠﺯﺀ ‪ Exception‬ﻭﻫﻭ ﺠﺯﺀ ﻤﻌﺎﻟﺠﻪ ﺍﻷﺨﻁﺎﺀ‬ ‫ﻭﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﺘﻲ ﻴﺘﻡ ﺍﺴﺘﻌﻤﺎﻟﻬﺎ ﻓﻲ ﺍﻟﺒﻠﻭﻜﺎﺕ ﺍﻟﻤﺘﺩﺍﺨﻠﺔ ﺘﺴﻤﻰ ‪ variable scope‬ﻭﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻥ ﻤﺘﻐﻴﺭﺍﺕ ﻴﺘﻡ‬ ‫ﺍﺴﺘﺨﺩﺍﻡ ﺍﺤﺩ ﻫﺫﻩ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭﻟﻴﻜﻥ ﺍﻟﻤﺘﻐﻴﺭ )‪ (z‬ﻓﻲ ﺍﻟﺒﻠﻭﻙ ﺍﻷﻭل ﻓﻲ ﺠﺯﺀ ﺃل ‪Declare‬ﻭﻴﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﻨﻔﺱ‬ ‫ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﻓﻲ ﺍﻟﺒﻠﻭﻙ ﺍﻟﺜﺎﻨﻲ ﻭﻟﻜﻥ ﻫﺫﻩ ﺍﻟﻤﺭﺓ ﻓﻲ ﺠﺯﺀ ﺃل ‪ executable section‬ﻭﻫﺫﺍ ﻤﺎ ﻴﺴﻤﻰ ﺏ‬ ‫‪variable scope‬‬ ‫ﻭﻨﻼﺤﻅ ﻓﻲ ﺍﻟﺒﻠﻭﻜﺎﺕ ﺍﻟﻤﺘﺩﺍﺨﻠﺔ ﺍﻟﺒﻠﻭﻙ ﺍﻟﺭﺌﻴﺴﻲ )‪ (Parent‬ﻻ ﻴﺭﻯ ﺍﻱ ﻤﺘﻐﻴﺭ ﻤﻥ ﺍﻟﺒﻠﻭﻙ ﺍﻟﻔﺭﻋﻲ )‪(Child‬‬ ‫ﻤﺜﺎل ﻋﻠﻰ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺒﻠﻭﻜﺎﺕ ﺍﻟﻤﺘﺩﺍﺨﻠﺔ‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﻋﻤل ‪ ٢‬ﺒﻠﻭﻙ ﺃﻭﻻ ﺍﻟﺒﻠﻭﻙ ﺍﻟﺨﺎﺭﺠﻲ ﻭﻫﻭ ‪ Outer‬ﻭﻴﺤﺘﻭﻱ ﺍﻟﺒﻠﻭﻙ ﺍﻟﺨﺎﺭﺠﻲ ﻋﻠﻰ ﻜﻭﺩ ﺨﺎﺭﺠﻲ‬ ‫ﻫﺫﺍ ﺍﻟﻜﻭﺩ ﻤﻜﻭﻥ ﻤﻥ ‪ declare‬ﻭ ‪ begin‬ﻭ‪ End‬ﻭﻫﺫﺍ ﺍﻟﺒﻠﻭﻙ ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﻤﺘﻐﻴﺭ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﻭﻤﺘﻐﻴﺭ ﺜﻤﻥ‬ ‫ﺍﻟﺩﻭﺭﺓ ﻭﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ ﻭﻤﺘﻐﻴﺭ ﻻﺨﺘﺒﺎﺭ ﻫﺫﻩ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭﻨﺭﻴﺩ ﻓﻲ ﺠﺯﺀ ﺃل ‪ Executable section‬ﻤﻌﺭﻓﻪ ﻗﻴﻤﻪ‬ ‫ﺍﻟﻤﺘﻐﻴﺭ ‪ v_check‬ﻭﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻗﻴﻤﻪ ﺍﻟﻤﺘﻐﻴﺭ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ ﻤﺭﺘﺒﻁﺔ ﻤﻊ ﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ‬ ‫ﺍﻟﺒﻠﻭﻙ ﺍﻟﺜﺎﻨﻲ ﻫﻭ ﺍﻟﺒﻠﻭﻙ ﺍﻟﺩﺍﺨﻠﻲ ﻭﻴﺴﻤﻰ )‪(Inner block‬ﻭﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﺒﻠﻭﻙ ﻫﺫﺍ ﺍﻟﺒﻠﻭﻙ ﻤﻭﺠﻭﺩ ﺩﺍﺨل‬ ‫ﺍﻟﺒﻠﻭﻙ ﺍﻷﺼﻠﻲ ﻭﻴﺤﺘﻭﻱ ﻫﺫﺍ ﺍﻟﺒﻠﻭﻙ ﺃﻴﻀﺎ ﻋﻠﻰ ‪ declare‬ﻭ ‪ begin‬ﻭ‪ End‬ﻭﻴﺤﺘﻭﻱ ﻋﻠﻰ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺭﻗﻡ‬ ‫ﺍﻟﻁﺎﻟﺏ ﻭﺘﺎﺭﻴﺦ ﻤﻴﻼﺩ ﺍﻟﻁﺎﻟﺏ ﻭﺃﻴﻀﺎ ﺍﻟﻤﺘﻐﻴﺭ ‪ P_check‬ﻭﻨﻘﻭﻡ ﺒﺤﺴﺎﺏ ﺍﻟﻤﺘﻐﻴﺭ‪ p_check‬ﻭﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ‬ ‫ﻤﺘﻐﻴﺭ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﻭﻤﺘﻐﻴﺭ ﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ ﻭﻤﻌﻨﻰ ﺃل ‪ Outer.v_stud_id‬ﻤﻌﻨﺎﻫﺎ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﺍﻟﻤﻭﺠﻭﺩ ﺨﺎﺭﺝ‬ ‫)‪(Inner block‬‬ ‫ﻭﻟﻜﻥ ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﻤﻌﺭﻓﻪ ﻤﺜﻼ ﻨﺘﺎﺌﺞ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﺴﺎﺒﻘﺔ‪:‬‬ ‫‪ - ١‬ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﻤﻌﺭﻓﻪ ﻗﻴﻤﻪ ﺍﻟﻤﺘﻐﻴﺭ ‪ v_check‬ﺍﻟﺨﺎﺭﺠﻲ ﺃﻱ ﺍﻟﻤﻭﺠﻭﺩ ﻓﻲ ﺍﻟﺒﻠﻭﻙ ﺍﻷﻭل‬ ‫ﺘﻜﻭﻥ ﻗﻴﻤﻪ ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﻫﻲ‪v_check=10||20:‬‬ ‫‪- ٢‬ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﻤﻌﺭﻓﻪ ﻗﻴﻤﻪ ﺍﻟﻤﺘﻐﻴﺭ ‪ Outer. V_stud_id=10*200‬ﺤﻴﺙ ﺃﻨﻬﺎ ﺘﺘﺒﻊ ﺍﻟﺒﻠﻭﻙ ﺍﻟﺜﺎﻨﻲ ﻭﻫﻭ )‪(Inner‬‬ ‫‪- ٢٢ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻤﻠﺤﻭﻅﺔ‪:‬‬ ‫ﻨﻼﺤﻅ ﻓﻲ ﻫﺫﺍ ﺍﻟﻜﻭﺩ ﺃﻥ ﺍﻟﺒﻠﻭﻙ ﺍﻟﺩﺍﺨﻠﻲ ﻴﺭﻯ ﻤﺎ ﻫﻭ ﻤﻭﺠﻭﺩ ﻓﻲ ﺍﻟﺒﻠﻭﻙ ﺍﻟﺨﺎﺭﺠﻲ ﻓﻤﺜﻼ ﻓﻲ ﺤﺎﻟﻪ‬ ‫‪ Outer. V_stud_id‬ﻨﻼﺤﻅ ﺍﻨﻪ ﻴﺭﻯ ﻗﻴﻤﻪ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﻤﻥ ﺍﻟﺭﻗﻡ ﺍﻟﻤﻭﺠﻭﺩ ﻓﻲ ﺍﻟﺒﻠﻭﻙ ﺍﻟﺨﺎﺭﺠﻲ‬ ‫** ﺍﻟﻌﻤﻠﻴﺎﺕ ﻓﻲ ﺃل ‪OPERATORS IN PL/SQL‬‬ ‫•‬ ‫•‬ ‫•‬ ‫•‬ ‫•‬

‫‪LOGICAL‬‬ ‫‪ARTHMETIC‬‬ ‫‪CONCATENATION‬‬ ‫‪PARENTHESES TO CONTROL ORDER OF OPERATIONS‬‬ ‫)**( ‪EXPONENTIAL OPERATOR‬‬

‫ﺍﻟﻭﺼﻑ‬ ‫ﺩﻟﻴل ﻭ ﺇﻨﻜﺎﺭ‬ ‫ﺘﺘﻁﺎﺒﻕ ﻭ ﻋﺩﻡ ﺘﺘﻁﺎﺒﻕ‬ ‫ﺍﻟﻀﺭﺏ ﻭ ﺍﻟﻘﺴﻤﺔ‬ ‫ﺍﻻﻀﺎﻓﻪ ﻭ ﺍﻟﻨﻘﺼﺎﻥ ﻭ ﺍﻟﺭﺒﻁ‬ ‫ﻋﻤﻠﻴﺎﺕ ﺍﻟﻤﻘﺎﺭﻨﺔ‬ ‫ﺍﻟﺘﻭﺤﻴﺩ‬ ‫ﺃﻭ‬

‫ﺍﻟﻌﻤﻠﻴﺔ‬ ‫‪** , NOT‬‬ ‫‪+,‬‬‫‪*,/‬‬ ‫|| ‪+ , - ,‬‬ ‫‪=,!=,<,>,<=,>=, IS NULL , LIKE ,BETTWEEN , IN‬‬ ‫‪AND‬‬ ‫‪OR‬‬

‫ﺃﻤﺜﻠﻪ ﻋﻠﻰ ﺒﻌﺽ ﺍﻟﻌﻤﻠﻴﺎﺕ‬ ‫ﻟﻌﻤل ﻋﺩﺍﺩ ﻤﺘﺴﻠﺴل ﻤﺜل ‪SEQUENCE‬‬ ‫ﻭ ﺫﻟﻙ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻟﻌﻤﻠﻴﺔ ‪ +‬ﺍﻯ ﺇﻀﺎﻓﺔ ﺇﻟﻰ ﺍﻟﻌﺩﺍﺩ ﺒﻤﻘﺩﺍﺭ ‪١‬‬

‫ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻌﻤﻠﻴﺔ ﺘﺴﺎﻭﻯ ﻭ ﺍﻟﻌﻤﻠﻴﺔ ‪IS NOT NULL‬‬

‫‪- ٢٣ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻜﻴﻔﻴﻪ ﺘﻤﻴﻴﺯ ﺍﻟﺘﻌﺭﻴﻔﺎﺕ ‪: identifiers‬‬ ‫ﻓﻲ ﻫﺫﺍ ﺍﻟﺠﺩﻭل ﺴﻭﻑ ﻨﻘﻭﻡ ﺒﻭﻀﻊ ﺍﻟﺘﻌﺭﻴﻑ ﻭ ﺍﻟﺤﺭﻑ ﺃﻭ ﺍﻟﻜﻠﻤﺔ ﺍﻟﺘﻲ ﺘﺸﻴﺭ ﺇﻟﻰ ﻫﺫﺍ ﺍﻟﺘﻌﺭﻴﻑ‬

‫ﺍﻟﺘﻌﺭﻴﻑ‬ ‫‪Variable‬‬ ‫‪Constant‬‬ ‫‪Cursor‬‬ ‫‪Exception‬‬ ‫‪Table type‬‬ ‫‪Table‬‬ ‫‪Record type‬‬ ‫‪Record‬‬ ‫‪Sql*plus substitution‬‬ ‫‪variable ( referred to‬‬ ‫) ‪substitution parameter‬‬ ‫‪Sql*plus global variable‬‬ ‫‪(it's referred to bind‬‬ ‫)‪variable‬‬

‫ﺍﻟﻜﻠﻤﺔ ﺍﻟﺘﻲ ﺘﺸﻴﺭ ﺇﻟﻴﻪ‬ ‫‪V_name‬‬ ‫‪C_name‬‬ ‫‪Name_cursor‬‬ ‫‪E_name‬‬ ‫‪Name_table_type‬‬ ‫‪Name_table‬‬ ‫‪Name_record_type‬‬ ‫‪Name_record‬‬ ‫‪P_name‬‬

‫ﻤﺜﺎل‬ ‫‪V_sal‬‬ ‫‪C_company_name‬‬ ‫‪Emp_cursor‬‬ ‫‪E_too_many‬‬ ‫‪Amount_table_type‬‬ ‫‪Order_total_table‬‬ ‫‪Emp_record_type‬‬ ‫‪Customer_record‬‬ ‫‪P_sal‬‬

‫‪G_name‬‬

‫‪G_year_sal‬‬

‫ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ ــــــــــــــ‬

‫** ﻋﻤﻠﻴﻪ ﺍﺴﺘﺨﺩﺍﻡ ﻋﺒﺎﺭﺓ ﺃل ‪ SELECT‬ﻓﻲ ﺃل ‪PL/SQL‬‬ ‫ﻋﻨﺩﻤﺎ ﺘﻘﻭﻡ ﺒﺎﺴﺘﺭﺠﺎﻉ ﻤﻌﻠﻭﻤﺎﺕ ﺃﻭ ﺘﻌﺩﻴل ﻤﻌﻠﻭﻤﺎﺕ ﻤﻥ ﺨﻼل ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻴﺠﺏ ﻋﻠﻴﻙ ﺍﺴﺘﺨﺩﺍﻡ ﻋﺒﺎﺭﺓ‬ ‫‪ SQL‬ﻭ ﻋﻤل ﻤﻌﺎﻟﺠﻪ ﻟﺠﻤﻴﻊ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻭ ﺍﻟﺘﺤﻜﻡ ﻭ ﺍﻟﺴﻴﻁﺭﺓ ﻭ ﺫﻟﻙ ﺒﺎﺴﺘﺨﺩﺍﻡ ‪ SQL‬ﺩﺍﺨل ﺃل‬ ‫‪ PL/SQL‬ﻜﻤﺎ ﻴﻤﻜﻨﻙ ﺍﻟﻘﻴﺎﻡ ﺒﺎﺴﺘﺨﺩﺍﻡ ﻋﺒﺎﺭﺓ ‪ SELECT‬ﻟﻜﻲ ﺘﻘﻭﻡ ﺒﺈﻋﻁﺎﺀ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻗﻴﻡ‬

‫‪- ٢٤ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫ﻓﻼﻥ ﻴﻤﻜﻨﻨﺎ ﻋﻤل ﻤﻘﺎﺭﻨﻪ ﺒﻴﻥ ‪ SQL‬ﻭ ‪PL/SQL‬‬

‫‪SQL‬‬

‫‪PL/SQL‬‬ ‫· ﻻ ﻴﻭﺠﺩ ﺒﻬﺎ ﺃﻭﺍﻤﺭ ﺍﻟﺴﻴﻁﺭﺓ ﻋﻠﻰ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫‪TRANCSACTION CONTROL‬‬ ‫ﻤﺜل‬ ‫‪COMMIT , ROLLBACK , SAVEPOINT‬‬ ‫· ﻻ ﻴﻭﺠﺩ ﺒﻬﺎ ﻟﻐﺎﺕ ﺍﻟﺘﻌﺭﻴﻑ ﺒﺎﻟﺒﻴﺎﻨﺎﺕ )‪(DDL‬‬ ‫‪DATA DEFINITION LANGUAGE‬‬ ‫ﻤﺜل ‪:‬‬ ‫‪CREATE TABLE‬‬ ‫‪ALTER TABLE‬‬ ‫‪DROP TABLE‬‬ ‫· ﻻ ﻴﻭﺠﺩ ﺒﻬﺎ ﻟﻐﺔ ﺍﻟﺘﺤﻜﻡ ﺒﺎﻟﺒﻴﺎﻨﺎﺕ )‪(DCL‬‬ ‫‪DATA CONTROL LANGUAGE‬‬ ‫ﻤﺜل‬ ‫‪GRANT , REVOKE‬‬

‫· ﻴﻭﺠﺩ ﺒﻬﺎ ﺃﻭﺍﻤﺭ ﺍﻟﺴﻴﻁﺭﺓ ﻋﻠﻰ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫‪TRANCSACTION CONTROL‬‬

‫· ﻴﻭﺠﺩ ﺒﻬﺎ ﻟﻐﺎﺕ ﺍﻟﺘﻌﺭﻴﻑ ﺒﺎﻟﺒﻴﺎﻨﺎﺕ‬ ‫) ‪(DDL‬‬ ‫‪DATA DEFINITION‬‬ ‫‪LANGUAGE‬‬

‫·‬

‫ﻴﻭﺠﺩ ﺒﻬﺎ ﻟﻐﺔ ﺍﻟﺘﺤﻜﻡ ﺒﺎﻟﺒﻴﺎﻨﺎﺕ‬ ‫)‪(DCL‬‬ ‫‪DATA CONTROL‬‬ ‫‪LANGUAGE‬‬

‫ﻋﺒﺎﺭﺍﺕ ‪ SQL‬ﻓﻲ ﺃل ‪PL/SQL‬‬ ‫ﺍﺴﺘﺭﺠﺎﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺒﺎﺴﺘﺨﺩﺍﻡ ﻋﺒﺎﺭﺍﺕ ‪SQL‬‬ ‫ﺍﻟﺼﻴﻐﺔ ﺍﻻﺴﺎﺴﻴﻪ ﻻﺴﺘﺨﺩﺍﻡ ‪ SQL‬ﺩﺍﺨل ﺃل ‪PL/SQL‬‬ ‫‪SELECT SELECT_LIST‬‬ ‫] ‪INTO { VARIBALE_NAME , [ VARIABLE_NAME] ,……. | RECORD_NAME‬‬ ‫‪FROM TABLE‬‬ ‫; ‪WHERE CONDITIONS‬‬ ‫‪ SELECT_LIST‬ﻭ ﻫﻲ ﻤﺠﻤﻭﻋﺔ ﻤﻥ ﺍﻷﻋﻤﺩﺓ ﺃﻭ ﻋﻠﻰ ﺍﻷﻗل ﻋﻤﻭﺩ ﻭﺍﺤﺩ‬ ‫‪ : VARIABLE_NAME‬ﺍﺴﻡ ﺍﻟﻤﺘﻐﻴﺭ‬ ‫‪ : RECORD_NAME‬ﺍﺴﻡ ﺍﻟﺴﺠل‬ ‫‪ : TABLE_NAME‬ﺍﺴﻡ ﺍﻟﺠﺩﻭل ﺍﻟﺫﻱ ﻴﺸﻴﺭ ﺇﻟﻰ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫‪ : CONDITION‬ﺘﺤﺘﻭﻯ ﻋﻠﻰ ﺃﺴﻤﺎﺀ ﺍﻷﻋﻤﺩﺓ ﻭ ﺍﻟﺘﻌﺒﻴﺭﺍﺕ ﻭ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻭ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭ ﺍﻟﺜﻭﺍﺒﺕ ﺍل‬ ‫‪PL/SQL‬‬ ‫ﺍﺴﺘﺨﺩﺍﻡ ﻜﻠﻤﻪ ‪ INTO‬ﺠﺯﺀ ﺍﺠﺒﺎﺭﻯ ﻓﻲ ﺠﻤﻠﻪ ﺃل ‪ SELECT‬ﻭ ﺘﻜﻭﻥ ﺒﻴﻥ ‪ SELECT .. FROM‬ﻭ‬ ‫ﺘﺴﺘﺨﺩﻡ ﻓﻲ ﺘﻌﻴﻴﻥ ﺃﺴﻤﺎﺀ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻻﺴﺘﺭﺠﺎﻉ ﺍﻟﻘﻴﻡ ﻤﻥ ‪ SQL‬ﻭﻴﺠﺏ ﺍﻥ ﺘﻌﻁﻰ ﻤﺘﻐﻴﺭ ﻟﻜل ﻋﻤﻭﺩ ﻗﻤﺕ‬ ‫ﺒﺎﻻﺴﺘﻌﻼﻡ ﻋﻨﺔ‬ ‫ﻤﺜﺎل ‪:‬‬

‫‪- ٢٥ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻭ ﻴﺠﺏ ﺍﻟﺘﺄﻜﺩ ﻤﻥ ﺇﻨﻬﺎﺀ ﻋﺒﺎﺭﺍﺕ ‪ SQL‬ﺏ ;‬ ‫ﻭ ﻨﺴﺘﺨﺩﻡ ‪ INTO‬ﺩﺍﺨل ﺠﻤﻠﻪ ﺃل ‪ SELECT‬ﻭ ﻴﻤﻜﻥ ﺃﻥ ﻨﺴﺘﺨﺩﻡ ﻋﺒﺎﺭﺓ ‪ WHERE‬ﺩﺍﺨل ‪ PL/SQL‬ﻭ‬ ‫ﺫﻟﻙ ﻟﺘﻌﻴﻴﻥ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭ ﺍﻟﺘﻌﺒﻴﺭﺍﺕ ﻭ ﺍﻟﺜﻭﺍﺒﺕ ﻟﻸﻋﻤﺩﺓ‬ ‫ﻤﺜﺎل ‪:‬‬ ‫ﺍﺴﺘﺭﺠﺎﻉ ﺍﺠﻤﺎﻟﻰ ﺍﻟﻤﺭﺘﺒﺎﺕ ﻟﻜل ﺍﻟﻤﻭﻅﻔﻴﻥ ﺍﻟﻤﻭﺠﻭﺩﻴﻥ ﻓﻲ ﺍﻟﻘﺴﻡ ﺍﻟﺫﻱ ﺘﺨﺘﺎﺭﻩ ‪:‬‬

‫** ﺍﺴﺘﺨﺩﺍﻡ )‪ DATA MANIPULATON LANGUAGE (DML‬ﻓﻲ ﺃل ‪PL/SQL‬‬ ‫ﻴﻤﻜﻨﻨﺎ ﺍﻟﺘﻐﻴﻴﺭ ﻓﻲ ﺠﺩﺍﻭل ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺃﻭﺍﻤﺭ )‪ (DML‬ﻤﺜل‬ ‫• ‪ INSERT‬ﻹﻀﺎﻓﺔ ﺼﻑ ﺠﺩﻴﺩ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻓﻲ ﺍﻟﺠﺩﻭل‬ ‫• ‪ UPDATE‬ﺘﻌﺩﻴل ﺼﻑ ﻤﻥ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﻭﺠﺩﺓ ﻓﻲ ﺍﻟﺠﺩﻭل‬ ‫• ‪ DELETE‬ﺤﺫﻑ ﺍﻟﺼﻔﻭﻑ ﺍﻟﻐﻴﺭ ﻤﻁﻠﻭﺒﺔ ﻓﻲ ﺍﻟﺠﺩﻭل‬ ‫ﺃﻭﻻ ﻤﺜﺎل ﻹﻀﺎﻓﺔ ﺒﻴﺎﻨﺎﺕ ﻓﻲ ﺍﻟﺠﺩﻭل ﻭ ﺫﻟﻙ ﺒﺎﺴﺘﺨﺩﺍﻡ ﻋﺒﺎﺭﺓ ‪insert‬‬ ‫ﻭ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻴﻘﻭﻡ ﺒﺈﻀﺎﻓﺔ ﻤﻭﻅﻑ ﺠﺩﻴﺩ ﻓﻲ ﺠﺩﻭل ﺍﻟﻤﻭﻅﻔﻴﻥ‬

‫‪- ٢٦ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺜﺎﻨﻴﺎ ‪ :‬ﺘﻌﺩﻴل ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺍﻟﺠﺩﻭل ﻭ ﺫﻟﻙ ﺒﺎﺴﺘﺨﺩﺍﻡ ﻋﺒﺎﺭﺓ ‪update‬‬ ‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺴﻭﻑ ﻨﻘﻭﻡ ﺒﺈﻀﺎﻓﺔ ‪ ٣٠٠٠‬ﺠﻨﻴﻪ ﺇﻟﻰ ﻤﺭﺘﺒﺎﺕ ﺠﻤﻴﻊ ﺍﻟﻤﻭﻅﻔﻴﻥ ﺍﻟﻤﻭﺠﻭﺩﻴﻥ ﻓﻲ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫ﻭ ﺘﻜﻭﻥ ﻭﻅﻴﻔﺘﻬﻡ ‪ANALYST‬‬

‫ﺜﺎﻟﺜﺎ ‪ :‬ﺤﺫﻑ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺍﻟﺠﺩﻭل ﻭ ﺫﻟﻙ ﺒﺎﺴﺘﺨﺩﺍﻡ ﻋﺒﺎﺭﺓ ‪DELETE‬‬

‫** ﺘﺩﺍﺨل ﺒﻴﻥ ﺃﺴﻤﺎﺀ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭ ﺃﺴﻤﺎﺀ ﺍﻷﻋﻤﺩﺓ ﻓﻲ ﺍﻟﺠﺩﻭل‬ ‫‪- ٢٧ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻻ ﻴﺼﺢ ﺃﻥ ﻨﻌﻁﻰ ﻤﺘﻐﻴﺭ ﺍﺴﻡ ﻫﺫﺍ ﺍﻻﺴﻡ ﻴﻜﻭﻥ ﻤﺴﺘﺨﺩﻡ ﻜﺎﺴﻡ ﻋﻤﻭﺩ ﻓﻲ ﺍﻟﺠﺩﻭل ﻻﻥ ﻫﺫﺍ ﻴﺅﺩﻯ ﺇﻟﻰ ﺘﻀﺎﺭﺏ‬ ‫ﺒﻴﻥ ﺍﺴﻡ ﺍﻟﻌﻤﻭﺩ ﻭ ﺍﺴﻡ ﺍﻟﻤﺘﻐﻴﺭ‬ ‫ﻭ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻴﻭﻀﺢ ﻫﺫﺍ ﺍﻟﺘﻀﺎﺭﺏ ﺒﻴﻥ ﺍﻷﺴﻤﺎﺀ‬

‫* ﺍﺴﺘﺨﺩﺍﻡ ﺃﻭﺍﻤﺭ ﺍﻟﺴﻴﻁﺭﺓ ﻋﻠﻰ ﺍﻟﺒﻴﺎﻨﺎﺕ ‪TRANCSACTION CONTROL‬‬ ‫ﺃﻭﻻ ﺍﺴﺘﺨﺩﺍﻡ ﺃﻤﺭ ﺍﻟﺤﻔﻅ ‪: COMMIT‬‬

‫ﺜﺎﻨﻴﺎ ﺍﺴﺘﺨﺩﺍﻡ ﺃﻤﺭ ﺍﻟﺤﻔﻅ ﺒﺎﺴﻡ ﻋﻠﻰ ﻫﺫﺍ ﺍﻟﺘﻌﺩﻴل‬

‫‪- ٢٨ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺜﺎﻟﺜﺎ ‪ :‬ﺍﺴﺘﺨﺩﺍﻡ ﺃﻤﺭ ‪ ROLLBACK‬ﻟﻠﺭﺠﻭﻉ ﺇﻟﻰ ﻨﻘﻁﺔ ﻤﻌﻴﻨﺔ ﻤﺤﻔﻭﻅﺔ‬ ‫ﺴﻭﻑ ﻨﺭﻯ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻜﻴﻔﻴﺔ ﺇﻀﺎﻓﺔ ﺒﻴﺎﻨﺎﺕ ﺇﻟﻰ ﺠﺩﻭل ﻭ ﺇﻅﻬﺎﺭ ﻫﺫﻩ ﺍﻟﺘﻐﻴﻴﺭﺍﺕ ﺜﻡ ﺍﻟﺭﺠﻭﻉ ﺇﻟﻰ ﻨﻘﻁﺔ ﻗﺩ ﻗﻤﻨﺎ‬ ‫ﺒﺤﻔﻅﻬﺎ ﻗﺒل ﻋﻤل ﺍﻟﺘﻐﻴﻴﺭ ﻭ ﺇﻅﻬﺎﺭ ﺍﻟﻨﺘﻴﺠﺔ ﻤﺭﺓ ﺃﺨﺭﻯ ﺴﻨﺭﻯ ﺃﻥ ﺍﻟﺘﻌﺩﻴل ﻻ ﻴﻭﺠﺩ ﻟﻪ ﺍﺜﺭ ﺤﻴﺙ ﺃﻨﻨﺎ ﺭﺠﻌﻨﺎ ﺇﻟﻰ‬ ‫ﻨﻘﻁﺔ ﻗﺩ ﺤﻔﻅﻨﺎﻫﺎ ﻗﺒل ﺍﻟﺘﻌﺩﻴل‬

‫‪- ٢٩ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺍﻟﺘﺤﻜﻡ ﻫﻴﺎﻜل ﺍﻟﺒﻴﺎﻨﺎﺕ ﺃل ‪CONTROLLING PL/SQL FLOW OF EXECUTION pl/sql‬‬ ‫ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﺃﻥ ﻨﻁﺒﻕ ﺸﺭﻁ ﻤﻌﻴﻥ ﻋﻠﻰ ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ ﻓﻲ ﺃل ‪ pl/sql‬ﻭﻗﻤﻨﺎ ﺒﻜﺘﺎﺒﻪ ﻫﺫﺍ ﺍﻟﺸﺭﻁ ﻓﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺃﻥ‬ ‫ﻴﻜﻭﻥ ﺍﻻﺠﺎﺒﻪ ﺇﻤﺎ ﺼﺤﻴﺤﺔ ﺃﻭ ﺨﺎﻁﺌﺔ ﻭﺭﺒﻤﺎ ﻫﺫﺍ ﺍﻟﺸﺭﻁ ﻨﺭﻴﺩﻩ ﺃﻥ ﻴﺘﻜﺭﺭ ﻓﻲ ﺃﻜﺜﺭ ﻤﻥ ﻜﻭﺩ ﻫﺫﺍ ﺍﻟﺘﻜﺭﺍﺭ ﻟﻠﺸﺭﻁ‬ ‫ﻴﺴﻤﻰ ﺏ ‪ loop‬ﺤﻴﺙ ﺃﻥ ﻓﻜﺭﻩ ﺃل ‪ loop‬ﺃﻨﻨﺎ ﻨﺭﻴﺩ ﺘﻜﺭﺍﺭ ﺸﺭﻁ ﻋﻠﻰ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺍﻟﺼﻔﻭﻑ ﻓﻲ ﺍﻟﺠﺩﻭل ﻓﻴﺘﻡ‬ ‫ﺍﺴﺘﺨﺩﺍﻡ ﺃﻭﺍﻤﺭ ﻤﻌﻴﻨﻪ ﻤﻥ ﻫﺫﻩ ﺍﻷﻭﺍﻤﺭ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻷﻤﺭ ‪ if‬ﺒﺤﺎﻻﺘﻪ ﻭﺍﺴﺘﺨﺩﺍﻡ ﺍﻷﻤﺭ ‪ case‬ﺍﺴﺘﺨﺩﺍﻡ ‪while‬‬ ‫ﻭﺍﺴﺘﺨﺩﺍﻡ ‪ for‬ﻫﺫﻩ ﺍﻷﻭﺍﻤﺭ ﺴﻨﺘﻨﺎﻭﻟﻬﺎ ﺒﺎﻟﺘﻔﺼﻴل ﻓﻴﻤﺎ ﻴﻠﻲ‪:‬‬ ‫ﺃﻭﻻ ‪ :‬ﺍﺴﺘﺨﺩﺍﻡ ‪: If_then_end _If‬‬ ‫ﺍﻟﺩﺍﻟﺔ ‪ If‬ﻤﻌﻨﺎﻫﺎ ﺍﻨﻪ ﻟﻭ ﺤﺩﺙ ﺍﻟﺸﺭﻁ ﺍﻟﻤﻜﺘﻭﺏ ﻨﻔﺫ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻲ ﺘﻠﻴﻪ‬ ‫ﻭﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻟﻬﺎ ﻫﻲ ‪:‬‬ ‫ﺍﻟﺠﻤﻠﺔ ﺍﻟﻤﺭﺍﺩ ﻜﺘﺎﺒﺘﻬﺎ ‪ Then‬ﺍﻟﺸﺭﻁ ﺍﻟﻤﺭﺍﺩ ﺍﺨﺘﺒﺎﺭﻩ ‪If‬‬ ‫ﺍﻟﺸﺭﻁ ﺍﻟﻤﺭﺍﺩ ﻜﺘﺎﺒﺘﻪ ‪ then‬ﺍﻟﺸﺭﻁ ﺍﻟﻤﺭﺍﺩ ﺍﺨﺘﺒﺎﺭﻩ‪elsif‬‬ ‫ﺍﻟﺠﻤﻠﺔ ﺍﻟﻤﺭﺍﺩ ﻜﺘﺎﺒﺘﻬﺎ ‪Else‬‬ ‫;‪End if‬‬ ‫ﺃﻤﺎ ﺇﺫﺍ ‪Then‬ﻭﻤﻌﻨﺎﻫﺎ ﺍﻨﻪ ﻴﺨﺘﺒﺭ ﺍﻟﺸﺭﻁ ﺃﻭﻻ ﺇﺫﺍ ﻜﺎﻥ ﺍﻟﺸﺭﻁ ﺼﺤﻴﺢ ﻴﻜﺘﺏ ﻫﺫﻩ ﺍﻟﺠﻤﻠﺔ ﺍﻟﻤﻭﺠﻭﺩﺓ ﺒﻌﺩ ﺍﻟﻜﻠﻤﺔ‬ ‫ﺇﺫﺍ ﻜﺎﻥ ﺼﺤﻴﺢ ﻨﻜﺘﺏ ﺍﻟﺠﻤﻠﺔ ‪Elsif‬ﻜﺎﻥ ﺍﻟﺸﺭﻁ ﻏﻴﺭ ﺼﺤﻴﺢ ﻓﻨﻘﻭﻡ ﺒﺎﺨﺘﺒﺎﺭ ﺍﻟﺸﺭﻁ ﺍﻟﻤﻭﺠﻭﺩ ﻓﻲ ﺍﻷﻤﺭ‬ ‫ﺍﻟﻤﻭﺠﻭﺩﺓ ﺒﻌﺩ ﻜﻠﻤﻪ ‪ Then‬ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺍﻷﻤﺭ ‪ Elsif‬ﺃﻤﺎ ﺇﺫﺍ ﻜﺎﻥ ﺍﻟﺸﺭﻁ ﻏﻴﺭ ﺼﺤﻴﺢ ﻨﻘﻭﻡ ﺒﻜﺘﺎﺒﻪ ﺍﻟﺠﻤﻠﺔ‬ ‫ﺍﻟﻤﻭﺠﻭﺩﺓ ﺒﻌﺩ ﺍﻟﻜﻠﻤﺔ ‪Else‬‬ ‫ﻤﺜﺎل ﺘﻭﻀﻴﺤﻲ ﻟﺫﻟﻙ‪:‬‬ ‫ﺃﻭﻻ ﺍﺴﺘﺨﺩﺍﻡ ‪ if‬ﻤﻊ ‪ then‬ﻓﻘﻁ‬

‫‪- ٣٠ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻫﺫﻩ ﺍﻟﺠﻤﻠﺔ ﻤﻌﻨﺎﻫﺎ ﺇﺫﺍ ﻜﺎﻥ ﺭﻗﻡ ﺍﻟﻤﺘﻐﻴﺭ ﺍﻜﺒﺭ ﻤﻥ ‪ ٥‬ﻨﻜﺘﺏ ﺍﻟﺸﺭﻁ ﻭﻫﻭ ﺍﻟﻤﺘﻐﻴﺭ ﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ = ﻋﻠﻲ ﺃﻤﺎ ﺇﺫﺍ ﻟﻡ‬ ‫ﻴﺘﺤﻘﻕ ﺍﻟﺸﺭﻁ ﻭﻫﻭ ﺃﻥ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﺍﻗل ﻤﻥ ﺃﻭ ﻴﺴﺎﻭﻱ ‪ ٥‬ﻨﻜﺘﺏ ﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ = ﻭﺍﺌل ﻭﺘﻡ ﺇﻨﻬﺎﺀ ﺠﻤﻠﻪ ﺃل ‪If‬‬ ‫ﺒﺠﻤﻠﻪ ‪End if‬‬ ‫ﻭﻟﻜﻲ ﻨﺭﻯ ﺍﻟﻨﺎﺘﺞ ﺍﻟﺫﻱ ﻴﻅﻬﺭ ﻨﺴﺘﺨﺩﻡ ﺍﻷﻤﺭ ‪Print‬ﻜﻤﺎ ﻓﻲ ﺍﻟﻤﺜﺎل ﺍﻵﺘﻲ ‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﻁﺒﺎﻋﻪ ﺍﻟﻤﺘﻐﻴﺭ ﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ ﻭﻨﻼﺤﻅ ﻓﻲ ﺍﻟﻨﺎﺘﺞ ﺍﻨﻪ ﺘﻡ ﺘﻁﺒﻴﻕ ﺠﻤﻠﻪ ﺍﻟﺸﺭﻁ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ‪End‬‬ ‫ﻭﺫﻟﻙ ﻻﻥ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﻟﻴﺱ ﺍﻜﺒﺭ ﻤﻥ ‪ ٥‬ﻟﺫﻟﻙ ﻻ ﻴﻨﻔﺫ ﺠﻤﻠﻪ ‪IF‬ﻭﻴﻨﻔﺫ ﺠﻤﻠﻪ ‪End‬‬ ‫ﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺃﻥ ﺘﺤﺘﻭﻱ ﺠﻤﻠﻪ ﺃل ﺃﻤﺭ ‪ IF‬ﻋﻠﻰ ‪ Elsif‬ﻭﻋﻤﻨﺎﻫﺎ ﺇﺫﺍ ﻟﻭ ﺤﺩﺙ ﻫﺫﺍ ﺍﻟﺸﺭﻁ‬ ‫ﻭﺍﻵﻥ ﺴﻨﻌﻁﻲ ﻤﺜﺎل ﻋﻠﻰ ﺍﺴﺘﺨﺩﺍﻡ ‪ Elsif‬ﻓﻲ ﺠﻤﻠﻪ ‪IF‬‬

‫‪- ٣١ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﺍﻟﺔ ‪ ELSIF‬ﻓﻲ ﺠﻤﻠﻪ ﺃل ‪ IF‬ﻭﻤﻌﻨﻰ ﻫﺫﺍ ﺍﻟﻜﻭﺩ ﻟﻭ ﻜﺎﻥ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ =‪ ٥‬ﻴﻜﻭﻥ ﺍﺴﻡ‬ ‫ﺍﻟﻁﺎﻟﺏ ‪ mody‬ﻭﻟﻜﻥ ﻟﻭ ﻫﺫﺍ ﺨﻁﺄ ﻴﻘﻭﻡ ﺒﺘﻨﻔﻴﺫ ﻋﺒﺎﺭﺓ ‪ ELSIF‬ﻭﻫﻲ ﻤﻌﻨﺎﻫﺎ ﻭﺇﻻ ﺇﺫﺍ ﻜﺎﻥ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ =‪ ٦‬ﻴﻜﻭﻥ‬ ‫ﺍﺴﻡ ‪ MADY‬ﻭﺇﺫﺍ ﻜﺎﻥ ﺫﻟﻙ ﺨﻁﺄ ﺃﻴﻀﺎ ﻨﻜﺘﺏ ﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ ‪WEWE‬‬ ‫ﻟﻜﻲ ﻨﺭﻯ ﻤﺎ ﻴﻭﺠﺩ ﺩﺍﺨل ﺍﻟﻤﺘﻐﻴﺭ ﻨﻼﺤﻅ ﺍﻟﻤﺜﺎل ﺍﻷﺘﻲ‬

‫ﻨﻼﺤﻅ ﻓﻲ ﺍﻟﻨﺎﺘﺞ ﺍﻨﻪ ﺘﻡ ﻁﺒﻊ ﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ ﻭﺍﺌل ﻻﻥ ﺍﻟﺸﺭﻁ ﺍﻟﻤﻭﺠﻭﺩ ﻓﻲ ﺠﻤﻠﻪ ﺍل ‪ IF‬ﻭ‪ elsif‬ﻟﻡ ﻴﺘﺤﻘﻕ ﻓﻴﺘﻡ‬ ‫ﺘﻁﺒﻴﻕ ﺠﻤﻠﻪ ‪ELSE‬‬ ‫ﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺩﺍﺨل ﺠﻤﻠﻪ ‪ IF‬ﺍﺴﺘﺨﺩﺍﻡ ﺸﺭﻁﻴﻥ ﻤﺘﺩﺍﺨﻠﻴﻥ ﻤﺜﺎل‪:‬‬

‫‪- ٣٢ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭﻫﻲ ﺍﻟﺭﻗﻡ ﻭﺍﻻﺴﻡ ﻭﺍﻟﻌﻨﻭﺍﻥ ﻭﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﻭﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ ﺜﻡ ﺍﺴﺘﺨﺩﺍﻤﻨﺎ‬ ‫ﺍﻷﻤﺭ ‪ IF‬ﻻﺨﺘﺒﺎﺭ ﺸﺭﻁ ﻤﻌﻴﻥ ﻭﻟﻜﻥ ﻫﺫﺍ ﺍﻟﺸﺭﻁ ﻤﻜﻭﻥ ﻤﻥ ﺸﺭﻁﻴﻥ ﺍﻟﺸﺭﻁ ﺍﻷﻭل ﻫﻭ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﺭﻗﻤﻪ =‪٥‬‬ ‫ﻭﺍﻟﺸﺭﻁ ﺍﻟﺜﺎﻨﻲ ﺃﻥ ﻴﻜﻭﻥ ﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ ﻭﺘﻡ ﺍﻟﺭﺒﻁ ﺒﻴﻥ ﺍﻟﺸﺭﻁﻴﻥ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻟﻤﻌﺎﻤل ‪ and‬ﺍﻟﺫﻱ ﺘﻡ ﺸﺭﺤﻪ ﺴﺎﺒﻘﺎ ﻓﻲ‬ ‫‪ Sql‬ﻭﺍﻟﻤﻌﺎﻤل ‪ and‬ﻤﻌﻨﺎﻩ ﺍﻨﻪ ﻻﺒﺩ ﻤﻥ ﺃﻥ ﻴﺘﺤﻘﻕ ﺍﻟﺸﺭﻁﺎﻥ ﺍﻟﺴﺎﺒﻘﺎﻥ ﻤﻌﺎ ﻭﻻ ﻴﺘﺤﻘﻕ ﺸﺭﻁ ﻭﺍﻟﺸﺭﻁ ﺍﻟﺜﺎﻨﻲ ﻻ‬ ‫ﻴﺘﺤﻘﻕ ﻭﻤﻌﻨﻰ ﺠﻤﻠﻪ ‪ if‬ﻫﻨﺎ ﺍﻨﻪ ﻟﻭ ﺘﺤﻘﻕ ﺍﻟﺸﺭﻁﺎﻥ ﺍﻟﺴﺎﺒﻘﺎﻥ ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺠﻤﻠﻪ ‪ then‬ﺍﻟﺘﻲ ﺘﺤﺘﻭﻱ ﻋﻠﻰ ﺍﻟﻌﻨﻭﺍﻥ‬ ‫‪ Giza‬ﻭﺇﻻ ﺇﺫﺍ ﻜﺎﻥ ﺍﻟﺸﺭﻁﺎﻥ ﻏﻴﺭ ﻤﺘﺤﻘﻘﺎﻥ ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺠﻤﻠﻪ ‪ Else‬ﺍﻟﺘﻲ ﺒﻬﺎ ﺍﻟﻌﻨﻭﺍﻥ ‪ tanta‬ﺜﻡ ﻨﻨﻬﻲ ﺠﻤﻠﻪ ‪ if‬ﺏ‬ ‫‪End if‬‬ ‫ﻤﺜﺎل‬ ‫ﺁﺨﺭ ﻻﺴﺘﺨﺩﺍﻡ ﺍﻟﺸﺭﻭﻁ ﺍﻟﻤﺘﺩﺍﺨﻠﺔ ﻓﻲ ﺠﻤﻠﻪ ‪: IF‬‬

‫‪- ٣٣ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫ﺧﻄﺄ!‬

‫ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻫﻭ ﻨﻔﺱ ﺍﻟﻤﺜﺎل ﺍﻟﺴﺎﺒﻕ ﻭﻟﻜﻥ ﺍﻻﺨﺘﻼﻑ ﺍﻟﻭﺤﻴﺩ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺍﻨﻪ ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻤﻌﺎﻤل ‪ OR‬ﺒﺩﻻ ﻤﻥ‬ ‫ﺍﻟﻤﻌﺎﻤل ‪ AND‬ﻭﺍﻻﺨﺘﻼﻑ ﺒﻴﻥ ﺍﻟﻤﻌﺎﻤل ‪ OR‬ﻭﺍﻟﻤﻌﺎﻤل ‪ AND‬ﻫﻭ ﻓﻲ ﺍﻟﻤﻌﺎﻤل ‪ OR‬ﻟﻴﺱ ﺸﺭﻁﺎ ﺃﻥ ﻴﺘﺤﻘﻕ‬ ‫ﺍﻟﺸﺭﻁﺎﻥ ﻭﻟﻜﻥ ﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺃﻥ ﻴﺘﺤﻘﻕ ﺸﺭﻁ ﻭﺍﻷﺨﺭ ﻻ ﻴﺘﺤﻘﻕ ﻭﻤﻊ ﺫﻟﻙ ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺍﻟﺸﺭﻁ ﺒﺎﻟﺭﻏﻡ ﻤﻥ ﻋﺩﻡ ﺘﺤﻘﻕ‬ ‫ﺍﻟﺸﺭﻁﺎﻥ ﻤﻌﺎ ﻭﻨﻼﺤﻅ ﺫﻟﻙ ﻓﻲ ﺍﻟﻤﺜﺎل ﺍﻟﺴﺎﺒﻕ ﺤﻴﺙ ﺃﻥ ﺍﻟﺸﺭﻁ ﺍﻷﻭل ﻫﻭ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ =‪ ٥‬ﻭﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ = ﺍﺤﻤﺩ‬ ‫ﻓﺈﺫﺍ ﺘﺤﻘﻕ ﻫﺫﺍ ﺍﻟﺸﺭﻁ ﻨﻁﺒﻕ ﺠﻤﻠﻪ ‪ THEN‬ﻭﺇﺫﺍ ﻟﻡ ﻴﺘﺤﻘﻕ ﻫﺫﺍ ﺍﻟﺸﺭﻁ ﻨﻘﻭﻡ ﺒﺘﻁﺒﻴﻕ ﺠﻤﻠﻪ ‪ELSE‬‬ ‫ﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺃﻥ ﻴﺤﺘﻭﻱ ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ ﻋﻠﻰ ﺠﻤﻠﻪ ‪ IF‬ﻤﺘﺩﺍﺨﻠﺔ ﺃﻱ ﻤﻌﻨﺎﻫﺎ ﺠﻤﻠﻪ ‪ IF‬ﻤﻜﺘﻭﺒﺔ ﺩﺍﺨل ﺠﻤﻠﻪ ‪IF‬‬ ‫ﻤﺜﺎل ﻋﻠﻰ ﺫﻟﻙ‪:‬‬

‫‪- ٣٤ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺠﻤﻠﻪ ‪ IF‬ﻤﺭﺘﻴﻥ ﺍﻟﻤﺭﺓ ﺍﻷﻭﻟﻰ ﻤﻌﻨﺎﻫﺎ ﻟﻭ ﻋﻨﻭﺍﻥ ﺍﻟﻁﺎﻟﺏ ﻫﻭ ﻁﻨﻁﺎ ﺍﺠﻌل ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ‬ ‫‪ ٥‬ﻭﺃﻻ ﻟﻭ ﻋﻨﻭﺍﻥ ﺍﻟﻁﺎﻟﺏ ﻫﻭ ﺍﻟﺠﻴﺯﺓ ﺍﺠﻌل ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ‪ ٦‬ﻭﻨﻘﻭﻡ ﺒﺈﻨﻬﺎﺀ ﺠﻤل ‪ IF‬ﻨﻨﻬﻲ ﺃﻭﻻ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺜﺎﻨﻴﺔ ﺏ‬ ‫‪ End if‬ﺍﻷﻭﻟﻰ ﺜﻡ ﻨﻨﻬﻲ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺜﺎﻨﻴﺔ ﺏ ‪ End if‬ﺍﻟﺜﺎﻨﻴﺔ‬ ‫** ﻤﻠﺤﻭﻅﺔ‪ :‬ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﺍﻟﺔ ‪ IF‬ﻴﺘﻡ ﺍﻟﺘﺤﻜﻡ ﻓﻲ ﻤﺴﺎﺭ ﺍﻟﺒﺭﻨﺎﻤﺞ ﺃﻭ ﺠﻌل ﺍﻟﺒﺭﻨﺎﻤﺞ ﻴﻨﻔﺫ ﻋﻤﻠﻴﺎﺕ ﻤﻌﻴﻨﻪ ﻓﻘﻁ‬ ‫ﻭﻟﻜﻥ ﻟﻴﺴﺕ ﺍﻷﻤﺭ ‪ IF‬ﻫﻲ ﺍﻟﻭﺤﻴﺩﺓ ﺍﻟﺘﻲ ﺘﺘﺤﻜﻡ ﻓﻲ ﺴﻴﺭ ﺍﻟﺒﺭﻨﺎﻤﺞ ﻭﻟﻜﻥ ﻴﻭﺠﺩ ﺩﺍﻟﻪ ﺃﺨﺭﻯ ﺘﺴﺘﺨﺩﻡ ﻟﻠﺘﺤﻜﻡ ﻓﻲ‬ ‫ﺴﻴﺭ ﺍﻟﺒﺭﻨﺎﻤﺞ ﻤﺜل ﺍﻷﻤﺭ‪ CASE‬ﻭﻫﻲ ﺃﻴﻀﺎ ﻟﻬﺎ ﻨﻔﺱ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﺍﻟﺔ ‪ IF‬ﻭﻟﻜﻥ ﺍﻟﺼﻴﻐﺔ ﺘﺨﺘﻠﻑ ﻋﻥ ﺼﻴﻐﻪ‬ ‫ﺍﻟﺩﺍﻟﺔ ‪ IF‬ﻭﺍﻵﻥ ﺴﻨﺭﻯ ﻜﻴﻔﻴﻪ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻷﻤﺭ ‪ CASE‬ﻭﻓﺎﺌﺩﺓ ﺍﻷﻤﺭ ‪ CASE‬ﺍﻨﻪ ﻴﻘﻭﻡ ﺒﺈﻋﻁﺎﺀ ﻤﺘﻌﺩﺩﺓ ﻟﻠﻤﺘﻐﻴﺭ‬ ‫ﻤﻥ ﺨﻼﻟﻬﺎ ﻴﺘﻡ ﻤﻥ ﺨﻼﻟﻬﺎ ﺍﻻﺨﺘﻴﺎﺭ ﺒﻴﻥ ﺍﻟﻘﻴﻡ ﻭﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻟﻸﻤﺭ ‪ CASE‬ﻫﻲ‪:‬‬ ‫ﺍﺴﻡ ﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﺫﻱ ﻟﻪ ﻗﻴﻡ ﻤﺘﻌﺩﺩﺓ ‪CASE‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻤﻥ ﺘﻁﺒﻴﻕ ﻫﺫﺍ ﺍﻟﺸﺭﻁ ‪ THEN‬ﺍﻟﺸﺭﻁ ﺍﻟﻤﻁﻠﻭﺏ ﺍﺨﺘﺒﺎﺭﻩ‪WHEN‬‬ ‫ﺍﻟﻨﺎﺘﺞ ﻤﻥ ﺘﻁﺒﻴﻕ ﻫﺫﺍ ﺍﻟﺸﺭﻁ ‪ THEN‬ﺍﻟﺸﺭﻁ ﺍﻟﻤﻁﻠﻭﺏ ﺍﺨﺘﺒﺎﺭﻩ‪WHEN‬‬ ‫‪..‬‬ ‫‪..‬‬ ‫‪..‬‬ ‫ﻨﺎﺘﺞ ﺃﺨﺭ ‪ELSE‬‬ ‫;‪END‬‬ ‫ﻤﺜﺎل ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻻﺴﺘﺨﺩﺍﻡ ﺍﻷﻤﺭ ‪:CASE‬‬

‫ﻫﺫﻩ ﻫﻲ ﺸﻜل ﺍﻷﻤﺭ ‪ Case‬ﻋﻨﺩﻤﺎ ﻴﺘﻡ ﻜﺘﺎﺒﺘﻪ ﻓﻲ ﺍﻟﻜﻭﺩ‬ ‫ﻤﺜﺎل ﻟﺘﻁﺒﻴﻕ ﺍﻷﻤﺭ ‪:Case‬‬

‫‪- ٣٥ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﺍﻟﻤﺜﺎل ﺍﻟﺴﺎﺒﻕ ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻷﻤﺭ ‪ Case‬ﺘﻡ ﺃﻭﻻ ﺘﻌﺭﻴﻑ ﻤﺘﻐﻴﺭ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺍﺕ ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺭﻗﻤﻲ ﺜﻡ ﻨﻌﺭﻑ‬ ‫ﻤﺘﻐﻴﺭ ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺭﻗﻤﻲ ﻭﻫﻭ ﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ ﺜﻡ ﻨﻜﺘﺏ ﻓﻲ ﺍﻟﻜﻭﺩ ﺍﻷﻤﺭ ‪Case‬ﻭﻤﻌﻨﺎﻩ ﺍﻨﻪ ﻟﻭ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ = ‪١٠٠٠‬‬ ‫ﻟﺫﻟﻙ ﺍﻀﺭﺏ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ *‪ ١٠‬ﻭﺇﺫﺍ ﻜﺎﻥ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ ‪ ١٥٠٠‬ﺍﻀﺭﺏ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ ﻓﻲ *‪ ٢٠‬ﻭﻟﻭ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ‬ ‫‪ ٢٠٠٠‬ﺍﻀﺭﺏ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ ﻓﻲ *‪ ٣٠‬ﻭﺇﻻ ﺇﺫﺍ ﻜﺎﻥ ﻏﻴﺭ ﺫﻟﻙ ﺍﻀﺭﺏ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ ﻓﻲ *‪٤٠‬‬ ‫ﻤﺜﺎل ﺁﺨﺭ ﻴﻭﻀﺢ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻷﻤﺭ ‪: Case‬‬

‫ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻫﻭ ﻨﻔﺱ ﺍﻟﻤﺜﺎل ﺍﻟﺴﺎﺒﻕ ﻭﻟﻜﻥ ﺍﻻﺨﺘﻼﻑ ﺍﻟﻭﺤﻴﺩ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺍﻨﻪ ﻻ ﻴﻭﺠﺩ ﺒﻌﺩ ﺍﻷﻤﺭ ‪ Case‬ﺍﻟﻤﺘﻐﻴﺭ‬ ‫ﺍﻟﺫﻱ ﺴﻴﻌﻁﻰ ﻟﻪ ﺍﻟﻘﻴﻡ ﺍﻟﻤﺨﺘﻠﻔﺔ ﻭﺘﻡ ﻭﻀﻊ ﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﺫﻱ ﻴﺄﺨﺫ ﻗﻴﻡ ﻤﺨﺘﻠﻔﺔ ﺒﻌﺩ ﻜﻠﻤﻪ ‪ When‬ﺃﻱ ﺍﻨﻪ ﻟﻴﺱ ﺸﺭﻁﺎ‬ ‫ﺃﻥ ﻨﻜﺘﺏ ﺒﻌﺩ ﻜﻠﻤﻪ ‪ Case‬ﺍﺴﻡ ﺍﻟﻤﺘﻐﻴﺭ ﻭﻫﺫﺍ ﻫﻭ ﺍﻻﺨﺘﻼﻑ ﺒﻴﻥ ﺍﻟﻤﺜﺎل ﺍﻟﺴﺎﺒﻕ ﻭﺍﻟﻤﺜﺎل ﺍﻟﺤﺎﻟﻲ‬ ‫ﻟﻜﻲ ﻨﺭﻯ ﺍﻟﻨﺎﺘﺞ ﻟﻠﻤﺘﻐﻴﺭ‬

‫‪- ٣٦ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺘﻡ ﻁﺒﻊ ﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﺫﻱ ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﺒﻴﺎﻨﺎﺕ ﻤﺘﻌﺩﺩﺓ ﻭﺒﻌﺩ ﺘﻁﺒﻴﻕ ﺍﻷﻤﺭ ‪ Case‬ﻋﻠﻰ ﺍﻟﻤﺘﻐﻴﺭ ﻴﻅﻬﺭ ﻫﺫﺍ ﺍﻟﻨﺎﺘﺞ‬ ‫ﻭﻫﻭ ﻨﺎﺘﺞ ﻤﻥ ﻀﺭﺏ ﻗﻴﻤﻪ ﺍﻟﺩﻭﺭﺓ ‪١٠*١٠٠٠‬‬

‫ﺍﻟﺠﻤل ﺍﻟﺘﻜﺭﺍﺭﻴﺔ‪:‬‬ ‫ﻴﻭﺠﺩ ﺩﺍﺨل ﺠﻤل ﺃل ‪ PL/SQL‬ﺠﻤل ﺘﻜﺭﺍﺭﻴﻪ ﻭﻤﻌﻨﻰ ﺍﻟﺠﻤل ﺍﻟﺘﻜﺭﺍﺭﻴﺔ ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻥ ﺠﻤل ﻴﺘﻡ ﺘﻜﺭﺍﺭﻫﺎ ﺩﺍﺨل‬ ‫ﺍﻟﻜﻭﺩ ﺤﻴﺙ ﺃﻨﻬﺎ ﺘﺘﻜﻭﻥ ﻤﻥ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺍﻷﻭﺍﻤﺭ ﺍﻟﺘﻲ ﺘﺘﻜﺭﺭ ﻭﻴﺘﻡ ﺍﻟﺘﺤﻜﻡ ﻓﻲ ﺘﺸﻐﻴل ﺃﻭ ﺇﻴﻘﺎﻑ ﻫﺫﻩ ﺍﻷﻭﺍﻤﺭ ﻋﻥ‬ ‫ﺍﻟﻌﻤل ﻫﺫﻩ ﺍﻟﺠﻤل ﺍﻟﺘﻜﺭﺍﺭﻴﺔ ﺘﺴﻤﻰ ‪ LOOPS‬ﻭﻴﻭﺠﺩ ﺜﻼﺜﺔ ﺃﻨﻭﺍﻉ ﻤﻥ ﺍﻟﺠﻤل ﺍﻟﺘﻜﺭﺍﺭﻴﺔ‪:‬‬ ‫‪BASIC LOOP-١‬‬ ‫‪FOR LOOP-٢‬‬ ‫‪WHILE LOOP- ٣‬‬ ‫ﺃﻭﻻ ﺃل ‪: Basic loop‬‬ ‫ﻴﻌﺘﺒﺭ ﺃل ‪ Basic loop‬ﻤﻥ ﺍﺒﺴﻁ ﺠﻤل ﺍﻟﺘﻜﺭﺍﺭ ﺤﻴﺙ ﺍﻨﻪ ﻴﺘﻡ ﻜﺘﺎﺒﻪ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻜﺭﺍﺭﻴﺔ ﺒﻴﻥ ﺍﻟﻜﻠﻤﺔ ‪ Loop‬ﻭﺒﻴﻥ‬ ‫ﺍﻟﻜﻠﻤﺔ ‪ end loop‬ﻭﻓﻲ ﻜل ﻤﺭﻩ ﻋﻨﺩﻤﺎ ﻴﺼل ﺇﻟﻰ ﺍﻟﻜﻠﻤﺔ ‪ end loop‬ﻴﺭﺠﻊ ﻤﺭﻩ ﺃﺨﺭﻯ ﺇﻟﻰ ﺒﺩﺍﻴﺔ ﺠﻤﻠﻪ ﺍﻟﺘﻜﺭﺍﺭ‬ ‫ﻭﻫﻲ ﺍﻟﻜﻠﻤﺔ ‪ loop‬ﻭﻴﻨﻔﺫ ﺍﻟﺠﻤﻠﺔ ﺍﻟﻤﻭﺠﻭﺩﺓ ﺒﺩﺍﺨل ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻜﺭﺍﺭﻴﺔ ﻭﻨﻀﻊ ﺍﻟﻜﻠﻤﺔ ‪ Exit‬ﻟﻠﺨﺭﻭﺝ ﻤﻥ ‪ loop‬ﻻﻥ‬ ‫ﺍﻟﻜﻠﻤﺔ ‪ Exit‬ﻤﻌﻨﺎﻫﺎ ﺍﻨﻪ ﻋﻨﺩﻤﺎ ﻴﺠﺩ ﺍﻟﺸﺭﻁ ﺍﻟﻤﻨﺎﺴﺏ ﻴﺨﺭﺝ ﻤﻥ ﺃل ‪ Loop‬ﻭﺒﺩﻭﻥ ﺍﻟﻜﻠﻤﺔ ‪ Exit‬ﻴﺴﺘﻤﺭ ﺃل‬ ‫‪ Loop‬ﻓﻲ ﺍﻟﻌﻤل ﺩﻭﻥ ﺘﻭﻗﻑ ﻭﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺃﻥ ﻴﺤﺘﻭﻱ ﻭﻻﺒﺩ ﺃﻥ ﻴﺤﺩﺙ ﻤﺭﻩ ﻭﺍﺤﺩﻩ ﻋﻠﻰ ﺍﻷﻗل‬ ‫ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻻﺴﺘﺨﺩﺍﻡ ‪: Basic loop‬‬ ‫‪loop‬‬ ‫ﺍﻟﺠﻤﻠﺔ ﺍﻟﻤﺭﺍﺩ ﺘﻜﺭﺍﺭﻫﺎ‬ ‫)ﻋﻨﺩﻤﺎ ﻴﺤﺩﺙ ﻫﺫﺍ ﺍﻟﺸﺭﻁ ‪Exit (when‬‬ ‫ﻫﺫﺍ ﺍﻟﺸﺭﻁ ﻋﺒﺎﺭﺓ ﻋﻥ ‪Boolean‬ﺃﻱ ﻴﺭﺠﻊ ﺃﻤﺎ ‪ true‬ﺃﻭ ‪False‬‬ ‫ﻤﺜﺎل ﻻﺴﺘﺨﺩﺍﻡ ﺃل ‪: Basic loop‬‬

‫‪- ٣٧ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺃل ‪ Basic loop‬ﻭﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻟﻪ ﻜﻤﺎ ﻫﻲ ﻤﻭﻀﺤﻪ ﺒﺎﻟﺸﻜل‬ ‫ﻨﺭﻴﺩ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﺤﺩﻴﺩ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ ﻭﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ ﺩﺍﺨل ﺍﻟﻤﺘﻐﻴﺭﺍﻥ ﺍﻟﺜﻤﻥ ﻭﺍﻟﺭﻗﻡ ﻤﻥ ﺠﺩﻭل ﺍﻟﺩﻭﺭﺍﺕ ﺒﺸﺭﻁ ﺃﻥ‬ ‫ﻴﻜﻭﻥ ﺴﻌﺭ ﺍﻟﺩﻭﺭﺓ =‪ ١٠٠٠‬ﺜﻡ ﺒﻌﺩ ﺫﻟﻙ ﻴﺩﺨل ﻓﻲ ‪ loop‬ﻓﻲ ﻜل ﻤﺭﻩ ﻴﻜﺭﺭ ﺍﻟﺠﻤﻠﺔ ﺍﻟﻤﻭﺠﻭﺩﺓ ﺒﻌﺩ ﺍﻟﻜﻠﻤﺔ ‪Loop‬‬ ‫ﺤﻴﺙ ﺍﻨﻪ ﻴﺩﺨل ﺩﺍﺨل ﺠﺩﻭل ﺍﻟﺩﻭﺭﺍﺕ ﻭﻴﺭﻯ ﺃﻭل ﻁﺎﻟﺏ ﻴﺄﺨﺫ ﻤﻥ ﺴﺠل ﺃﻭل ﻁﺎﻟﺏ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ ﻭﻴﻀﻴﻑ ﻋﻠﻴﻬﺎ‬ ‫‪ ١٠‬ﺜﻡ ﻋﻨﺩﻤﺎ ﻴﻨﺘﻬﻲ ﻤﻥ ﻫﺫﻩ ﺍﻟﺨﻁﻭﺓ ﻴﺭﻯ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﻫل ﻫﻭ ﺍﻗل ﻤﻥ ‪ ٢٠‬ﻟﻭ ﺍﻗل ﻤﻥ ‪ ٢٠‬ﻴﺴﺘﻤﺭ ﻓﻲ ﺘﻨﻔﻴﺫ‬ ‫ﺠﻤﻠﻪ ﺍﻟﺘﻜﺭﺍﺭ ﻋﻠﻰ ﺍﻟﻁﺎﻟﺏ ﺍﻟﺜﺎﻨﻲ ﻭﻻ ﻴﻨﻔﺫ ﻫﺫﻩ ﺍﻟﺠﻤﻠﺔ ﻋﻨﺩﻤﺎ ﻴﻜﻭﻥ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ = ‪ ٢٠‬ﻓﻌﻨﺩﻤﺎ ﻴﻜﻭﻥ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ‬ ‫= ‪ ٢٠‬ﻴﺨﺭﺝ ﻤﻥ ﺃل ‪ loop‬ﻭﻻ ﻴﻨﻔﺫ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻜﺭﺍﺭﻴﺔ‬ ‫ﻨﻀﻊ ﺍﻟﻜﻠﻤﺔ ‪ End loop‬ﻓﻲ ﻨﻬﺎﻴﺔ ﺠﻤﻠﻪ ﺍﻟﺘﻜﺭﺍﺭ ﻭﺘﺴﺘﺨﺩﻡ ﻫﺫﻩ ﺍﻟﻜﻠﻤﺔ ﻹﻨﻬﺎﺀ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻜﺭﺍﺭﻱ‬ ‫ﻭﻹﻅﻬﺎﺭ ﻨﺎﺘﺞ ﻫﺫﺍ ﺍﻟﺘﻜﺭﺍﺭ ﻨﺭﻯ ﺍﻟﻤﺜﺎل ﺍﻷﺘﻲ‪:‬‬

‫ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﺍﻟﺔ ‪ if‬ﺩﺍﺨل ﺃل ‪:loop‬‬ ‫ﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﺍﻟﺔ ‪ if‬ﺩﺍﺨل ﺃل ‪ loop‬ﻭﻴﻜﻭﻥ ﺒﻬﺫﻩ ﺍﻟﺼﻴﻐﺔ ﻜﻤﺎ ﺴﻨﺭﻯ ﻓﻲ ﺍﻟﻤﺜﺎل ﺍﻵﺘﻲ‪:‬‬

‫‪- ٣٨ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﻥ ‪ Cost‬ﻭﺍﻟﻤﺘﻐﻴﺭ ‪ Id‬ﻫﺫﺍﻥ ﺍﻟﻤﺘﻐﻴﺭﺍﻥ ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺭﻗﻤﻲ ﺜﻡ ﺒﺩﺃﻨﺎ ﻓﻲ ﺘﻨﻔﻴﺫ‬ ‫ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ ﻭﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻨﻀﻊ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺍﺕ ﻭﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ ﺩﺍﺨل ﺍﻟﻤﺘﻐﻴﺭﺍﻥ ‪ Cost‬ﻭ ‪ Id‬ﺒﺸﺭﻁ ﺃﻥ ﻴﻜﻭﻥ‬ ‫ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ =‪ ٢‬ﺜﻡ ﺒﻌﺩ ﺫﻟﻙ ﻨﺩﺨل ﻓﻲ ‪ Loop‬ﺒﺩﺍﺨﻠﻪ ﻫﺫﻩ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻜﺭﺍﺭﻴﺔ ﻭﻫﻲ ﻨﺯﻭﺩ ﺍﻟﻤﺘﻐﻴﺭ ‪ Id‬ﺍﻟﺫﻱ‬ ‫ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﺒﻴﺎﻨﺎﺕ ﺃﺭﻗﺎﻡ ﺍﻟﺩﻭﺭﺍﺕ ﺒﻤﻘﺩﺍﺭ ‪ ١٠‬ﺇﺫﺍ ﻜﺎﻥ ﺍﻟﻤﺘﻐﻴﺭ ‪ Id = 40‬ﺜﻡ ﻴﻨﻔﺫ ﺠﻤﻠﻪ ‪ Exit‬ﻭﻤﻌﻨﺎﻫﺎ ﺍﻟﺨﺭﻭﺝ‬ ‫ﻤﻥ ﺃل ‪Loop‬‬ ‫ﻟﻨﺭﻯ ﺍﻟﻨﺘﺎﺌﺞ ﻤﻥ ﺘﻁﺒﻴﻕ ﻫﺫﺍ ﺍﻟﻜﻭﺩ ‪:‬‬

‫ﺘﻡ ﻁﺒﺎﻋﻪ ﺍﻟﻤﺘﻐﻴﺭﺍﻥ ‪ Id‬ﻭﺍﻟﻤﺘﻐﻴﺭ‪ Cost‬ﻜﻤﺎ ﻨﺭﻯ ﻓﻲ ﺍﻟﺸﻜل ﺍﻟﺴﺎﺒﻕ‬ ‫ﺍﺴﺘﺨﺩﺍﻡ ‪: For loop‬‬

‫‪- ٣٩ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻴﺴﺘﺨﺩﻡ ‪ For‬ﺃﻴﻀﺎ ﻟﻌﻤل ﺘﻜﺭﺍﺭ ﺤﻴﺙ ﺍﻨﻪ ﻴﺴﺘﺨﺩﻡ ﻟﺘﻨﻔﻴﺫ ﺍﻟﻌﻤﻠﻴﺔ ﻋﺩﺩ ﻤﻥ ﺍﻟﻤﺭﺍﺕ ﺍﻟﻤﻌﺭﻭﻓﺔ ﺤﻴﺙ ﺃﻨﻬﺎ ﺘﻘﻭﻡ‬ ‫ﺒﺘﺤﺩﻴﺩ ﺍﻟﻘﻴﻤﺔ ﺍﻟﺘﻲ ﺴﺘﺒﺩﺃ ﺒﻬﺎ ﻭﺍﻟﻘﻴﻤﺔ ﺍﻟﺘﻲ ﺴﺘﻨﺘﻬﻲ ﺒﻬﺎ‬ ‫ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻻﺴﺘﺨﺩﺍﻡ ‪:for‬‬ ‫ﺍﻟﻌﺩﺩ ﺍﻟﺫﻱ ﻴﻨﺘﻬﻲ ﺒﻪ ‪ ..‬ﺍﻟﻌﺩﺩ ﺍﻟﺫﻱ ﻴﺒﺩﺃ ﺒﻪ ‪ In‬ﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﻤﻌﺭﻑ ﻋﻠﻰ ﺩﺍﺨل ﺃل ‪ for‬ﺘﻠﻘﺎﺌﻴﺎ‬

‫‪FOR‬‬ ‫‪Loop‬‬ ‫ﺍﻟﺠﻤﻠﺔ ﺍﻟﻤﺭﺍﺩ ﺘﻜﺭﺍﺭﻫﺎ‬ ‫;‪End loop‬‬

‫ﻭﻫﺫﻩ ﻫﻲ ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻟﺠﻤﻠﻪ ‪for‬‬ ‫ﻟﺘﻭﻀﻴﺢ ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ‪:‬‬

‫ﻫﺫﻩ ﻫﻲ ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻻﺴﺘﺨﺩﺍﻡ ﺃل ‪ For‬ﻭﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺒﻌﺩ ﻜﻠﻤﻪ ‪ For‬ﻤﺘﻐﻴﺭ ﻭﻫﻭ ﻤﺜﻼ ﻭﻟﻴﻜﻥ )‪ (i‬ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ‬ ‫ﻴﻭﻀﺢ ﻋﺩﺩ ﻤﺭﺍﺕ ﺍﻟﺘﻜﺭﺍﺭ ﻤﻥ )‪ (1..5‬ﻭﺍﻟﻨﻘﻁﺘﻴﻥ ﺍﻟﻤﻭﺠﻭﺩﺘﺎﻥ ﺒﻴﻥ ‪ ١‬ﻭ ‪ ٥‬ﻤﻌﻨﺎﻫﺎ ﺍﻨﻪ ﺴﻴﺘﻡ ﺍﻟﺘﻜﺭﺍﺭ ﻋﺩﺩ ﻤﻥ‬ ‫ﺍﻟﻤﺭﺍﺕ ‪ ١،٢،٣،٤،٥‬ﺜﻡ ﻨﻜﺘﺏ ﺒﻌﺩ ﺫﻟﻙ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻜﺭﺍﺭﻴﺔ ﻭﻨﻨﻬﻲ ﺒﻌﺩ ﺫﻟﻙ ﺃل ‪Loop‬‬ ‫ﻤﺜﺎل ﻋﻠﻰ ﺍﺴﺘﺨﺩﺍﻡ ‪:For‬‬

‫‪- ٤٠ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﻥ ‪ ID‬ﻭ ‪ Cost‬ﻭﻟﻜﻥ ﺘﻡ ﺘﻌﺭﻴﻔﻬﻡ ﺨﺎﺭﺝ ﻜﻭﺩ ‪ pl/sql‬ﺜﻡ ﺒﺩﺃﻨﺎ ﻓﻲ ﻋﻤل ﺍﻟﻜﻭﺩ‬ ‫ﻭﻫﻭ ﺘﻡ ﺘﺤﺩﻴﺩ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ ﻭﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ ﺩﺍﺨل ﺍﻟﻤﺘﻐﻴﺭﺍﻥ ‪ cost‬ﻭ ‪ id‬ﻭﺘﻡ ﺍﺴﺘﻌﻤﺎل ﻫﺫﺍﻥ ﺍﻟﻤﺘﻐﻴﺭﺍﻥ ﻋﻠﻰ ﺃﻨﻬﻡ‬ ‫‪ host variable‬ﻓﺘﻡ ﻭﻀﻊ )‪ (:‬ﻗﺒل ﺍﻟﻤﺘﻐﻴﺭ ﺜﻡ ﺘﻡ ﺇﻨﺸﺎﺀ ﺠﻤﻠﻪ ﺘﻜﺭﺍﺭﻴﻪ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺃل ‪ For‬ﺤﻴﺙ ﺍﻨﻪ ﺘﻡ ﺘﻌﺭﻴﻑ‬ ‫ﻤﺘﻐﻴﺭ ﺒﺩﺍﺨل ﺃل ‪ For‬ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﻻ ﻴﻌﺭﻑ ﻓﻲ ﺃل ‪ Declare‬ﻷﻨﻪ ﻤﻌﺭﻑ ﺘﻠﻘﺎﺌﻴﺎ ﺩﺍﺨل ﺃل ‪ For loop‬ﺜﻡ‬ ‫ﻨﺤﺩﺩ ﺍﻟﻘﻴﻡ ﺍﻟﺘﻲ ﺴﻴﺒﺩﺃ ﺒﻬﺎ ﺃل ‪ loop‬ﻭﺍﻟﻘﻴﻡ ﺍﻟﺘﻲ ﺴﻴﻨﺘﻬﻲ ﺒﻬﺎ ﺃل ‪ loop‬ﻭﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻴﺤﺩﺙ ﺍﻟﺘﻜﺭﺍﺭ‪ ٥‬ﻤﺭﺍﺕ‬ ‫ﺃﻱ ﺴﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻜﺭﺍﺭﻴﺔ ‪ ٥‬ﻤﺭﺍﺕ ﻭﻫﺫﻩ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻜﺭﺍﺭﻴﺔ ﻤﻌﻨﺎﻫﺎ ﺍﻨﻪ ﻴﺯﻭﺩ ﺍﻟﻤﺘﻐﻴﺭ‪ Id‬ﺒﻤﻘﺩﺍﺭ ‪ ٥‬ﻓﻲ ﻜل‬ ‫ﻤﺭﻩ ﻴﺤﺩﺙ ﺒﻬﺎ ‪ Loop‬ﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ ﺍﻟﻤﻭﺠﻭﺩ ﻓﻲ ﺠﺩﻭل ﺍﻟﺩﻭﺭﺍﺕ ﻟﻠﻁﺎﻟﺏ ﺭﻗﻡ ‪٤‬‬ ‫ﻓﻨﺠﺩ ﺃﻥ ﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ =‪ ٤٠‬ﻋﻨﺩﻤﺎ ﻴﺘﻡ ﺘﺯﻭﻴﺩﻩ ﺃﻭل ﻤﺭﻩ ﻴﺼﺒﺢ ‪٤٥‬ﺜﻡ ﻴﺘﻡ ﺍﻟﺘﻜﺭﺍﺭ ﻤﺭﻩ ﺜﺎﻨﻴﻪ ﻭﻨﺯﻭﺩﻩ ﺒﻤﻘﺩﺍﺭ ‪٥‬‬ ‫ﻟﻴﺼﺒﺢ ‪ ٥٠‬ﺜﻡ ﻓﻲ ﺍﻟﻤﺭﺓ ﺍﻟﺜﺎﻟﺜﺔ ﻴﺼﺒﺢ ‪ ٥٥‬ﻭﻓﻲ ﺍﻟﻤﺭﺓ ﺍﻟﺭﺍﺒﻌﺔ ﻴﺼﺒﺢ ‪ ٦٠‬ﻭﻓﻲ ﺁﺨﺭ ﻤﺭﻩ ﺍﻟﻤﺭﺓ ﺍﻟﺨﺎﻤﺴﺔ‬ ‫ﻴﺼﺒﺢ‪ ٦٥‬ﻭﺒﻬﺫﺍ ﻨﻜﻭﻥ ﻗﺩ ﻁﺒﻘﻨﺎ ﺠﻤﻠﻪ ﺃل ‪ For‬ﺍﻟﻤﺴﺘﺨﺩﻤﺔ ﻟﻠﺘﻜﺭﺍﺭ‬ ‫ﻭﻟﻤﺸﺎﻫﺩﻩ ﻫﺫﻩ ﺍﻟﻨﺘﺎﺌﺞ ﺍﻟﺘﻲ ﺘﻅﻬﺭ ﻨﻘﻭﻡ ﺒﻌﻤل ﻁﺒﺎﻋﻪ ﻟﻠﻤﺘﻐﻴﺭ ‪:Id‬‬

‫‪- ٤١ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻜﻤﺎ ﻨﺸﺎﻫﺩ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺍﻟﻨﺎﺘﺞ ﺒﻌﺩ ﺘﻁﺒﻴﻕ ‪ for‬ﻋﻠﻰ ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ‬ ‫ﻤﻠﺤﻭﻅﺔ ‪:‬‬ ‫ﺍﻟﻤﺘﻐﻴﺭ ﺍﻟﻤﻜﺘﻭﺏ ﻓﻲ ﺠﻤﻠﻪ ‪ for‬ﻻ ﻴﻌﺭﻑ ﻓﻲ ‪ Declare‬ﻭﺫﻟﻙ ﻷﻨﻪ ﻤﻌﺭﻑ ﺘﻠﻘﺎﺌﻴﺎ ﺩﺍﺨل ﺃل ‪loop‬‬ ‫ﻤﺜﺎل ‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ‪ V_id‬ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺭﻗﻤﻲ ﻭﺍﻟﻤﺘﻐﻴﺭ ‪ v_name‬ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺤﺭﻓﻲ ﻭﻓﻲ ﻫﺫﺍ‬ ‫ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﺤﺩﻴﺩ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﻭﻭﻀﻌﻪ ﺩﺍﺨل ﺍﻟﻤﺘﻐﻴﺭ ‪ v_id‬ﺒﺸﺭﻁ ﺃﻥ ﻴﻜﻭﻥ ﺍﺴﻡ ﺍﻟﻁﺎﻟﺏ = ﺍﺤﻤﺩ ﺜﻡ ﺘﻡ ﻜﺘﺎﺒﻪ‬ ‫ﺠﻤﻠﻪ ﺘﻜﺭﺍﺭ ﺒﺎﺴﺘﺨﺩﺍﻡ ‪ For‬ﺜﻡ ﺒﻌﺩﻫﺎ ﺘﻡ ﻜﺘﺎﺒﻪ ﺍﻟﻤﺘﻐﻴﺭ ‪ I‬ﻭﻫﺫﺍ ﺍﻟﻤﺘﻐﻴﺭ ﻻ ﻴﺘﻡ ﺘﻌﺭﻴﻔﻪ ﻓﻲ ‪ Declare‬ﻷﻨﻪ ﻴﺘﻡ‬

‫‪- ٤٢ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺘﻌﺭﻴﻔﻪ ﺘﻠﻘﺎﺌﻴﺎ ﺩﺍﺨل ﺃل ‪ For‬ﻭﻴﺤﺩﺙ ﺍﻟﺘﻜﺭﺍﺭ ‪ ٣‬ﻤﺭﺍﺕ ﻟﺠﻤﻠﻪ ﺃل ‪ Insert‬ﺍﻟﻤﻭﺠﻭﺩﺓ ﺩﺍﺨل ﺍﻟﺠﺩﻭل ﺜﻡ ﻨﻨﻬﻲ ﺠﻤﻠﻪ‬ ‫ﺃل ‪ Loop‬ﺒﺎﺴﺘﺨﺩﺍﻡ ‪End loop‬‬ ‫ﻭﻟﻜﻲ ﻨﺭﻯ ﺍﻟﻨﺎﺘﺞ ﻨﺘﺒﻊ ﺍﻵﺘﻲ‪:‬‬

‫ﺘﻡ ﺃﻀﺎﻓﻪ ‪ ٣‬ﺼﻔﻭﻑ ﻓﻲ ﺍﻟﺠﺩﻭل ﻭﺫﻟﻙ ﻻﻥ ﻴﻭﺠﺩ ﺠﻤﻠﻪ ﺘﻜﺭﺍﺭ ﻓﻲ ﺍﻟﺠﺩﻭل ﻭﻫﻲ ‪ For‬ﻭﻴﺘﻡ ﺍﻟﺘﻜﺭﺍﺭ ‪ ٣‬ﻤﺭﺍﺕ ﻓﻲ‬ ‫ﺍﻟﺠﺩﻭل‬ ‫‪SQL CURSOR‬‬ ‫ﺃل ‪ : CURSOR‬ﻴﻭﺠﺩ ﻓﻲ ﺍﻻﻭﺭﺍﻜل ﻋﻨﺼﺭ ﻴﺴﻤﻰ ‪ cursor‬ﻭ ﻅﻴﻔﺘﺔ ﺍﻻﺤﺘﻔﺎﻅ ﺒﻌﺩﺩ ﻜﺒﻴﺭ ﻤﻥ ﺍﻟﺴﺠﻼﺕ‬ ‫ﺃﺜﻨﺎﺀ ﺍﻟﺘﺸﻐﻴل ﻭ ﺘﺴﻬﻴل ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﻫﺫﻩ ﺍﻟﺴﺠﻼﺕ ﻭ ﺘﺤﺩﻴﺩ ﻋﺩﺩﻫﺎ‬ ‫ﺍﻯ ﺃﻥ ﺃل ‪ CURSOR‬ﻫﻭ ﻋﺒﺎﺭﺓ ﻋﻥ ﻭﻋﺎﺀ ﻴﺘﻡ ﺘﺨﺯﻴﻥ ﻜﻤﻴﻪ ﺒﻴﺎﻨﺎﺕ ﺃﻜﺜﺭ ﻤﻥ ﺴﺠل ﻭﺍﺤﺩ ﻭ ﻫﻲ ﺘﺸﺎﺒﻪ ﺠﺩﻭل‬ ‫ﻤﺅﻗﺕ ﻴﺘﻡ ﺇﻨﺸﺎﺀﻩ ﻓﻲ ﺍﻟﺫﺍﻜﺭﺓ ﻟﻼﺴﺘﻌﻤﺎل ﺜﻡ ﻴﺘﻡ ﺇﻟﻐﺎﺀﻩ ﻭ ﻓﻲ ﻫﺫﻩ ﺍﻟﺤﺎﻟﺔ ﻴﺘﻡ ﺇﻨﺸﺎﺀ ﺃل ‪cursor‬‬ ‫ﻭ ﻴﻭﺠﺩ ﻨﻭﻋﻴﻥ ﻤﻥ ﺃل ‪: CURSOR‬‬ ‫· ‪ : IMPLICIT CURSOR‬ﻭ ﻫﺫﺍ ﺍﻟﻨﻭﻉ ﻴﺘﻡ ﺇﻨﺸﺎﺌﻪ ﺘﻠﻘﺎﺌﻴﺎ ﻤﻥ ﻗﺒل ﺍﻻﻭﺭﺍﻜل ﻟﻺﺠﺭﺍﺀ ﺍﻟﻌﻤﻠﻴﺎﺕ‬ ‫ﺍﻟﺘﻲ ﺘﺤﺘﺎﺝ ﺫﻟﻙ ﺃﻭ ﺇﺠﺭﺍﺀ ﻋﻤﻠﻴﺎﺕ ﻋﻠﻰ ﻤﺠﻤﻭﻋﺔ ﻤﻥ ﺍﻟﺴﺠﻼﺕ ‪.‬‬ ‫ﺤﻴﺙ ﺍﻨﻪ ﻴﻨﺸﻁ ﻭ ﻴﺅﻜﺩ ﻤﺨﺭﺠﺎﺕ ﻋﺒﺎﺭﺍﺕ ‪DML‬‬

‫‪- ٤٣ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫ﺧﻄﺄ!‬

‫· ‪ : EXPLICIT CURSOR‬ﻫﺫﺍ ﺍﻟﻨﻭﻉ ﺍﻟﺨﺎﺹ ﺒﺎﻟﻤﺒﺭﻤﺞ ﻭ ﺍﻟﺫﻱ ﻴﻘﻭﻡ ﺒﺈﻨﺸﺎﺌﻪ ﻟﺘﻨﻔﻴﺫ ﺍﻷﻭﺍﻤﺭ ﻭ‬ ‫ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﻤﺠﻤﻭﻋﺔ ﻤﻥ ﺍﻟﺴﺠﻼﺕ ﻤﻥ ﺍﺨﺘﻴﺎﺭﻩ‬ ‫ﻭ ﻴﺠﺏ ﻋﻠﻴﻙ ﺍﻵﻥ ﺃﻥ ﺘﻌﺭﻑ ﻜﻴﻑ ﺘﺘﺤﻜﻡ ﻓﻲ ﺍﻟﺠﻤﻠﺔ‬ ‫ﺍﻨﻙ ﺘﺴﺘﺨﺩﻡ ‪ Open , Fetch and Close‬ﻟﻠﺘﺤﻜﻡ ﻓﻲ ﺃل ‪Cursor‬‬

‫‪ : Declare .١‬ﻟﻺﻋﻼﻥ ﻋﻥ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭ ﺍﻻﺴﺘﻌﻼﻤﺎﺕ ﻭ ﻋﻤل ﺍﺴﻡ ﺃل ‪. Cursor‬‬ ‫‪ : Open Cursor .٢‬ﻟﺘﻨﻔﻴﺫ ﺍﻻﺴﺘﻌﻼﻤﺎﺕ ﻭ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭ ﺍﻟﺼﻔﻭﻑ ﺍﻟﻤﻌﺭﻓﺔ ﻤﻥ ﺨﻼل ﺍﻻﺴﺘﻌﻼﻡ ﺘﺴﻤﻰ‬ ‫‪ Active set‬ﻭ ﺘﻜﻭﻥ ﻤﺴﻤﻭﺤﺔ ﻟﻌﻤﻠﻴﻪ ﺃل ‪. Fetch‬‬ ‫‪ : Fetch Data From Cursor .٣‬ﺘﺤﻤﻴل ﺍﻟﺼﻔﻭﻑ ﺩﺍﺨل ﺍﻟﻤﺘﻐﻴﺭﺍﺕ‬ ‫‪ : Empty .٤‬ﺍﻟﻔﺤﺹ ﺍﻟﺼﻔﻭﻑ ﻭ ﺍﻟﺭﺠﻭﻉ ﺇﻟﻰ ﻋﻤﻠﻴﻪ ﺃل ‪ Fetch‬ﺇﺫﺍ ﻭﺠﺩ ﺼﻔﻭﻑ‬ ‫‪ : Close .٥‬ﻹﻏﻼﻕ ﺃل ‪cursor‬‬ ‫‪ Cursor‬ﺍﻹﻋﻼﻥ ﻋﻥ ﺃل‬ ‫· ﻻ ﺘﺴﺘﺨﺩﻡ ﻋﺒﺎﺭﺓ ‪ INTO‬ﻓﻲ ﺍﻹﻋﻼﻥ ﻋﻥ ﺃل ‪Cursor‬‬ ‫· ﻟﻭ ﻜﻨﺕ ﺘﺴﺘﺨﺩﻡ ﻓﻲ ﺍﻟﺼﻔﻭﻑ ﻋﺒﺎﺭﺓ ﺃل ‪ sequence‬ﻴﺠﺏ ﻋﻠﻴﻙ ﺍﺴﺘﺨﺩﺍﻡ ﻋﺒﺎﺭﺓ ‪ Order By‬ﺩﺍﺨل‬ ‫ﺍﻻﺴﺘﻌﻼﻡ‬ ‫ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ‪:‬‬ ‫‪CURSOR cursor_statment IS‬‬ ‫; ‪Select_statment‬‬ ‫ﻤﺜﺎل ﻓﻲ ﺍﻹﻋﻼﻥ ﻋﻥ ﺃل ‪Declare Cursor‬‬ ‫‪- ٤٤ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺧﻄﺄ!‬

‫‪: Open Cursor - ٢‬‬

‫ﻟﻔﺘﺢ ﺃل ‪ CURSOR‬ﻟﺘﻨﻔﻴﺫ ﺍﻻﺴﺘﻌﻼﻡ ﻭ ﻟﻴﻁﺎﺒﻕ ﺃﻭ ﻴﺴﺎﻭﻯ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﺼﻔﻭﻑ‬ ‫‪: FETCHING DATA FROM THE CURSOR - ٣‬‬ ‫ﺇﺭﺠﺎﻉ ﺍﻟﺼﻑ ﺍﻟﺤﺎﻟﻲ ﻓﻲ ﺍﻟﻤﺘﻐﻴﺭ ﻭ ﻻﺒﺩ ﺃﻥ ﺘﺤﺘﻭﻯ ﻋﻠﻰ ﻨﻔﺱ ﺃﺭﻗﺎﻡ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭ ﺍﻟﻔﺤﺹ ﻟﻜﻨﻰ ﻨﺭﻯ ﺍﺫﺍ ﻜﺎﻥ‬ ‫ﺃل ‪ cursor‬ﻴﺤﺘﻭﻯ ﻋﻠﻰ ﺼﻔﻭﻑ‬

‫‪ - ٤‬ﻏﻠﻕ ﺃل ‪cursor‬‬

‫‪- ٤٥ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫*** ﻭ ﻴﺴﺘﺨﺩﻡ ﺃل ‪: cursor‬‬ ‫‪ -‬ﺍﻷﻤﺭ ‪ %ISOPEN‬ﻟﻠﺴﺅﺍل ﻫل ‪ CURSOR‬ﻤﻔﺘﻭﺤﺔ ﺃﻡ ﻻ ﻟﻠﺘﻌﺎﻤل ﻤﻌﻬﺎ ‪.‬‬‫‪ -‬ﺍﻷﻤﺭ ‪ %ROWCOUNT‬ﻻﺴﺘﺭﺠﺎﻉ ﺃﺭﻗﺎﻡ ﺍﻟﺼﻔﻭﻑ ﺒﺩﻗﺔ ﻓﻲ ﺃل ‪CURSOR‬‬‫‪ -‬ﺍﻷﻤﺭ ‪ %FOUND‬ﻟﻤﻌﺭﻓﺔ ﻫل ﻴﻭﺠﺩ ﺴﺠﻼﺕ ﻓﻲ ﺃل ‪ CURSOR‬ﺃﻡ ﻻ‬‫‪ -‬ﺍﻷﻤﺭ ‪ %NOTFOUND‬ﻨﻔﺱ ﺍﺴﺘﻌﻤﺎل ﺍﻷﻤﺭ ‪ % FOUND‬ﻭ ﻟﻜﻥ ﺒﺼﻴﻐﺔ ﻨﻔﻰ‬‫‪ -‬ﺍﻷﻤﺭ ‪ %FETCH‬ﻟﻸﺨﺫ ﺍﻟﺴﺠﻼﺕ ﻤﻥ ‪CURSOR‬‬‫‪ %ISOPEN‬ﻴﺤﻀﺭ ﺍﻟﺼﻔﻭﻑ ﻓﻘﻁ ﻋﻨﺩﻤﺎ ﻴﻜﻭﻥ ﺍل ‪ CURSOR‬ﻤﻔﺘﻭﺡ‬

‫•‬

‫‪n‬‬ ‫‪n‬‬

‫‪%NOTFOUND , %ROWCOUNT‬‬ ‫‪ : %ROWCOUNT‬ﻻﺴﺘﺭﺠﺎﻉ ﺃﺭﻗﺎﻡ ﺍﻟﺼﻔﻭﻑ ﺒﺩﻗﺔ‬ ‫‪ : %NOTFOUND‬ﻨﺴﺘﺨﺩﻤﻪ ﻟﺘﺤﺩﻴﺩ ﻤﺘﻰ ﺴﻨﺨﺭﺝ ﻤﻥ ﺃل ‪. LOOP‬‬

‫‪- ٤٦ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫ﻤﺜﺎل ﻻﺴﺘﺭﺠﺎﻉ ‪ ١٠‬ﻤﻭﻅﻔﻴﻥ ﻭﺍﺤﺩ ﺘﻠﻭ ﺍﻵﺨﺭ ‪.‬‬

‫ﺃل ‪ Cursor‬ﻭ ﺃل ‪Record‬‬ ‫ﻭ ﺍﻟﺼﻔﻭﻑ ﺍﻟﻤﺴﺘﻌﻠﻡ ﻋﻨﻬﺎ ﻓﻲ ﺃل ‪ cursor‬ﻤﻤﻜﻥ ﺃﻥ ﻨﺤﻀﺭ ﻗﻴﻤﻬﺎ ﺩﺍﺨل ﺃل ‪record‬‬ ‫ﻤﺜﺎل ‪:‬‬

‫ﺃل ‪Cursor For Loops‬‬ ‫• ‪ Cursor For Loops‬ﻫﻭ ﺍﺨﺘﺼﺎﺭ ﻟﻌﻤﻠﻴﺎﺕ ﺃل ‪ Explicit Cursor‬ﻻﻥ ﺃل ‪ Cursor‬ﻴﻜﻭﻥ‬ ‫ﻤﻔﺘﻭﺡ ﻭ ﺍﻟﺼﻔﻭﻑ ﻗﺩ ﺍﺴﺘﺭﺠﻌﺕ ﺃﻭ ﺃﺤﻀﺭﺕ ﻭ ﺘﻜﺭﺭﺕ ﻓﻲ ﺃل ‪ loop‬ﻭ ﺃل ‪ loop‬ﻗﺩ ﺃﻏﻠﻕ‬ ‫ﺍﺘﻭﻤﺎﺘﻴﻜﻴﺎ ﻋﻨﺩﻤﺎ ﺘﻜﻭﻥ ﺠﻤﻴﻊ ﺍﻟﻌﻤﻠﻴﺎﺕ ﻋﻠﻰ ﺍﻟﺼﻔﻭﻑ ﻗﺩ ﺍﻨﺘﻬﺕ ‪.‬‬ ‫• ﺃل ‪ loop‬ﻨﻔﺴﻪ ﺍﻨﺘﻬﻰ ﺍﺘﻭﻤﺎﺘﻴﻜﻴﺎ ﻓﻲ ﻨﻬﺎﻴﺔ ﺍﻟﺘﻜﺭﺍﺭ ﻋﻨﺩﻤﺎ ﻴﻜﻭﻥ ﺃﺨﺭ ﺼﻑ ﻗﺩ ﺍﺤﻀﺭ‬ ‫ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻟﻸﻤﺭ ‪: Cursor For Loop‬‬ ‫‪- ٤٧ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫‪For record_name In cursor_name Loop‬‬ ‫; ‪Statement 1‬‬ ‫; ‪Statement 2‬‬ ‫……………‬ ‫; ‪End loop‬‬

‫ﺒﻌﺽ ﺍﻟﻤﻼﺤﻅﺎﺕ ‪:‬‬ ‫‪ n‬ﻻ ﺘﻘﻡ ﺒﺘﻌﺭﻴﻑ ﺃل ‪ Record‬ﺍﻟﺫﻱ ﻴﺘﺤﻜﻡ ﻓﻲ ﺃل ‪ Loop‬ﻫﺩﻓﻪ ﻓﻘﻁ ﺩﺍﺨل ﺃل ‪. Loop‬‬ ‫‪ n‬ﻗﻡ ﺒﺎﺨﺘﻴﺎﺭ ﺃل ‪ Cursor‬ﻤﻥ ﺨﻼل ﺃل ‪. Loop‬‬ ‫‪ n‬ﻗﻡ ﺒﺯﻴﺎﺩﺓ ﺃل ‪ Cursor‬ﺏ ﺃل ‪ Parameters‬ﺇﺫﺍ ﺘﺘﻁﻠﺏ ﻭ ﺫﻟﻙ ﺩﺍﺨل ) ( ﻴﺘﻠﻭﻫﺎ ﺍﺴﻡ ﺃل‬ ‫‪ Cursor‬ﻭ ﺫﻟﻙ ﺩﺍﺨل ﻋﺒﺎﺭﺓ ‪. For‬‬ ‫‪ n‬ﻻ ﺘﺴﺘﺨﺩﻡ ﺃل ‪ Cursor For Loop‬ﻋﻨﺩﻤﺎ ﺘﻜﻭﻥ ﻋﻤﻠﻴﺎﺕ ﺃل ‪ Cursor‬ﺘﺼﺤﺢ ﻴﺩﻭﻴﺎ ‪.‬‬

‫ﺍﺴﺘﺨﺩﺍﻡ ﺍﻻﺴﺘﻌﻼﻤﺎﺕ ﺍﻟﻤﺘﻌﺩﺩﺓ ﻓﻲ ﺃل ‪. For Loops Cursor‬‬ ‫ﻟﺴﺕ ﻤﺤﺘﺎﺝ ﺃﻥ ﺘﻌﺭﻑ ﺃل ‪ cursor‬ﻻﻥ ﺃل ‪ pl/sql‬ﻴﺴﻤﺢ ﻟﻙ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻻﺴﺘﻌﻼﻤﺎﺕ ﺍﻟﻤﺘﻌﺩﺩﺓ ‪.‬‬

‫ﺍﺴﺘﺨﺩﺍﻡ ﺃل ‪ Parameters‬ﻓﻲ ﺃل ‪Cursor‬‬

‫‪- ٤٨ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺃل ‪ Parameters‬ﺘﺴﻤﺢ ﻟﻠﻘﻴﻡ ﺒﺎﻟﻤﺭﻭﺭ ﺇﻟﻰ ﺃل ‪ Cursor‬ﻋﻨﺩﻤﺎ ﻴﻜﻭﻥ ﻤﻔﺘﻭﺡ ﻭ ﻤﻌﻨﻰ ﺫﻟﻙ ﺍﻨﻙ ﻤﻤﻜﻥ ﺃﻥ ﺘﻔﺘﺢ‬ ‫ﺃل ‪ Explicit Cursor‬ﻜﺫﺍ ﻤﺭﺓ ﺩﺍﺨل ﺃل ‪ Block‬ﻭ ﺍﺴﺘﺭﺠﺎﻉ ﺍﺴﺘﻌﻼﻤﺎﺕ ﻤﺨﺘﻠﻔﺔ‬ ‫ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ‪:‬‬ ‫]) ‪CURSOR Cursor_name [ ( parameter_name datatype ,….‬‬ ‫‪IS‬‬ ‫; ‪Select_Statment‬‬ ‫ﺃل ‪ : Cursor_name‬ﺍﺴﻡ ﺃل ‪ cursor‬ﻤﻌﺭﻑ ﺴﺎﺒﻘﺎ ﻓﻲ ﺃل ‪PL/SQL‬‬ ‫ﺃل ‪ : Parameter_name‬ﺍﺴﻡ ﺃل ‪Parameter‬‬ ‫ﺃل ‪ : datatype‬ﻨﻭﻉ ﺒﻴﺎﻨﺎﺕ ﺃل ‪Parameter‬‬ ‫ﺃل ‪ : Select_statment‬ﻋﺒﺎﺭﺓ ﺍﺴﺘﻌﻼﻡ ﺒﺩﻭﻥ ﻜﻠﻤﺔ ‪Into‬‬ ‫ﻋﻨﺩﻤﺎ ﻴﻔﺘﺢ ﺃل ‪ cursor‬ﺘﻘﻭﻡ ﺒﻤﺭﻭﺭ ﺍﻟﻘﻴﻡ ﺇﻟﻰ ﺍﻯ ‪Parameter‬‬

‫ﺍﺴﺘﺨﺩﺍﻡ ‪: For Update Clause‬‬ ‫ﺘﺭﻴﺩ ﺃﻥ ﺘﻘﻭﻡ ﺒﻐﻠﻕ ﺃل ﺍﻟﺼﻔﻭﻑ ﻗﺒل ﻗﻴﺎﻤﻙ ﺒﻌﻤل ﺘﻌﺩﻴل ﺃﻭ ﺤﺫﻑ ﻟﻠﺼﻔﻭﻑ ﺍﻟﻤﻭﺠﻭﺩﺓ ﺘﻘﻭﻡ ﺒﺈﻀﺎﻓﺔ ﻋﺒﺎﺭﺓ‬ ‫‪ For Update Clause‬ﻓﻲ ﺍﺴﺘﻌﻼﻡ ﺃل ‪ Cursor‬ﻹﻏﻼﻕ ﺍﻟﺼﻔﻭﻑ ﻋﻨﺩ ﻓﺘﺢ ﺃل ‪Cursor‬‬ ‫ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ‪:‬‬ ‫‪Select …….‬‬ ‫…… ‪From‬‬ ‫; ]‪For Update [ of column_reference ] [Nowait‬‬ ‫ﺃل ‪ : Column_reference‬ﻋﻤﻭﺩ ﻓﻲ ﺠﺩﻭل ﻤﻘﺎﺒل ﻟﻼﺴﺘﻌﻼﻡ ﺍﻟﻤﺼﻨﻭﻉ‬ ‫ﺃل ‪ : Nowait‬ﻴﺭﺠﻊ ﺃﺨﻁﺎﺀ ﺍﻻﻭﺭﺍﻜل ﻟﻭ ﻜﺎﻨﺕ ﺍﻟﺼﻔﻭﻑ ﻤﻐﻠﻘﻪ ﻓﻲ ﻤﻜﺎﻥ ﺃﺨﺭ‬ ‫‪ : For Update‬ﻴﻌﺘﺒﺭ ﺃﺨﺭ ﻋﺒﺎﺭﺓ ﻓﻲ ﻋﺒﺎﺭﺓ ﺍﻻﺴﺘﻌﻼﻡ ﺒﻌﺩ ﻋﺒﺎﺭﺓ ‪ Order By‬ﻟﻭ ﻜﺎﻨﺕ ﻤﻭﺠﻭﺩﺓ‬

‫‪- ٤٩ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺍﺴﺘﺨﺩﺍﻡ ‪Where Current of Cursor‬‬ ‫ﺘﺴﺘﺨﺩﻡ ﺃل ‪ Cursor‬ﻟﻌﻤﻠﻴﻪ ﺍﻟﺘﻌﺩﻴل ﺃﻭ ﺍﻟﺤﺫﻑ ﺍﻟﺼﻑ ﺍﻟﺤﺎﻟﻲ‬ ‫ﺍﺤﺘﻭﺍﺌﻬﺎ ﻋﻠﻰ ﻋﺒﺎﺭﺓ ‪ For update‬ﻓﻲ ﺍﺴﺘﻌﻼﻡ ﺃل ‪ Cursor‬ﻟﻐﻠﻕ ﺍﻟﺼﻔﻭﻑ‬ ‫ﺍﺴﺘﺨﺩﺍﻡ ‪ Where Current of‬ﻟﻺﺸﺎﺭﺓ ﺇﻟﻰ ﺍﻟﺼﻑ ﺍﻟﺤﺎﻟﻲ ﻤﻥ ﺨﻼل ﺃل ‪Explicit Cursor‬‬

‫ﺍﺴﺘﺨﺩﺍﻡ ﺃل ‪ cursor‬ﻓﻲ ﺍﻻﺴﺘﻌﻼﻤﺎﺕ ﺍﻟﻤﺘﻌﺩﺩﺓ ‪.‬‬ ‫ﺍﻻﺴﺘﻌﻼﻤﺎﺕ ﺍﻟﻤﺘﻌﺩﺩﺓ ‪ :‬ﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻥ ﺍﺴﺘﻌﻼﻡ ﻋﺎﺩﺓ ﺘﻜﻭﻥ ﻤﻐﻠﻘﺔ ﺩﺍﺨل )( ﺩﺍﺨل ﺍﺴﺘﻌﻼﻡ ﺃﺨﺭ ﻭ ﺘﻅﻬﺭ ﻤﻥ‬ ‫ﺨﻼل ﻋﺒﺎﺭﺍﺕ ﻤﻌﺎﻟﺠﺔ ﺒﻴﺎﻨﺎﺕ ﺃل ‪ sql‬ﻭ ﻴﺴﺘﺨﺩﻡ ﺃﻴﻀﺎ ﻓﻲ ﻋﺒﺎﺭﺓ ﺃل ‪ where‬ﻤﻥ ﺠﻤﻠﻪ ﺍﻻﺴﺘﻌﻼﻡ ﻭ ﺘﺴﺘﺨﺩﻡ‬ ‫ﺃﻴﻀﺎ ﻓﻲ ﻋﺒﺎﺭﺓ ﺃل ‪From‬‬ ‫ﻤﺜﺎل ‪:‬‬

‫ﻤﻌﺎﻟﺠﻪ ﺍﻷﺨﻁﺎﺀ ﻓﻲ ‪PL/SQL‬‬ ‫ﺘﻘﺴﻡ ﺃﺨﻁﺎﺀ ﺍﻟﺒﺭﻨﺎﻤﺞ ﺇﻟﻰ ﺜﻼﺙ ﺃﻨﻭﺍﻉ ﻭ ﻫﻲ ‪:‬‬ ‫‪ -١‬ﺍﻟﺨﻁﺎﺀ ﺍﻟﻬﺠﺎﺌﻲ ‪Syntax Error‬‬

‫‪- ٥٠ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻭ ﻫﻭ ﺨﻁﺎﺀ ﻓﻲ ﺤﺭﻭﻑ ﻜﻠﻤﺎﺕ ﺍﻟﻠﻐﺔ ﻭ ﺫﻟﻙ ﺒﻜﺘﺎﺒﻪ ﺃﻤﺭ ﺨﻁﺎﺀ ﺃﻭ ﺨﻁﺎﺀ ﻓﻲ ﻗﺎﻋﺩﺓ ﻨﺤﻭﻴﻪ ﻷﻭﺍﻤﺭ ﺍﻟﻠﻐﺔ ﻤﺜل‬ ‫ﻜﺘﺎﺒﻪ ﺃﻤﺭ ‪ If‬ﺒﺩﻭﻥ ‪ Then‬ﺃﻭ ﺒﺩﻭﻥ ‪ End If‬ﻭ ﻫﺫﺍ ﻫﻭ ﺃﺴﻬل ﺃﻨﻭﺍﻉ ﺍﻷﺨﻁﺎﺀ ﺤﻴﺙ ﻴﺘﻡ ﺘﺼﻤﻴﻡ ﺃﻭﻻ ﺒﺄﻭل‬ ‫ﺒﺩﻭﻥ ﺍﻟﻭﺼﻭل ﺒﻪ ﺇﻟﻰ ﺍﻟﻤﺴﺘﺨﺩﻡ ﺤﻴﺙ ﻻ ﻴﺘﻡ ﺘﺭﺠﻤﻪ ﺍﻟﺒﺭﻨﺎﻤﺞ ﻗﺒل ﺍﻻﻨﺘﻬﺎﺀ ﻓﻲ ﺍﻷﺨﻁﺎﺀ ﺍﻟﻨﺤﻭﻴﺔ ‪.‬‬ ‫‪ -٢‬ﺍﻟﺨﻁﺎﺀ ﺍﻟﻤﻨﻁﻘﻲ ‪LOGIC ERROR‬‬ ‫ﻭ ﻫﻭ ﺨﻁﺎﺀ ﻓﻲ ﻤﻨﻁﻕ ﺍﻟﺒﺭﺍﻤﺞ ﻭ ﻤﻌﻨﺎﻩ ﺍﻨﻙ ﻜﺘﺒﺕ ﺍﻟﺒﺭﻨﺎﻤﺞ ﺒﻘﻭﺍﻋﺩ ﺴﻠﻴﻤﺔ ﻭ ﻋﻨﺩ ﺘﺭﺠﻤﺘﻪ ﻻ ﺘﺤﺼل ﻋﻠﻰ ﺍﻯ‬ ‫ﺭﺴﺎﺌل ﺨﻁﺎﺀ ﻟﻜﻥ ﻋﻨﺩ ﺘﺸﻐﻴﻠﻪ ﺘﺠﺩ ﺃﻥ ﺍﻟﻨﺘﺎﺌﺞ ﺨﺎﻁﺌﺔ ﻭ ﻴﺭﺠﻊ ﻫﺫﺍ ﺍﻟﺨﻁﺎﺀ ﺇﻟﻰ ﻭﺠﻭﺩ ﺨﻁﺎﺀ ﻤﻨﻁﻘﻲ ﻤﺜل ﺇﺸﺎﺭﺓ‬ ‫ﻤﻌﺎﺩﻟﻪ ﺨﻁﺎﺀ ﺃﻭ ﺍﺴﺘﺨﺩﺍﻡ ﺠﻤﻠﻪ ﺸﺭﻁ ‪ IF‬ﺨﻁﺎﺀ ‪.‬‬

‫‪ -٢‬ﺍﻟﺨﻁﺎﺀ ﺃﺜﻨﺎﺀ ﺍﻟﺘﺸﻐﻴل ‪RUN TIME ERROR‬‬ ‫ﻭ ﻫﻭ ﻅﻬﻭﺭ ﺭﺴﺎﻟﺔ ﺨﻁﺎﺀ ﻟﻠﻤﺴﺘﺨﺩﻡ ﺃﺜﻨﺎﺀ ﺘﺸﻐﻴل ﺍﻟﺒﺭﻨﺎﻤﺞ ﻭ ﺫﻟﻙ ﻟﻭﻗﻭﻉ ﺨﻁﺎﺀ ﻟﻡ ﻴﺘﻭﻗﻌﻪ ﺍﻟﻤﺒﺭﻤﺞ ﻭ ﻟﻡ ﻴﺘﻌﺎﻤل‬ ‫ﻤﻌﻪ ﻤﺜل ﺃﻤﺭ ﻁﺒﺎﻋﺔ ﻓﻲ ﺤﻴﻥ ﺃﻥ ﺍﻟﻪ ﺍﻟﻁﺒﺎﻋﺔ ﻏﻴﺭ ﺠﺎﻫﺯﺓ ﻓﻴﻘﻭﻡ ﻨﻅﺎﻡ ﺍﻟﺘﺸﻐﻴل ﺒﻘﻁﻊ ﻋﻤل ﺍﻟﺒﺭﻨﺎﻤﺞ ﻭ ﺇﻋﻁﺎﺀ‬ ‫ﺭﺴﺎﻟﺔ ﺨﻁﺎﺀ‬ ‫ﻭ ﻫﺫﺍ ﺍﻟﻨﻭﻉ ﻤﻥ ﺍﻷﺨﻁﺎﺀ ﻴﻌﺘﺒﺭ ﺨﻁﺎﺀ ﻓﺎﺩﺤﺎ ﻓﻲ ﺍﻟﺒﺭﺍﻤﺞ ﻭ ﺍﻟﺫﻱ ﻴﻌﻁﻰ ﺼﻭﺭ ﺴﻴﺌﺔ ﻋﻥ ﺍﻟﺒﺭﻨﺎﻤﺞ ﺍﻟﺫﻱ ﻴﻘﻁﻊ‬ ‫ﺍﻟﻌﻤل ﺘﻜﺭﺍﺭﺍ ﻋﻠﻰ ﺍﻟﻤﺴﺘﺨﺩﻡ ﻭ ﻴﻀﻁﺭ ﻹﻋﺎﺩﺓ ﺍﻟﺘﺸﻐﻴل ﻜل ﻤﺭﺓ ﻟﺫﻟﻙ ﻨﻨﺎﻗﺵ ﻓﻲ ﻫﺫﻩ ﺍﻟﻔﻘﺭﺓ ﻜﻴﻔﻴﺔ ﺘﺘﻼﺸﻰ ﻫﺫﺍ‬ ‫ﺍﻟﺨﻁﺎﺀ ﻭ ﺫﻟﻙ ﺒﺎﺴﺘﻌﻤﺎل ‪ EXCEPTION‬ﺍﻯ ﺍﻻﺴﺘﺜﻨﺎﺀﺍﺕ ﺤﻴﺙ ﻴﺘﻡ ﺘﻭﺠﻴﻪ ﺍﻟﺒﺭﻨﺎﻤﺞ ﺇﻟﻰ ﻫﺫﺍ ﺍﻻﺴﺘﺜﻨﺎﺀ ﻋﻨﺩ‬ ‫ﺤﺩﻭﺙ ﺨﻁﺎﺀ ‪.‬‬ ‫ﻤﻌﻨﻰ ﻜﻠﻤﻪ ‪EXCEPTION‬‬ ‫ﻭ ﻫﻲ ﺠﺯﺀ ﻤﻥ ﺍﻷﻤﺭ ﻴﺘﻡ ﺘﻭﺠﻴﻪ ﺴﻴﺭ ﺍﻟﺒﺭﻨﺎﻤﺞ ﺇﻟﻴﻪ ﻋﻨﺩ ﺤﺩﻭﺙ ﺨﻁﺎﺀ ﻟﻴﻘﻭﻡ ﻫﻭ ﺒﺘﻨﺎﻭل ﺍﻟﺨﻁﺎﺀ ﻭ ﺍﻟﻘﻴﺎﻡ ﺒﻌﻤل‬ ‫ﺍﻟﻼﺯﻡ ﻋﻨﺩ ﺤﺩﻭﺙ ﺍﻟﺨﻁﺎﺀ ﻭ ﻜﺫﻟﻙ ﺍﻟﺭﺴﺎﺌل ﺍﻟﻤﻁﻠﻭﺏ ﺇﻅﻬﺎﺭﻫﺎ ﻋﻨﺩ ﺤﺩﻭﺙ ﺍﻟﺨﻁﺎﺀ‬ ‫ﻭ ﻴﻭﺠﺩ ﺜﻼﺙ ﺃﻨﻭﺍﻉ ﻤﻥ ﺍﻻﺴﺘﺜﻨﺎﺀﺍﺕ ‪ EXCEPTIONS‬ﻭ ﻫﻲ‬ ‫§‬ ‫§‬ ‫§‬

‫ﺍﺴﺘﺜﻨﺎﺀ ﻤﻌﺭﻑ ‪Predefined Exception‬‬ ‫ﺍﺴﺘﺜﻨﺎﺀ ﻤﻥ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺒﺭﻤﺞ ‪User Defined Exception‬‬ ‫ﺍﺴﺘﺜﻨﺎﺀ ﺩﺍﺨﻠﻲ ‪Internal Exception‬‬

‫‪ -١‬ﺍﻻﺴﺘﺜﻨﺎﺀ ﺍﻟﻤﻌﺭﻑ ﻤﻥ ﻗﺒل ‪predefine exception‬‬ ‫ﻭ ﻫﻭ ﺍﺴﺘﺜﻨﺎﺀ ﻤﻌﺭﻑ ﻤﻥ ﻗﺒل ‪ oracle‬ﻟﻤﺠﻤﻭﻋﺔ ﻤﻥ ﺍﻟﺤﺎﻻﺕ ﻭ ﺍﻟﺘﻌﺎﻤل ﻤﻌﻬﺎ ﻭ ﺘﺴﻤﻰ ‪ predefined‬ﺃﻭ‬ ‫‪ built-in‬ﻓﻤﺜﻼ ﻫﻨﺎﻙ ﺨﻁﺎﺀ ﻤﻌﺭﻑ ﻴﺴﻤﻰ ‪ no data‬ﻋﻨﺩ ﻗﻴﺎﻡ ﺠﻤﻠﻪ ‪ select‬ﺒﺈﻋﺎﺩﺓ ﺒﻴﺎﻨﺎﺕ ﻭﻻ ﺘﻌﻴﺩ ﻴﻅﻬﺭ‬ ‫‪ no data‬ﺃﻭ ﺨﻁﺎﺀ ﺁﺨﺭ ﻭ ﻫﻭ ﻗﻴﺎﻡ ﺠﻤﻠﻪ ‪ select‬ﺒﺈﻋﺎﺩﺓ ﺃﻜﺜﺭ ﻤﻥ ﺴﺠل ﻓﻲ ﺤﻴﻥ ﺍﻨﻙ ﺘﺴﺘﻌﻤل ‪select into‬‬ ‫ﺤﻴﺙ ﺘﺨﺯﻥ ﻫﺫﻩ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻓﻲ ﻤﺘﻐﻴﺭ ﺴﺠل ﻭﺍﺤﺩ ﻭ ﻫﺫﻩ ﺍﻷﺨﻁﺎﺀ ﻴﺘﻡ ﺍﻟﺘﻌﺎﻤل ﻤﻌﻬﺎ ﻤﻥ ﻗﺒل ‪ oracle‬ﻭ ﻟﻜﻥ‬ ‫ﻟﺘﻐﻴﻴﺭ ﺍﻟﺭﺴﺎﻟﺔ ﻭ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﻫﺫﺍ ﺍﻟﺨﻁﺎﺀ ﻤﻥ ﻗﺒل ﺍﻟﻤﺒﺭﻤﺞ ﺘﻘﻭﻡ ﺒﻜﺘﺎﺒﻪ ﺍﻷﻭﺍﻤﺭ ﻓﻲ ﺠﺯﺀ ﺃل ‪ exception‬ﻓﻲ‬ ‫ﻨﻬﺎﻴﺔ ﺒﻠﻭﻙ ﺍﻷﻭﺍﻤﺭ ﻭﻫﺫﺍ ﺍﻟﻨﻭﻉ ﻴﺘﻤﻴﺯ ﺒﺎﻥ ﺃل ‪ oracle‬ﻴﻌﺭﻑ ﺤﺎﻟﻪ ﺤﺩﻭﺜﻪ ﻟﺫﻟﻙ ﻤﺎ ﻋﻠﻴﻙ ﺴﻭﻯ ﻜﺘﺎﺒﻪ ﺍﻷﻭﺍﻤﺭ‬ ‫ﺍﻟﺘﻲ ﺘﻨﻔﺫ ﻋﻨﺩ ﺤﺩﻭﺙ ﻫﺫﺍ ﺍﻟﺨﻁﺎﺀ‬

‫‪- ٥١ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫‪ -٢‬ﺨﻁﺎﺀ ﻤﻌﺭﻑ ﻤﻥ ﻗﺒل ﺍﻟﻤﺒﺭﻤﺞ ‪user_defined exception‬‬ ‫ﻫﺫﺍ ﺍﻟﻨﻭﻉ ﻻ ﻴﻌﺭﻓﻪ ﺃل ‪ oracle‬ﻭ ﻟﻜﻥ ﻴﺘﻡ ﺘﻌﺭﻴﻔﻪ ﻤﻥ ﻗﺒل ﺍﻟﻤﺒﺭﻤﺞ ﻟﺫﻟﻙ ﻴﺴﻤﻰ ‪ user defined‬ﻭ ﻟﻪ ﺜﻼﺜﺔ‬ ‫ﺃﺠﺯﺍﺀ ﻫﻲ ‪:‬‬ ‫·‬

‫ﺠﺯﺀ ﺍﻟﺘﻌﺭﻴﻑ‬

‫‪. exception declaration‬‬

‫ﻭﻫﻭ ﺠﺯﺀ ﺍﻹﻋﻼﻥ ﻋﻥ ﺍﺴﻡ ﻫﺫﺍ ﺍﻟﻨﻭﻉ ﻤﻥ ﺍﻟﺨﻁﺎﺀ ﻷﻨﻪ ﻏﻴﺭ ﻤﻌﺭﻑ ﻟﺩﻯ ‪ Oracle‬ﻓﻴﺘﻡ ﺘﻌﺭﻴﻑ ﻤﺘﻐﻴﺭ ﺠﺩﻴﺩ‬ ‫ﻤﻥ ﺍﻟﻨﻭﻉ ‪exception‬‬ ‫·‬

‫ﺍﺨﺘﺒﺎﺭ ﺍﻟﺨﻁﺎﺀ ‪exception teasing‬‬

‫ﻭ ﻓﻴﻪ ﻴﺘﻡ ﻭﻀﻊ ﺸﺭﻁ ﺤﺩﻭﺙ ﻫﺫﺍ ﺍﻟﺨﻁﺎﺀ ﻻﻥ ﺃل ‪ oracle‬ﻻ ﻴﻌﺭﻑ ﻤﻌﻨﺎﻩ ﻭ ﻻ ﻴﻌﺭﻑ ﻭﻗﺕ ﺤﺩﻭﺜﻪ ﻟﻴﻭﺠﻪ‬ ‫ﺴﻴﺭ ﺍﻟﺒﺭﻨﺎﻤﺞ ﺇﻟﻰ ﻗﺴﻡ ﺃل ‪exception‬‬

‫·‬

‫ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻟﺨﻁﺎﺀ ‪exception handling‬‬

‫ﻭ ﻫﻭ ﻗﺴﻡ ﺃل ‪ exception‬ﺍﻟﺘﻘﻠﻴﺩﻱ ﺍﻟﺫﻱ ﻴﻨﺘﻅﺭ ﺃﻥ ﻴﻭﺠﻪ ﺇﻟﻴﻪ ﺍﻟﺨﻁﺎﺀ ﺒﻌﺩ ﺘﻌﺭﻴﻑ ﻭ ﺘﺤﺩﻴﺩ ﺤﺎﻟﻪ ﺤﺩﻭﺜﻪ ﻟﻠﻘﻴﺎﻡ‬ ‫ﺒﻼﺯﻡ ﻭ ﺘﻨﻔﻴﺫ ﺍﻷﻭﺍﻤﺭ ﻭ ﺍﻟﺭﺴﺎﺌل ﺍﻟﺘﻲ ﻴﻜﺘﺒﻬﺎ ﺍﻟﻤﺒﺭﻤﺞ‬

‫ﻭ ﻴﻭﺠﺩ ﻋﺩﺓ ﺃﻨﻭﺍﻉ ﻤﻥ ﺍﻷﺨﻁﺎﺀ ﺍﻟﻤﺤﺩﺩﺓ ﺒﻜﻠﻤﺎﺕ ﻤﻌﺭﻓﺔ ﺒﺩﻴﻠﻪ ﻟﻠﻌﺒﺎﺭﺓ ‪ exception1,2,..‬ﻭ ﻤﻥ ﺍﻟﻘﻴﻡ ﺍﻟﻤﻌﺭﻓﺔ‬ ‫ﻟﺩﻯ ﺍﻻﻭﺭﺍﻜل ﻤﺎ ﻴﻠﻲ‬ ‫* ‪ : NO_DATA_FOUND‬ﺘﺴﺘﻌﻤل ﻋﻨﺩ ﺘﻨﻔﻴﺫ ﺃﻤﺭ ‪ SELECT‬ﺃﻭ ‪ CURSOR‬ﻭ ﻟﻜﻥ ﻟﻥ ﺘﻌﻴﺩ ﺒﻴﺎﻨﺎﺕ‬ ‫* ‪ : TOO_MANY_ROWS‬ﻭﻫﻰ ﻋﻜﺱ ﺍﻟﻌﺒﺎﺭﺓ ﺍﻟﺴﺎﺒﻘﺔ ﺤﻴﺙ ﺘﺴﺘﻌﻤل ﻋﻨﺩﻤﺎ ﺘﻜﻭﻥ ﻋﺩﺩ ﺍﻟﻘﻴﻡ ﺍﻟﻤﺴﺘﺭﺠﻌﺔ‬ ‫ﻤﻥ ﺍﻷﻤﺭ ‪ SELECT‬ﻜﺒﻴﺭ ﺒﺤﻴﺙ ﻻ ﻴﺼﻠﺢ ﻭﻀﻌﻪ ﻓﻲ ﻤﺘﻐﻴﺭ ﻭﺍﺤﺩ‬ ‫* ‪ : INVALID_CURSOR‬ﻭ ﺘﻨﺘﺞ ﻋﻨﺩﻤﺎ ﻴﺘﻡ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﻤﺘﻐﻴﺭ ﻋﻠﻰ ﺍﻨﻪ ‪ CURSOR‬ﻭ ﻟﻜﻨﻪ ﻟﻴﺱ‬ ‫ﻜﺫﻟﻙ‬ ‫* ‪ : ZERO_DIVIDE‬ﻭ ﻴﻌﻨﻰ ﺤﺩﻭﺙ ﻋﻤﻠﻴﻪ ﻗﺴﻤﻪ ﻋﻠﻰ ﺃل ‪ZERO‬‬ ‫* ‪ : DUP_VAL_ON_INDEX‬ﻤﻌﻨﺎﻫﺎ ﻤﺤﺎﻭﻟﻪ ﺍﻻﻀﺎﻓﻪ ﻓﻲ ﺠﺩﻭل ﻤﻊ ﻤﺤﺎﻭﻟﻪ ﺘﻜﺭﺍﺭ ﺍﻟﻘﻴﻤﺔ ﻓﻲ ﺍﻟﺤﻘل‬ ‫‪. PRIMARY KEY‬‬

‫‪- ٥٢ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺍﻟﺩﻭﺍل ﺍﻟﺘﻲ ﺘﺘﻌﺎﻤل ﻤﻊ ﺍﻷﺨﻁﺎﺀ‬ ‫ﻴﻭﺠﺩ ﻓﻲ ﺍﻻﻭﺭﺍﻜل ﺒﻌﺽ ﺍﻟﺩﻭﺍل ﺍﻟﺘﻲ ﺘﺘﻌﺎﻤل ﻤﻊ ﺍﻷﺨﻁﺎﺀ ﻤﻨﻬﺎ‬ ‫ﺍﻟﺩﺍﻟﺔ ‪ SQLCODE‬ﻭ ﺘﻌﻴﺩ ﺭﻗﻡ ﻴﻌﺒﺭ ﻋﻥ ﺭﻗﻡ ﺍﻟﺨﻁﺎﺀ ﺍﻟﻨﺎﺘﺞ‬ ‫ﻭ ﺍﻟﺩﺍﻟﺔ ‪ SQLERRM‬ﺘﻌﻴﺩ ﺍﻟﺭﺴﺎﻟﺔ ﺍﻟﻤﺤﻔﻭﻅﺔ ﻟﻬﺫﺍ ﺍﻟﺨﻁﺎﺀ‬

‫ﻤﺜﺎل ﻻﺴﺘﻌﻤﺎل ﻫﺫﻩ ﺍﻟﺩﻭﺍل ﻭ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ‪:‬‬

‫‪- ٥٣ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫‪ -‬ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻷﺨﻁﺎﺀ ﺍﻟﻤﻌﺭﻓﺔ ﻤﻥ ﺍﻟﻤﺒﺭﻤﺞ ‪USER DEFINED ERRORS‬‬‫ﺍﻷﺨﻁﺎﺀ ﺍﻟﻤﻌﺭﻓﺔ ﻤﻥ ﻗﺒل ﺍﻟﻤﺒﺭﻤﺞ ‪ USER DEFINED ERRORS‬ﻫﻲ ﺃﺨﻁﺎﺀ ﻻ ﻴﻌﺭﻓﻬﺎ ﺍل ‪ORACLE‬‬ ‫ﻭ ﺭﺒﻤﺎ ﻻ ﺘﻜﻭﻥ ﺃﺨﻁﺎﺀ ﻤﺒﺎﺸﺭﺓ ﻭ ﻟﻜﻨﻬﺎ ﻤﻥ ﻭﺠﻬﺔ ﻤﻨﻁﻕ ﺍﻟﺒﺭﻨﺎﻤﺞ ﺃﺨﻁﺎﺀ ﻓﻤﺜﻼ ﻋﻨﺩﻤﺎ ﺘﺯﻴﺩ ﻨﺴﺒﺔ ﻨﺠﺎﺡ ﺍﻟﻁﻼﺏ‬ ‫ﻋﻥ ‪ %١٠٠‬ﻴﻌﺘﺒﺭ ﺍﻟﺒﺭﻨﺎﻤﺞ ﺫﻟﻙ ﺨﻁﺎﺀ ﻓﻲ ﺤﻴﻥ ﻻ ﻴﻌﺭﻑ ﺍﻻﻭﺭﻜل ﺫﻟﻙ ﻭ ﺒﺎﻟﺘﺎﻟﻲ ﻴﻘﻭﻡ ﺍﻟﻤﺒﺭﻤﺞ ﺒﺘﻌﺭﻴﻑ ﻤﻌﻨﻰ‬ ‫ﻭ ﺤﺎﻟﻪ ﺤﺩﻭﺙ ﻫﺫﺍ ﺍﻟﺨﻁﺎﺀ ﻭ ﻜﻴﻔﻴﻪ ﺍﻟﺘﻌﺎﻤل ﻤﻌﻪ‬ ‫ﻭ ﻴﺄﺨﺫ ﺫﻟﻙ ﺍﻟﺘﺭﻜﻴﺏ ﺍﻟﺘﺎﻟﻲ ‪:‬‬

‫ﻭ ﺍﻟﻤﺜﺎل ﺍﻟﺘﺎﻟﻲ ﻴﻭﻀﺢ ﻜﻴﻔﻴﻪ ﺘﻌﺭﻴﻑ ﺨﻁﺄ ‪ EXCEPTION‬ﻤﻥ ﻗﺒل ﺍﻟﻤﺒﺭﻤﺞ ﺜﻡ ﺍﻟﺘﻌﺎﻤل ﻤﻌﻪ ﻓﻲ ﻗﺴﻡ ﺃل‬ ‫‪EXCEPTION‬‬

‫ﻭ ﻤﺜﺎل ﺃﺨﺭ ﻨﻭﻀﺢ ﻓﻴﻪ ﻜﻴﻔﻴﻪ ﺘﻌﺭﻴﻑ ﺨﻁﺎﺀ ﻤﻥ ﻗﺒل ﺍﻟﻤﺴﺘﺨﺩﻡ ﻤﻥ ﺍﻟﻨﻭﻉ ‪ USER DEFINED ERROR‬ﻭ‬ ‫ﻜﻴﻔﻴﻪ ﺍﻟﺘﻌﺎﻤل ﻤﻌﻪ‬

‫‪- ٥٤ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺍﺴﺘﻌﻤﺎل ‪OTHERS‬‬ ‫ﺘﺴﺘﻌﻤل ﺍﻟﺠﻤﻠﺔ ‪ WHEN OTHERS‬ﻓﻲ ﻗﺴﻡ ﺍﻷﺨﻁﺎﺀ ‪ EXCEPTION‬ﻟﻠﺘﻌﺎﻤل ﻤﻊ ﺍﻷﺨﻁﺎﺀ ﺍﻟﺘﻲ ﻴﺘﻡ‬ ‫ﺍﻟﺘﻌﺎﻤل ﻤﻌﻬﺎ ﺒﺎﺴﺘﻌﻤﺎل ﺠﻤل ‪ WHEN‬ﻭ ﻜﺄﻨﻬﺎ ﺘﻘﻭل ‪ WHEN OTHERES‬ﺍﻯ ﻋﻨﺩ ﺤﺩﻭﺙ ﺃﺨﻁﺎﺀ ﺃﺨﺭﻯ‬ ‫ﻨﻔﺫ ﻤﺎ ﻴﻠﻲ ﻭ ﻴﻭﻀﺢ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺍﺴﺘﻌﻤﺎل ‪WHEN OTHERS‬‬

‫‪- ٥٥ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫إﻋﺪاد اﻟﺪوال و اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ‪: Building Procedure & Function‬‬ ‫و ﻓﻲ ھﺬه اﻟﻔﻘﺮة ﺳﻮف ﻧﺘﻨﺎول إﻋﺪاد اﻟﺪوال و اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ‪Building Procedure & function‬‬ ‫و ذﻟﻚ ﻣﻦ ﺧﻼل ‪:‬‬ ‫‬‫‬‫‬‫‪-‬‬

‫اﻟﺼﻼﺣﯿﺎت اﻟﻼزﻣﺔ ﻟﺒﺮاﻣﺞ أل ‪Pl/sql‬‬ ‫إﻧﺸﺎء أل ‪procedure‬‬ ‫إرﺳﺎل ﻣﻌﺎﻣﻼت ﻟﻠﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ‪parameter passing‬‬ ‫إﻧﺸﺎء اﻟﺪوال ‪Function‬‬

‫‪Permission and Pl/sql‬‬

‫‪ -١‬اﻟﺼﻼﺣﯿﺎت اﻟﻼزﻣﺔ ﻟﻺﻧﺸﺎء ﺑﺮاﻣﺞ ‪Permission‬‬ ‫ﻟﻜﻲ ﺗﺘﻤﻜﻦ ﻣﻦ ﻛﺘﺎﺑﮫ دوال أو اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻓﻲ اﻻوراﻛﻞ ﻻﺑﺪ ﻣﻦ أن ﯾﻤﻨﺤﮫ ﻣﺪﯾﺮ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ‪DBA‬‬ ‫آو ﻣﻦ ﻟﮫ ﺣﻖ ﻓﻲ ذﻟﻚ اﻟﺼﻼﺣﯿﺔ إﻧﺸﺎء دوال ﻓﺮﻋﯿﮫ و ﯾﺘﻢ ذﻟﻚ ﻛﻤﺎ ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ‬

‫و ﺑﮭﺬا ﺗﻢ إﻧﺸﺎء اﻟﺼﻼﺣﯿﺎت اﻟﻼزﻣﺔ ﻹﻧﺸﺎء ﺑﺮاﻣﺞ أل ‪pl/sql‬‬ ‫‪ n‬إﻧﺸﺎء ‪Procedure‬‬ ‫ﺑﻌﺪ ﻣﻨﺢ ﺻﻼﺣﯿﺔ إﻧﺸﺎء أل ‪ procedure‬ﯾﺘﻢ اﺳﺘﻌﻤﺎل اﻷﻣﺮ ‪ Create Procedure‬ﻻ ﻧﺸﺎء اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ‬ ‫و اﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﻸﻣﺮ ھﻲ‬ ‫‪CREATE [OR REPLACE ] PROCEDURE procedure_name‬‬ ‫])‪[(parameter1[mode1] datatype1,parameter2[mode2] datatype2,……….‬‬ ‫‪IS | AS‬‬ ‫;‪PL/SQL BLOCK‬‬ ‫‪ CREATE OR REPLACE PROCEDURE‬أﻣﺮ إﻧﺸﺎء أو ﺗﻌﺪﯾﻞ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬ ‫‪ Procedure_name‬اﺳﻢ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ اﻟﻤﺮاد اﻧﺸﺎﺋﺔ‬ ‫‪- ٥٦ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫‪ Parameter‬أﺳﻤﺎء اﻟﻤﺘﻐﯿﺮات اﻟﺘﻲ ﺗﻤﺮر ﻗﯿﻤﮭﺎ‬

‫‪ Mode‬ﻧﻮع أل ‪ parameter‬و ﯾﻮﺟﺪ ﺛﻼث ﺣﺎﻻت ل أل ‪parameter‬‬ ‫و ھﻢ ) ‪(IN , OUT ,IN OUT‬‬ ‫‪ datatype‬ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﺄﺧﺬھﺎ أل ‪parameter‬‬ ‫‪ Pl/sql block‬و ھﻮ ﺟﺴﻢ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ اﻟﺬي ﯾﻘﻮم ﺑﺄﺣﺪاث اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬ ‫و ھﺬا اﻟﻤﺜﺎل ﯾﻘﻮم ﺑﺈﻧﺸﺎء ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻰ ﻟﻠﻤﻮﻇﻔﯿﻦ و ﯾﻘﻮم اﻟﺒﺮﻧﺎﻣﺞ ﺑﻌﻤﻞ ﺗﻌﺪﯾﻞ ﻋﻠﻰ ﺟﺪول اﻟﻤﻮﻇﻔﯿﻦ ﺑﺘﻌﺪﯾﻞ‬ ‫ﻣﺮﺗﺐ ﻣﻮﻇﻒ اﻟﺬي ﺗﺮﯾﺪ زﯾﺎدة ﻣﺮﺗﺒﮫ‬

‫ﻓﻔﻰ اﻟﺴﻄﺮ اﻻول ﺗﻢ اﺳﺘﻌﻤﺎل اﻻﻣﺮ ‪ create procedure‬ﻻﻧﺸﺎء ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻰ ﺑﺎﻻﺳﻢ ‪raise_salary‬‬

‫و ﻓﻰ اﻟﺴﻄﺮ اﻟﺜﺎﻧﻰ ﻧﺤﺪد ﻣﺘﻐﯿﺮ واﺣﺪ ﻓﻘﻂ ﻟﻠﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻰ ‪ raise_salary‬و ھﻮ ‪ v_id‬وﻛﺬﻟﻚ ﺗﺤﯿﺪ ﻃﺒﯿﻌﺘﮫ اذا‬ ‫ﻛﺎن ‪ in‬او ‪ out‬اى ﯾﺼﻠﺢ ﻻﺳﺘﻘﺒﺎل اﻟﻘﯿﻢ ﻋﻨﺪ اﺳﺘﺪﻋﺎء اﻟﺪاﻟﮫ او اﺧﺮاج اﻟﻘﯿﻢ ﻓﯿﮫ‬ ‫اﻣﺎ ﻓﻰ اﻟﺴﻄﺮ اﻟﺜﺎﻟﺚ ﯾﺒﺪا اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻰ و ﯾﺒﺪا ﺑﻼﻋﻼن ﻋﻦ ﻋﻦ اﻟﻤﺘﻐﯿﺮات‬ ‫اﻣﺎ ﻓﻰ اﻟﺴﻄﺮ رﻗﻢ ‪ ٤‬اﻟﻜﻠﻤﮫ ‪ begin‬و ھﻰ ﺑﺪاﯾﮫ اﻻواﻣﺮ اﻟﺘﻰ ﺗﻨﻔﺬ‬ ‫اﻣﺎ ﻓﻰ اﻟﺴﻄﻮر ‪ ٦٫٧٫٨‬ﺟﻤﻠﮫ ‪ sql‬وھﻰ ﻻﻣﺮ ﺗﻌﺪﯾﻞ ‪ update‬اﻟﺬى ﯾﻘﻮم ﺑﺘﻌﺪﯾﻞ ﻣﺮﺗﺐ اﻟﻤﻮﻇﻒ او اﻟﺬى اﺳﺘﺪﻋﺎءاة‬ ‫و ﻓﻰ اﻟﺴﻄﺮ رﻗﻢ ‪ ٨‬ﺗﻢ اﻧﮭﺎء اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻰ و ﻛﺘﺎﺑﮫ اﺳﻢ اﻟﺒﺮﻧﺎﻣﺞ‬

‫ﺗﻌﺪﯾﻞ ال‬

‫‪procedure‬‬

‫و ﯾﺘﻢ ﺗﻌﺪﯾﻞ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻰ ﺑﺈﺳﺘﻌﻤﺎل اﻻﻣﺮ ‪ create or replace procedure‬ﺣﯿﺚ ﯾﻘﻮم اﻻﻣﺮ ﺑﻌﻤﻞ ﺗﻌﺪﯾﻞ اذا‬ ‫ﻛﺎن اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻰ ﻣﻮﺟﻮد او ﯾﻨﺸﻰء ﺑﺮﻧﺎﻣﺞ ﺟﺪﯾﺪ و ﺑﺎﻟﺘﺎﻟﻰ ﻓﻰ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ‬

‫‪- ٥٧ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫ﯾﺘﻢ اﺳﺘﺒﺪال اﻟﺴﻄﺮ رﻗﻢ ‪ ١‬ﺑﮭﺬا اﻟﺴﻄﺮ‬

‫‪ create or replace procedure raise_salary‬ﻟﻠﻘﯿﺎم ﺑﺘﻌﺪﯾﻞ اى ﻛﻮد ﺑﺪاﺧﻞ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻰ‬

‫و اﻵن ﻧﺮى اﻟﻨﺘﯿﺠﺔ اﻟﺘﻲ ﺳﯿﻘﺪﻣﮭﺎ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬

‫إﻧﺸﺎء أل ‪ PROCEDURE‬ﺑﺎﺳﺘﻌﻤﺎل ‪PARAMETERS‬‬

‫‪- ٥٨ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻣﻦ اﻟﻀﺮوري ﺟﺪا اﻹﻋﻼن ﻋﻦ اﻟﻤﺘﻐﯿﺮات ﻛﻤﻌﺎﻣﻼت داﺧﻞ أﻗﻮاس اﻟﺪاﻟﺔ ‪ function‬أو اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬ ‫‪ procedure‬و ذﻟﻚ ﻻن اﻟﻤﻌﺎﻣﻼت ﺗﻮﺳﻊ اﺳﺘﻌﻤﺎﻟﮭﺎ و اﻟﻤﻌﺎﻣﻼت ﺗﺄﺧﺬ ﺛﻼﺛﺔ أﻧﻮاع ‪:‬‬ ‫‬‫‬‫‪-‬‬

‫اﻟﻨﻮع ‪ : IN‬و ھﻮ اﻟﺬي ﯾﺴﺘﻘﺒﻞ ﻗﯿﻤﺔ ﻋﻨﺪ اﺳﺘﺪﻋﺎء اﻟﺪاﻟﺔ و ﻻ ﯾﻤﻜﻦ إﻋﺎدة ﻗﯿﻤﺔ ﻓﯿﮫ ﻟﻤﻜﺎن اﻻﺳﺘﺪﻋﺎء‬ ‫اﻟﻨﻮع ‪ : OUT‬و ھﻮ اﻟﺬي ﯾﺄﺧﺬ ﻗﯿﻤﺔ ﺗﻌﻮد ﻟﻤﺴﺘﺪﻋﻰ اﻟﺪاﻟﺔ ﻓﻘﻂ و ﻻ ﯾﺴﺘﻌﻤﻞ ﻻﺳﺘﻘﺒﺎل ﻗﯿﻢ ﻋﻨﺪ‬ ‫اﻻﺳﺘﺪﻋﺎء ‪.‬‬ ‫اﻟﻨﻮع ‪ : IN OUT‬و ھﻮ اﻟﻨﻮع اﻟﺬي ﯾﺴﻤﺢ ﺑﺎﺳﺘﻘﺒﺎل اﻟﻘﯿﻢ ﻋﻨﺪ اﻻﺳﺘﺪﻋﺎء ﻓﯿﮫ و ﻛﺬﻟﻚ إﻋﺎدة ﻗﯿﻢ ﻟﻠﺨﺮوج‬ ‫ﻓﯿﮫ‬

‫و ﯾﻼﺣﻆ ﻋﻨﺪ اﺳﺘﺪﻋﺎء اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ‪ rasie_salary‬اﻟﺬي ﺗﻢ إﻧﺸﺎءه ﻛﻤﺎ ﯾﻠﻲ‬ ‫; )‪Execute raise_salary (7788‬‬ ‫ﻓﻲ ھﺬا اﻟﺴﻄﺮ ﺗﻢ اﺳﺘﺪﻋﺎء اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ‪ raise_salary‬ﻣﻊ إرﺳﺎل اﻟﻘﯿﻤﺔ ‪ ٧٧٨٨‬ﻛﻤﻌﺎﻣﻞ ﻟﮫ ﺑﺎﻟﺘﺎﻟﻲ ﯾﺘﻢ‬ ‫اﺳﺘﻘﺒﺎل اﻟﻘﯿﻤﺔ ﻓﻲ اﻟﻤﺘﻐﯿﺮ ‪ v_id‬اﻟﻤﻌﺮف ﻛﻤﻌﺎﻣﻞ ﻣﻦ اﻟﻨﻮع ‪ in‬ﺛﻢ اﺳﺘﻌﻤﺎﻟﮫ داﺧﻞ اﻟﺴﻄﻮر ﻟﺘﻌﺪﯾﻞ ﻣﺮﺗﺐ‬ ‫اﻟﻤﻮﻇﻒ اﻟﺬي ﻛﻮده ‪ ٧٧٨٨‬و ﺑﺎﻟﺘﺎﻟﻲ ﯾﻤﻜﻦ اﺳﺘﺪﻋﺎء اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ أﻛﺜﺮ ﻣﻦ ﻣﺮة ﻣﻊ ﺗﻐﯿﯿﺮ ﻛﻮد اﻟﻤﻮﻇﻒ‬ ‫اﻟﻤﻄﻠﻮب ﺣﺬﻓﮫ‬

‫ﻛﯿﻔﯿﮫ اﺳﺘﻌﻤﺎل اﻟﻤﻌﺎﻣﻞ ﻣﻦ اﻟﻨﻮع ‪IN‬‬ ‫و اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﯾﻮﺿﺢ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻌﺎﻣﻞ ‪IN‬‬

‫‪- ٥٩ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻧﻼﺣﻆ ھﺬا اﻟﻤﺜﺎل‪:‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﻇﮭﺮ ھﺬا اﻟﺨﻄﺄ وﻣﻌﻨﺎه اﻧﮫ ﻻﺑﺪ ﻣﻦ اﺳﺘﺨﺪام ﻣﻌﺎﻣﻼت ﻣﻦ اﻟﻨﻮع ‪ Out‬وذﻟﻚ ﻷﻧﮫ ﯾﺘﻢ إرﺟﺎع ﻗﯿﻢ إﻟﻰ‬ ‫اﻟﻜﻮد وﻟﻜﻦ ﻓﻲ ﺣﺎﻟﮫ اﺳﺘﺨﺪام ﻣﻌﺎﻣﻼت ﻣﻦ اﻟﻨﻮع ‪ In‬ﻓﺎﻧﮫ ﯾﻈﮭﺮ ھﺬا اﻟﺨﻄﺄ وذﻟﻚ ﻷﻧﮫ اﻟﻤﻌﺎﻣﻼت اﻟﺘﻲ ﻣﻦ اﻟﻨﻮع‬ ‫‪ IN‬ﺗﺴﺘﻘﺒﻞ ﻗﯿﻢ ﻓﻘﻂ وﻻ ﺗﺮﺟﻊ ﻗﯿﻢ‬ ‫ﻟﺬﻟﻚ ﺳﻨﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﻤﻌﺎﻣﻼت ﻣﻦ اﻟﻨﻮع ‪Out‬‬ ‫اﺳﺘﺨﺪام اﻟﻤﻌﺎﻣﻞ ﻣﻦ اﻟﻨﻮع ‪OUT‬‬ ‫و ھﺬا اﻟﻨﻮع ﯾﺄﺧﺬ ﻗﯿﻤﮫ ﺗﻌﻮد ﻟﻤﺴﺘﺪﻋﻰ اﻟﺪاﻟﺔ ﻓﻘﻂ ﻻ ﯾﻤﻜﻦ أن ﯾﺴﺘﺨﺪم ﻻﺳﺘﻘﺒﺎل ﻗﯿﻢ ﻋﻨﺪ اﻻﺳﺘﺪﻋﺎء‬ ‫و ھﺬا اﻟﻤﺜﺎل ﯾﻮﺿﺢ ذﻟﻚ‬

‫‪- ٦٠ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫و ﻟﻜﻰ ﻧﺸﺎھﺪ ﻗﯿﻢ اﻟﻤﻌﺎﻣﻞ ﻣﻦ ﻧﻮع ‪ OUT‬ﻧﻘﻮم ﺑﻌﻤﻞ اﻟﺘﺎﻟﻰ‬ ‫‪ - ١‬ﻧﻘﻮم ﺑﺈﻧﺸﺎء ‪ HOST VARIBALES‬و ذﻟﻚ ﺑﺈﺳﺘﺨﺪام اﻻﻣﺮ ‪VARIABLE‬‬

‫‪ -٢‬ﻧﻘﻮم ﺑﺈﺣﻀﺎر أل ‪ query_emp procedure‬ﺑﺈﻋﻄﺎﺋﮫ اﻟﻤﺘﻐﯿﺮات اﻟﺘﻲ ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮭﺎ ‪hostvariable‬‬ ‫ﻛﺎ ﻣﻌﺎﻣﻼت ﻣﻦ اﻟﻨﻮع ‪OUT‬‬ ‫‪ -٣‬ﻟﻜﻲ ﻧﻘﻮم ﺑﻤﺸﺎھﺪة اﻟﻨﺘﯿﺠﺔ ﻧﺴﺘﺨﺪم آﻣﺮ ‪PRINT‬‬ ‫و ﻛﻤﺎ ﺳﻨﺮى اﻵن ﻣﻦ ﺧﻼل اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ اﻟﺬي ﻗﻤﻨﺎ ﺑﻌﻤﻞ‬

‫ﻣﺜﺎل اﺧﺮ ﻋﻠﻰ اﺳﺘﺨﺪام ‪: Out parameter‬‬

‫‪- ٦١ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﺗﻜﻮﯾﻦ ‪ Procedure‬ﯾﺴﻤﻰ ‪ agc12‬وﺗﻢ إﻋﻄﺎءه ﻣﻌﺎﻣﻼت وھﻲ ‪ ID‬ﻣﻦ اﻟﻨﻮع ‪ Out‬أي ﯾﺮﺟﻊ‬ ‫ﻗﯿﻢ إﻟﻰ اﻟﻜﻮد واﻟﻤﻌﺎﻣﻞ اﻵﺧﺮ ھﻮ اﻻﺳﻢ ‪ Name‬وھﻮ ﻣﻦ اﻟﻨﻮع ‪ Out‬أي ﯾﺮﺟﻊ ﻗﯿﻤﮫ ﻓﻲ اﻟﻜﻮد‬ ‫ﺛﻢ ﺗﻢ وﺿﻊ اﻟﻘﯿﻢ اﻟﻤﻮﺟﻮدة داﺧﻞ اﻻﻋﻤﺪه رﻗﻢ اﻟﻄﺎﻟﺐ واﺳﻢ اﻟﻄﺎﻟﺐ داﺧﻞ اﻟﻤﻌﺎﻣﻼن ‪ID‬و‪ Name‬ﺛﻢ ﻧﮭﺎﯾﮫ ال‬ ‫‪Procedure‬‬ ‫وﻟﻨﺮى اﻟﻨﺎﺗﺞ ﻣﻦ ھﺬا اﻻﺟﺮاء ﻛﻤﺎ ﻓﻲ اﻟﻤﺜﺎل اﻻﺗﻲ‪:‬‬

‫ﻟﻄﺒﺎﻋﮫ اﻟﻤﻌﺎﻣﻼت اﻟﻤﻮﺟﻮدة داﺧﻞ أل ‪ Procedure‬وھﻲ ‪ID‬واﻟﻤﻌﺎ ﻣﻞ ‪ Name‬ﻧﻌﺮف أوﻻ اﻟﻤﻌﺎﻣﻞ ‪ ID‬وھﻮ‬ ‫ﻣﻦ اﻟﻨﻮع اﻟﺮﻗﻤﻲ واﻟﻤﻌﺎﻣﻞ ‪ Name‬ﻣﻦ اﻟﻨﻮع اﻟﺤﺮﻓﻲ ﺛﻢ ﻧﻘﻮم ﺑﺎﺳﺘﺪﻋﺎء أل ‪ Procedure‬ﺑﺎﺳﺘﺨﺪام ‪ Execute‬ﺛﻢ‬ ‫اﺳﻢ أل ‪ Procedure‬وﻧﻀﯿﻒ إﻟﯿﮫ اﻟﻤﻌﺎﻣﻼت ﺛﻢ ﻧﻘﻮم ﺑﻌﻤﻞ ﻃﺒﺎﻋﮫ ﻟﻠﻤﻌﺎﻣﻼت ﻛﻤﺎ ﻣﻮﺿﺢ ﻓﻲ اﻟﺸﻜﻞ اﻟﺴﺎﺑﻖ‬ ‫وﺑﮭﺬا ﻧﻜﻮن ﻗﺪ ﺗﻌﺮﻓﻨﺎ ﻋﻠﻰ اﻟﻤﻌﺎﻣﻼت اﻟﺘﻲ ﻣﻦ اﻟﻨﻮع ‪Out‬‬

‫ﻛﯿﻔﯿﮫ اﺳﺘﺨﺪام اﻟﻤﻌﺎﻣﻞ ﻣﻦ اﻟﻨﻮع ‪IN OUT‬‬ ‫و ﺳﻮف ﻧﺮى اﻵن ﻣﺜﺎل ﻋﻦ ﻛﯿﻔﯿﮫ ﻋﻤﻞ ﻣﻌﺎﻣﻞ ﻣﻦ اﻟﻨﻮع ‪IN OUT‬‬

‫‪- ٦٢ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫و ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﻋﻤﻞ ﻣﻌﺎﻣﻞ ﻣﻦ اﻟﻨﻮع ‪ IN OUT‬ﺣﯿﺚ ﯾﻘﻢ ﺑﺎﺳﺘﻘﺒﺎل ﻗﯿﻢ و إرﺟﺎﻋﮭﺎ ﻣﺮة أﺧﺮى ﺑﺸﻜﻞ ﺑﮭﺬا‬ ‫اﻟﺸﻜﻞ ﻛﻤﺎ ھﻮ ﻣﻮﺿﺢ ﻓﻲ اﻟﻤﺜﺎل ‪(800)633-0575‬‬ ‫و اﻵن ﺳﻮف ﻧﺮى ﻛﯿﻔﯿﮫ ﻣﺸﺎھﺪة ھﺬا اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬ ‫و ذﻟﻚ ﺑﻌﻤﻞ ‪:‬‬ ‫ إﻧﺸﺎء ‪ HOST VARIBALE‬و ذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ ‪VARIABLE‬‬‫‬‫‬‫‪-‬‬

‫ﻧﻘﻮم ﺑﺘﺰوﯾﺪ أل ‪ HOST VARIABLE‬ﺑﺎﻟﻘﯿﻢ‬ ‫إﺣﻀﺎر اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ و ھﻮ ‪ FORMAT PHONE‬و ﺑﺈﺿﺎﻓﺔ إﻟﯿﮫ أل ‪HOST‬‬ ‫‪ VARIABLE‬ﻛﺄﻧﮭﺎ ‪IN OUT PARAMETER‬‬ ‫ﻟﻠﻤﺸﺎھﺪة ﻧﺴﺘﺨﺪم أﻣﺮ ‪PRINT‬‬ ‫و ﻛﻤﺎ ﺳﻨﺮى اﻵن ﻓﻲ ھﺬا اﻟﺸﻜﻞ‬

‫ﻣﺜﺎل آﺧﺮ ﻻﺳﺘﻌﻤﺎل ‪: IN OUT Paramter‬‬

‫‪- ٦٣ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﺗﻜﻮﯾﻦ ‪ Procedure‬ﯾﺴﻤﻰ ‪ Agc13‬وﯾﺄﺧﺬ ﻣﻌﺎﻣﻞ واﺣﺪ وھﻮ ‪ ID‬ھﺬا اﻟﻤﻌﺎﻣﻞ ﻧﻮﻋﮫ‪IN OUT‬‬ ‫أي ﯾﻘﻮم ﺑﺎﺳﺘﻘﺒﺎل ﻗﯿﻢ وإرﺳﺎل ﻗﯿﻢ إﻟﻰ اﻟﻜﻮد ﻋﻨﺪ اﺳﺘﺪﻋﺎءه‬ ‫وﻟﻤﺸﺎھﺪه اﻟﻨﺘﺎﺋﺞ ﻧﺘﺒﻊ اﻵﺗﻲ‪:‬‬

‫‪- ٦٤ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻧﻼﺣﻆ ﻓﻲ ھﺬا اﻟﻤﺜﺎل أﻧﻨﺎ ﻧﺮﯾﺪ أن ﻧﻄﺒﻊ اﻟﻤﻌﺎﻣﻞ اﻟﺬي ﻣﻦ اﻟﻨﻮع ‪ In out‬أي اﻧﮫ ﯾﺴﺘﻘﺒﻞ ﻗﯿﻢ وﯾﺨﺮج ﻗﯿﻢ إﻟﻰ اﻟﻜﻮد‬ ‫ﻓﻲ أول ﺟﺰء ﺗﻢ ﺗﻌﺮﯾﻒ اﻟﻤﻌﺎﻣﻞ ﻣﻦ اﻟﻨﻮع اﻟﺮﻗﻤﻲ ﺛﻢ ﺗﻢ إﻋﻄﺎء اﻟﻤﻌﺎﻣﻞ اﻟﻘﯿﻤﺔ رﻗﻢ ‪ ٥‬وذﻟﻚ ﻻن اﻟﻤﻌﺎﻣﻞ ‪IN‬‬ ‫‪ Paramter‬وﺑﺎﻟﺘﺎﻟﻲ ﯾﺴﺘﻘﺒﻞ اﻟﻘﯿﻢ اﻟﺘﻲ ﺗﻌﻄﻰ ﻟﮫ ﻓﻘﻂ وﻓﻲ اﻟﻤﺮة اﻟﺜﺎﻧﯿﺔ ﺗﻢ ﻋﻤﻞ ‪ Execute‬ﺛﻢ اﺳﻢ أل ‪Procedure‬‬ ‫ﺛﻢ ﻧﻜﺘﺐ اﺳﻢ اﻟﻤﻌﺎﻣﻞ وذﻟﻚ ﻷﻧﮫ ﯾﻌﺘﺒﺮ ﻣﻌﺎﻣﻞ ﻣﻦ اﻟﻨﻮع ‪ Out‬أي اﻧﮫ ﯾﺨﺮج ﻗﯿﻢ ﻟﻠﻜﻮد وﻧﻼﺣﻆ اﺧﺘﻼف اﻟﻨﺎﺗﺞ ﻓﻲ‬ ‫ﻛﻠﺘﺎ اﻟﺤﺎﻟﺘﯿﻦ ﻓﻔﻲ اﻟﺤﺎﻟﺔ اﻷوﻟﻰ ﯾﻜﻮن اﻟﻨﺎﺗﺞ ﻣﺴﺎو ﻟﻠﻘﯿﻤﺔ اﻟﺘﻲ ﻧﻌﻄﯿﮭﺎ ﻟﻠﻤﻌﺎﻣﻞ وﻓﻲ اﻟﺤﺎﻟﺔ اﻟﺜﺎﻧﯿﺔ ﻧﻼﺣﻆ اﻟﻨﺎﺗﺞ‬ ‫ﺣﺴﺐ رﻗﻢ اﻟﻄﺎﻟﺐ اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﺠﺪول‬

‫إﻋﻄﺎء أل ‪ PARAMETER‬ﻗﯿﻢ أﺳﺎﺳﮫ ‪ DEFULTE OPTION FOR PARAMETER‬داﺧﻞ‬ ‫اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ اى ﻋﻨﺪ ﻋﺪم إﻋﻄﺎء اﻟﻤﻌﺎﻣﻞ ﻗﯿﻢ ﺗﻜﻮن ھﻲ اﻟﻘﯿﻢ اﻻﺳﺎﺳﯿﮫ ﻟﮫ‬ ‫و‬ ‫ﻧﺮى ذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ‪:‬‬

‫‪- ٦٥ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫و اﻵن ﻧﺮﯾﺪ أن ﻧﺠﺮب اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ اﻟﺬي ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ ﻓﻨﻘﻮﻛﻢ ﺑﺘﺸﻐﯿﻠﮫ و إﺿﺎﻓﺔ ﺑﯿﺎﻧﺎت إﻟﻰ ﺟﺪول اﻷﻗﺴﺎم ﻛﻤﺎ‬ ‫ﺳﻨﺮى ﻓﻲ اﻟﻤﺜﺎل اﻻﺗﻰ‬

‫‪- ٦٦ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﯾﻤﻜﻨﻨﺎ إﺣﻀﺎر اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻣﻦ اى أداة أو اى ﻟﻐﺔ ﺗﺪﻋﻢ أل ‪pl/sql‬‬ ‫إﺣﻀﺎر اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻣﻦ ﺧﻼل اﻟﺒﻮﻛﺎت اﻟﻐﯿﺮ ﻣﺴﻤﺎه‬ ‫و ﺳﻮف ﻧﻘﻮم ﺑﺈﺣﻀﺎر ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻰ ﺑﺎﺳﻢ ‪raise_cost‬‬ ‫ﺣﯿﺚ ﯾﺄﺧﺬ ﻣﻌﺎﻣﻞ ‪v_id‬‬ ‫و ﻛﻤﺎ ﺳﻨﺮى اﻵن ﻓﻲ ھﺬا اﻟﻤﺜﺎل‬

‫اﻷﺧﻄﺎء اﻟﺘﻲ ﺗﺆﺛﺮ ﻋﻠﻰ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ‬ ‫ﻋﻨﺪﻣﺎ ﺗﻘﻮم ﺑﺘﻄﻮﯾﺮ اى ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻰ و ﯾﻜﻮن ﺑﺪاﺧﻠﮫ ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ أﺧﺮى ﻣﻨﺎدى ﻋﻠﯿﮫ ﺑﻮاﺳﻄﺔ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬ ‫اﻟﻤﺘﻄﻮر ﻓﻌﻠﯿﻚ أن ﺗﻜﻮن ﻣﺪرك ﺑﺎﻟﺘﺄﺛﯿﺮات اﻟﺘﻲ ﺗﺼﺤﺢ أو ﻻ ﺗﺼﺤﺢ‬ ‫و ﻋﻨﺪﻣﺎ ﺗﻜﻮن ﯾﻈﮭﺮ اﻟﺨﻄﺎء ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ﺗﻘﻮم وﺣﺪة اﻟﺘﺤﻜﻢ ﻓﻲ اﻟﺒﺮﻧﺎﻣﺞ ﺑﺎﻟﺬھﺎب إﻟﻰ ﺟﺰء اﻻﺳﺘﺜﻨﺎءات‬ ‫اﻟﺬي ﯾﻘﻮم ﺑﺘﺼﺤﯿﺢ اﻟﺨﻄﺎء و إذا ﺗﻢ ﺗﺼﺤﯿﺢ ھﺬا اﻟﺨﻄﺎء اﻟﻤﻮﺟﻮد ﻓﻲ اﻟﺒﻠﻮك ﻓﺘﻘﻮم وﺣﺪة اﻟﺘﺤﻜﻢ ﺑﺎﻟﺬھﺎب إﻟﻰ‬ ‫اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬ ‫و اى ﻋﺒﺎرات ‪ DML‬ﺗﻨﻔﺬ ﺑﻌﺪ أل ‪ EXCEPTION‬ﺗﻜﻮن ﺟﺰء ﻣﻦ اﻟﺤﺪث‬ ‫و إذا ﻟﻢ ﯾﻘﻢ ﺟﺰء اﻻﺳﺘﺜﻨﺎءات ﺑﺘﺼﺤﯿﺢ ھﺬه اﻷﺧﻄﺎء ﻓﯿﻘﻮم اﻟﺨﻄﺎء ﺑﺎﻧﺘﺸﺎر و اﻟﺬھﺎب إﻟﻰ اﻟﺘﻄﺒﯿﻖ اﻟﺬي ﻧﺴﺘﺨﺪم ﻓﯿﮫ‬ ‫ھﺬا اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ‬

‫و اﻵن ﯾﻤﻜﻨﻨﺎ ﺣﺬف اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ﻣﻦ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت‬ ‫و ذﻟﻚ ﺑﺎﺳﺘﺨﺪام أﻣﺮ ‪DROP PROCEDURE‬‬ ‫اﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﻸﻣﺮ ھﻲ ‪:‬‬ ‫; ‪DROP PROCEDURE procedure_name‬‬ ‫ﻣﺜﺎل ‪:‬‬

‫‪- ٦٧ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫** ﺇﻨﺸﺎﺀ ﺩﺍﻟﻪ ‪Creating PL/SQL Function‬‬ ‫ﺍﻟﺩﺍﻟﺔ ‪ : Function‬ﻓﻲ ﺠﻤﻴﻊ ﺍﻟﻠﻐﺎﺕ ﺒﻤﺎ ﻓﻴﻬﺎ ﺃل ‪ PL/SQL‬ﻫﻲ ﺒﺭﻨﺎﻤﺞ ﻓﺭﻋﻰ ﻤﺜل ‪PROCEDURE‬‬ ‫ﺍﻟﻤﻭﺠﻭﺩﺓ ﺒﺎﻟﻠﻐﺔ‬ ‫ﻭ ﻟﻜﻥ ﻴﺨﺘﻠﻑ ﻋﻨﻪ ﻓﻲ ﺃﻥ ﺍﻟﺩﺍﻟﺔ ﻻ ﻴﻤﻜﻥ ﺃﻥ ﺘﻌﻴﺩ ﺃﻜﺜﺭ ﻤﻥ ﻗﻴﻤﻪ ﻓﻤﺜﻼ ﺍﻟﺩﺍﻟﺔ)‪SQRT(X‬‬ ‫ﺩﺍﻟﻪ ﺃﺨﺭﻯ‬ ‫ﺘﻌﻴﺩ ﻗﻴﻤﻪ ﻭﺍﺤﺩﺓ ﻓﻘﻁ ﻭ ﻫﻲ ﺍﻟﺠﺯﺭ ﺍﻟﺘﺭﺒﻴﻌﻰ ﻟﻠﻘﻴﻤﺔ ‪ X‬ﻭ ﻫﻜﺫﺍ ﺍﻯ‬ ‫ﻭ ﻴﺘﻡ ﺇﻨﺸﺎﺀ ﺍﻟﺩﺍﻟﺔ ﺒﺎﺴﺘﻌﻤﺎل ﺍﻷﻤﺭ ‪ CREATE FUNCTION‬ﻓﻲ ﺒﻴﺌﺔ ﺍﻟﺒﺭﻨﺎﻤﺞ ‪PLUS‬‬ ‫ﻫﻭ ﻤﻭﻀﺢ‬

‫‪ SQL‬ﻜﻤﺎ‬

‫ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻟﻸﻤﺭ ﻫﻲ‬ ‫‪CREATE [ OR REPLACE ] FUNCTION function_name‬‬ ‫‪[ (parameter 1 [mode1] datatype1 ,‬‬ ‫‪Parameter 2 [mode2] datatype 2 ,‬‬ ‫] ) ‪…………………..‬‬ ‫‪RETURN datatype‬‬ ‫‪IS | AS‬‬ ‫; ‪PL/SQL Block‬‬ ‫ﺃل ‪ : function_name‬ﺍﺴﻡ ﺍﻟﺩﺍﻟﺔ‬ ‫ﺃل ‪ : parameter‬ﻤﺘﻐﻴﺭ ﻓﻲ ﺃل ‪ PL/SQL‬ﺍﻟﺫﻱ ﻴﻘﻭﻡ ﺒﺘﻤﺭﻴﺭ ﺍﻟﻘﻴﻡ ﺩﺍﺨل ﺍﻟﺩﺍﻟﺔ‬ ‫ﺃل ‪ : mode‬ﻭ ﻫﻭ ﻨﻭﻉ ﺃل ‪parameter‬‬ ‫ﺃل ‪ : datatype‬ﻭ ﻫﻭ ﻨﻭﻉ ﺒﻴﺎﻨﺎﺕ ﺃل ‪parameter‬‬ ‫ﺃل ‪ : return datatype‬ﻨﻭﻉ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﺨﺭﺠﺎﺕ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺃل ‪function‬‬

‫ﻤﺜﺎل‪:‬‬

‫‪- ٦٨ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﺗﻜﻮﯾﻦ داﻟﮫ ﺗﺴﻤﻰ ‪ agc20‬ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ ‪Create‬وﻣﻌﻨﺎھﺎ ﻛﻮن ﺛﻢ ﺗﻢ اﺳﺘﺨﺪام ‪Or replace‬‬ ‫ﻷﻧﮫ ﻣﻦ اﻟﻤﻤﻜﻦ أن ﯾﺤﺪث ﺗﻌﺪﯾﻞ ﻓﻲ اﻟﺪاﻟﺔ ﺛﻢ ﻧﻜﺘﺐ ‪ Function‬ﺛﻢ اﺳﻢ أل ‪ Function‬وھﻲ ‪ agc20‬وﯾﺘﻢ إﻋﻄﺎء‬ ‫ﻣﻌﺎﻣﻼت ﻟﮭﺎ وھﻲ ‪ id‬ﻣﻦ اﻟﻨﻮع اﻟﺮﻗﻤﻲ واﻟﻤﻌﺎﻣﻞ اﻟﺜﺎﻧﻲ وھﻮ اﻻﺳﻢ ‪ name‬وھﻮ ﻣﻦ اﻟﻨﻮع اﻟﺤﺮﻓﻲ‬ ‫وﻧﻼﺣﻆ أن اﻟﻤﻌﺎﻣﻼت ﻣﻦ اﻟﻨﻮع ‪ IN‬أي اﻧﮫ ﯾﺴﺘﻘﺒﻞ ﻗﯿﻢ وﻻ ﯾﺼﺢ داﺧﻞ أل ‪ Function‬أن ﻧﺴﺘﺨﺪم ﻣﻌﺎﻣﻼت ﻣﻦ‬ ‫اﻟﻨﻮع ‪ Out‬وذﻟﻚ ﻻن اﻟﺪاﻟﺔ ﺗﻘﻮم ﺑﺎﺣﺘﺴﺎب ﻗﯿﻢ ﻟﺬﻟﻚ ﻧﺴﺘﺨﺪم ‪ IN‬أي ﯾﺴﺘﻘﺒﻞ اﻟﻘﯿﻤﺔ ﻣﻦ اﻟﺪاﻟﺔ ﺛﻢ ﻧﻜﺘﺐ ‪ IS‬وﺑﻌﺪھﺎ‬ ‫ﻧﻘﻮم ﺑﻜﺘﺎﺑﮫ اﻟﻜﻮد وھﻮ ھﻨﺎ ﻋﺒﺎرة ﻋﻦ ﺟﻤﻠﮫ ‪ Insert‬داﺧﻞ ﺟﺪول اﻟﻄﻼب وﻣﻦ ﺷﺮوط اﻟﺪاﻟﺔ أﻧﮭﺎ ﻻﺑﺪ أن ﺗﺮﺟﻊ‬ ‫ﻗﯿﻤﮫ ھﺬه اﻟﻘﯿﻤﺔ ﺗﻮﺟﺪ داﺧﻞ ﻣﺘﻐﯿﺮ ھﺬا اﻟﻤﺘﻐﯿﺮ ھﻨﺎ ھﻮ ‪ id‬ﺣﯿﺚ أﻧﻨﺎ ﻧﻘﻮم ﺑﻜﺘﺎﺑﮫ ‪ return‬ﺛﻢ اﺳﻢ اﻟﻤﺘﻐﯿﺮ اﻟﺘﻲ ﺗﺮﺟﻊ‬ ‫ﻓﯿﮫ اﻟﻘﯿﻤﺔ ﺛﻢ ﻧﻨﮭﻲ اﻟﺪاﻟﺔ ﺑﻜﺘﺎﺑﮫ ‪ End‬ﺛﻢ اﺳﻢ اﻟﺪاﻟﺔ ‪Agc20‬‬

‫ﻤﺜﺎل ﺁﺨﺭ‬

‫‪- ٦٩ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﺗﻢ ﺗﻜﻮﯾﻦ داﻟﮫ ﺗﺴﻤﻰ ‪ Get_sal‬ھﺬه اﻟﺪاﻟﺔ ﺗﺄﺧﺬ ﻣﻌﺎﻣﻞ ھﻮ ‪ P_id‬وھﻮ ﻣﻦ ﻧﻔﺲ ﻧﻮع ﺑﯿﺎﻧﺎت‬ ‫اﻟﻌﻤﻮد ‪ empno‬أرﻗﺎم اﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﻮﺟﻮد داﺧﻞ ﺟﺪول اﻟﻤﻮﻇﻔﯿﻦ وھﺬه اﻟﺪاﻟﺔ ﺗﻘﻮم ﺑﺎﺳﺘﺮﺟﺎع ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺮﻗﻤﯿﺔ‬ ‫ﻓﻘﻂ ﺛﻢ ﺗﻢ ﺗﻌﺮﯾﻒ ﻣﺘﻐﯿﺮ ﯾﺴﻤﻰ ‪ v_salary‬ﻣﻦ اﻟﻨﻮع اﻟﺮﻗﻤﻲ أو ﻧﻔﺲ ﻧﻮع ﺑﯿﺎﻧﺎت ﻋﻤﻮد اﻟﻤﺮﺗﺐ اﻟﻤﻮﺟﻮد ﻓﻲ‬ ‫ﺟﺪول اﻟﻤﻮﻇﻔﯿﻦ ﺛﻢ ﺗﻢ ﻛﺘﺎﺑﮫ ﻛﻮد ‪ pl/sql‬وھﻮ ھﻨﺎ ﻋﺒﺎرة ﻋﻦ ﺗﺤﺪﯾﺪ ﻣﺮﺗﺐ اﻟﻤﻮﻇﻔﯿﻦ داﺧﻞ اﻟﻤﺘﻐﯿﺮ اﻟﺬي ﺗﻢ ﺗﻌﺮﯾﻔﮫ‬ ‫ﺳﺎﺑﻘﺎ وﻣﻦ ﺧﺼﺎﺋﺺ اﻟﺪاﻟﺔ أﻧﮭﺎ ﻻﺑﺪ أن ﺗﺮﺟﻊ ﺑﯿﺎﻧﺎت ھﺬه اﻟﺒﯿﺎﻧﺎت ﺳﯿﺘﻢ وﺿﻌﮭﺎ داﺧﻞ اﻟﻤﺘﻐﯿﺮ ‪ v_salary‬ﺛﻢ‬ ‫ﻧﻨﮭﻲ اﻟﺪاﻟﺔ ﺑﺎﺳﺘﺨﺪام ‪ End‬ﺛﻢ اﺳﻢ اﻟﺪاﻟﺔ وھﻲ ‪Get_sal‬‬ ‫وﻟﻤﺸﺎھﺪه اﻟﻨﺘﺎﺋﺞ ﻧﻌﺮف أوﻻ اﺳﻢ اﻟﻤﺘﻐﯿﺮ وھﻮ ‪ g_salary‬ﻣﻦ اﻟﻨﻮع اﻟﺮﻗﻤﻲ ﺛﻢ ﻧﺴﺘﺪﻋﻲ اﻟﺪاﻟﺔ ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ‬ ‫‪ Execute‬ﺛﻢ اﺳﻢ اﻟﻤﺘﻐﯿﺮ وﻧﻌﻄﻲ ﻟﮫ اﺳﻢ اﻟﺪاﻟﺔ وﻗﯿﻤﮫ اﻟﻤﻌﺎﻣﻞ اﻟﺬي ﺑﺪاﺧﻞ اﻟﺪاﻟﺔ ﻻن اﻟﻤﻌﺎﻣﻞ ﻣﻦ اﻟﻨﻮع ‪ IN‬أي‬ ‫ﻻﺑﺪ ﻣﻦ إﻋﻄﺎءه ﻗﯿﻤﮫ ﻛﻤﺎ ھﻮ ﻣﻮﺿﺢ ﺑﺎﻟﺸﻜﻞ )‪Get_sal(7788‬‬ ‫ﻤﻼﺤﻅﻪ ‪:‬‬ ‫ﻓﻲ ﺃل ‪ procedure‬ﻗﺩ ﻴﺴﺘﻘﺒل ﻤﻌﺎﻤل ﺃﻭ ﺃﻜﺜﺭ ﺃﻭ ﻗﺩ ﻻ ﻴﺴﺘﻘﺒل ﻭ ﻜﺫﻟﻙ ﻴﻌﻴﺩ ﻨﺘﻴﺠﺔ ﺃﻭ ﺃﻜﺜﺭ ﺃﻭ ﻻ ﻴﻌﻴﺩ‬ ‫ﻨﻬﺎﺌﻴﺎ‬ ‫ﺍﻟﺩﺍﻟﺔ ‪ function‬ﻗﺩ ﺘﺴﺘﻘﺒل ﻤﻌﺎﻤل ﺃﻭ ﺃﻜﺜﺭ ﺁﻭ ﻗﺩ ﻻ ﺘﺴﺘﻘﺒل ﻭ ﻟﻜﻥ ﻻ ﺘﺴﺘﻁﻴﻊ ﺇﻻ ﺃﻥ ﺘﻌﻴﺩ ﻗﻴﻤﻪ ﻭﺍﺤﺩﺓ ﻭ ﻻ‬ ‫ﻴﺼﻠﺢ ﺃﻥ ﺘﺤﺩﺩ ﻨﻭﻉ ﺍﻟﻤﻌﺎﻤل ‪ out‬ﺃﻭ ‪ in out‬ﻻﻥ ﺍﻟﺩﺍﻟﺔ ﻻ ﺘﻌﻴﺩ ﺇﻻ ﻗﻴﻤﻪ ﻭﺍﺤﺩﺓ ﻭ ﺘﻌﻴﺩﻫﺎ ﺒﺎﺴﺘﻌﻤﺎل ﺍﻷﻤﺭ‬ ‫‪ return‬ﻭ ﻻﺒﺩ ﺃﻥ ﺘﻜﻭﻥ ﻨﻭﻉ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭ ﺍﻟﻤﻌﺎﻤﻼﺕ ﻤﻥ ﺍﻷﻨﻭﺍﻉ ﺍﻻﺴﺎﺴﻴﻪ ﻓﻲ ﺍﻻﻭﺭﺍﻜل ﻭ ﺍﻟﺩﺍﻟﺔ ﻻﺒﺩ ﺃﻥ ﺘﻌﻤل‬ ‫ﻋﻠﻰ ﻗﻴﻤﻪ ﻭﺍﺤﺩﺓ ‪ single row‬ﻭ ﻟﻴﺱ ‪group‬‬ ‫ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺩﻭﺍل ‪ function‬ﻓﻲ ﺘﻌﺒﻴﺭﺍﺕ ﺃل ‪sql‬‬

‫‪- ٧٠ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻧﻘﻮم ﺑﻌﻤﻞ داﻟﮫ اﺳﻤﮭﺎ ‪ tax‬وھﺬه اﻟﺪاﻟﺔ ﺗﻘﻮم ﺑﻌﻤﻞ ﺿﺮﯾﺒﺔ ﻋﻠﻰ اﻟﻤﺮﺗﺐ ﺑﻤﻘﺪار ‪ %٨‬ﻣﻦ اﻟﻤﺮﺗﺐ و ﻧﻘﻮم‬ ‫ﺑﺎﺳﺘﺨﺪاﻣﮭﺎ ﻓﻲ أل ‪ sql‬ﻓﻲ ﺟﻤﻠﺔ اﺳﺘﻌﻼم ﺣﯿﺚ ﻧﻄﻠﺐ ﻣﻨﮫ إﺣﻀﺎر اﺳﻢ و رﻗﻢ و ﻣﺮﺗﺐ و اﻟﻀﺮﯾﺒﺔ اﻟﺘﻲ‬ ‫ﺳﺘﻮﺿﻊ ﻋﻠﻰ اﻟﻤﺮﺗﺐ ﻣﻦ ﺟﺪول اﻟﻤﻮﻇﻔﯿﻦ ﻋﻠﻰ أن اﻟﻘﺴﻢ اﻟﺬي ﺳﯿﻄﺒﻖ ﻋﻠﯿﮫ ھﺬه اﻟﺪاﻟﺔ ھﻮ اﻟﻘﺴﻢ رﻗﻢ ‪١٠‬‬ ‫و اﻟﺪوال اﻟﺘﻲ ﺗﻨﺸﺎھﺎ ﻣﻤﻜﻦ أن ﺗﻨﺎدى ﻋﻠﯿﮭﺎ ﻓﻲ ﺑﯿﺌﺔ أل ‪ sql‬ﻓﻲ اى وﻗﺖ ﻋﻨﺪﻣﺎ ﯾﻜﻮن ﻟﮭﺎ اﺳﺘﺨﺪام‬

‫ﻤﺜﺎل ﺁﺨﺭ‬

‫‪- ٧١ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ ﺗﻜﻮﯾﻦ داﻟﮫ ﺣﺪﯾﺪه ﺗﺴﻤﻰ‪ agc21‬ﺗﺄﺧﺬ اﻟﻤﻌﺎﻣﻞ ‪ ID‬وھﻮ ﻣﻦ اﻟﻨﻮع اﻟﺮﻗﻤﻲ وﯾﺴﺘﻘﺒﻞ ﻗﯿﻢ ﻓﻘﻂ‬ ‫وھﺬه اﻟﺪاﻟﺔ ﺗﺮﺟﻊ ﺑﯿﺎﻧﺎت ﻣﻦ اﻟﻨﻮع اﻟﺮﻗﻤﻲ ﺛﻢ ﺗﻢ ﺗﻌﺮﯾﻒ ﻣﺘﻐﯿﺮ ﺟﺪﯾﺪ ‪ v_no‬ھﺬا اﻟﻤﺘﻐﯿﺮ ﺗﻢ وﺿﻊ أرﻗﺎم ﺗﻠﯿﻔﻮن‬ ‫اﻟﻄﻼب داﺧﻞ ھﺬا اﻟﻤﺘﻐﯿﺮ ﺑﺸﺮط أن ﯾﻜﻮن رﻗﻢ اﻟﻄﺎﻟﺐ = ﻗﯿﻤﮫ اﻟﻤﻌﺎﻣﻞ وﺑﺬﻟﻚ ﺗﻢ ﺗﻜﻮﯾﻦ اﻟﺪاﻟﺔ‬ ‫إذا أردﻧﺎ اﻟﻤﻨﺎداة ﻋﻠﻰ اﻟﺪاﻟﺔ ﻛﻤﺎ ﻓﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ‬ ‫أوﻻ ﻧﻌﺮف ﻣﺘﻐﯿﺮ ‪ g_no‬ﻣﻦ اﻟﻨﻮع اﻟﺮﻗﻤﻲ ﺛﻢ ﻧﻨﺎدي ﻋﻠﻰ اﻟﺪاﻟﺔ ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ ‪ Execute‬وﻧﻌﻄﻲ اﺳﻢ اﻟﺪاﻟﺔ‬ ‫وﻗﯿﻤﮫ اﻟﻤﻌﺎﻣﻞ ﺑﺪاﺧﻠﮭﺎ ﻣﺜﻞ )‪ agc21(1‬ﺛﻢ ﻧﻘﻮم ﺑﻄﺒﺎﻋﮫ ھﺬا اﻟﻤﺘﻐﯿﺮ وھﻮ ‪ g_no‬وﻧﻼﺣﻆ ذﻟﻚ ﻓﻲ اﻟﻨﺎﺗﺞ‬ ‫ﺍﻟﻘﻭﺍﻋﺩ ﻭ ﺍﻟﻘﻴﻭﺩ ﺍﻟﻼﺯﻤﺔ ﻋﻨﺩ ﻤﻨﺎﺩﺍﺓ ﺍﻟﺩﺍﻟﺔ ﻤﻥ ﺃل ‪sql‬‬ ‫ﺍﻟﺩﺍﻟﺔ ﻴﺠﺏ ﺃﻥ ﺘﻜﻭﻥ ﻤﺨﺯﻨﺔ ﺃﻭ ﻤﺤﻔﻭﻅﺔ‬ ‫·‬ ‫ﺍﻟﺩﺍﻟﺔ ﺘﺄﺨﺫ ‪ IN PARAMETER‬ﻓﻘﻁ ‪.‬‬ ‫·‬ ‫ﺘﺄﺨﺫ ﺃﻨﻭﺍﻉ ﺒﻴﺎﻨﺎﺕ ﺃل ‪ SQL‬ﻟﻴﺱ ‪ PL/SQL‬ﻓﻲ ﺃل ‪ PARAMETER‬ﺍﻟﻤﻭﺠﻭﺩﺓ‬ ‫·‬ ‫ﻓﻲ ﺃل ‪ FUNCTION‬ﻤﺜل ﺃل ‪ Boolean‬ﺃﻭ ﺃل ‪Table‬‬ ‫ﺇﺭﺠﺎﻉ ﺃﻨﻭﺍﻉ ﺒﻴﺎﻨﺎﺕ ﺼﺎﻟﺤﻪ ﻓﻲ ‪ SQL‬ﻭ ﻟﻴﺱ ﻓﻲ ‪PL/SQL‬‬ ‫·‬ ‫ﻻ ﻴﺠﺏ ﺃﻥ ﺘﺤﺘﻭﻯ ﻋﻠﻰ ﺠﻤل ‪DML‬‬ ‫·‬ ‫ﻻ ﻴﺼﻠﺢ ﻋﻤل ‪ UDATE‬ﻭ ‪ DELETE‬ﻓﻲ ﻨﻔﺱ ﺍﻟﻭﻗﺕ ﻋﻠﻰ ﺠﺩﻭل ﻭﺍﺤﺩ ﻤﺜﻼ ﺇﺫﺍ‬ ‫·‬ ‫ﻜﺎﻥ ﻋﻨﺩﻙ ‪ FUNCTION‬ﻭ ﺤﺎﻭﻟﺕ ﺘﻌﻤل ‪ UPDATE‬ﻓﻲ ﺍﻷﻭل ﻭ ﺃﻨﺕ ﻓﻲ ﺁﺨﺭ ﺍﻟﺠﻤﻠﺔ ﻤﺜﻼ ﺤﻭﻟﺕ ﺘﻌﻤل‬ ‫‪ DELETE‬ﻻ ﻴﺼﻠﺢ ﺴﻭﻑ ﻴﻘﻭﻡ ﺒﺎﻟﺭﻓﺽ‬

‫‪- ٧٢ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻟﻌﻤل ﺤﺫﻑ ﻟﻠﺩﺍﻟﺔ ‪REMOVING FUNCTION‬‬ ‫ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ‪:‬‬ ‫; ‪REMOVE FUNCTION function_name‬‬ ‫ﺤﻴﺙ ‪ function_name‬ﺍﺴﻡ ﺍﻟﺩﺍﻟﺔ‬

‫‪- ٧٣ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻭﺍﻵﻥ ﻻﺒﺩ ﺃﻥ ﻨﻌﺭﻑ ﺒﻌﺽ ﺍﻟﺼﻼﺤﻴﺎﺕ ﺍﻟﺘﻲ ﻴﺘﻡ ﺇﻋﻁﺎﺅﻫﺎ ﻟﻠﻤﺴﺘﺨﺩﻡ ﻤﻥ ﻗﺒل ﻤﺩﻴﺭ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫ﻟﻜﻲ ﻴﺴﻤﺢ ﻟﻠﻤﺴﺘﺨﺩﻡ ﺃﻥ ﻴﺸﻴﺭ ﺇﻟﻰ ‪ Object‬ﻭﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻥ )‪ (Table,View,Subprogramme‬ﻻﺒﺩ ﺃﻥ‬ ‫ﻴﻘﻭﻡ ﻤﺩﻴﺭ ﻗﻭﺍﻋﺩ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺒﺈﻋﻁﺎﺀ ﺼﻼﺤﻴﺎﺕ ﺍﻟﺴﻤﺎﺡ ﻟﻠﻤﺴﺘﺨﺩﻡ ﺒﺘﻤﻭﻴﻥ ﻭﺘﻌﺩﻴل ﻓﻲ ﻫﺫﻩ ﺃل ‪Object‬‬ ‫ﻭﻴﻭﺠﺩ ﺃﻜﺜﺭ ﻤﻥ ‪ ٨٠‬ﺼﻼﺤﻴﺔ ﻴﻘﻭﻡ ﻤﺩﻴﺭ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺒﺎﻋﻁﺎﺀﻫﺎ ﻟﻠﻤﺴﺘﺨﺩﻡ ﻭﻟﻜﻥ ﻤﻥ ﻫﺫﻩ ﺍﻟﺼﻼﺤﻴﺎﺕ ﻋﻤل‬ ‫‪ Create‬ﺃﻭ ‪ Alter‬ﺃﻭ ‪ drop‬ﺃﻭ ﺃﻱ ﺼﻼﺤﻴﺎﺕ ﺃﺨﺭﻯ ﻤﺜل ‪ Grant alter any table to ahmed‬ﻭﻴﺘﻡ ﺇﻋﻁﺎﺀ‬ ‫ﻫﺫﻩ ﺍﻟﺼﻼﺤﻴﺎﺕ ﻤﻥ ﺨﻼل ‪ System‬ﺃﻭ ‪Sys‬‬ ‫ﻭﻋﻨﺩ ﺇﻋﻁﺎﺀ ﺍﻟﺼﻼﺤﻴﺔ ﻻﺒﺩ ﺃﻥ ﻨﻌﻁﻲ ﺍﺴﻡ ﺃل ‪Object‬ﻤﻭﺠﻭﺩﺓ ﺩﺍﺨل ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻤﺜل‬

‫‪- ٧٤ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫‪Grant alter on emp to ahmed‬‬

‫ﻭﺒﺎﻟﻨﺴﺒﺔ ﻟﻠﺩﻭﺍل ﻭﺍﻹﺠﺭﺍﺀﺍﺕ ﻻﺒﺩ ﺃﻥ ﻨﻌﻁﻲ ﻟﻠﻤﺴﺘﺨﺩﻡ ﺼﻼﺤﻴﺔ ﺘﻜﻭﻴﻥ ﻫﺫﻩ ﺃل‪ Sub programme‬ﻤﺜل‬ ‫‪ Create procedure‬ﻭﻋﻨﺩ ﺍﺴﺘﺨﺩﺍﻡ ﻜﻠﻤﻪ ‪ Any‬ﺩﺍﺨل ﺍﻟﺼﻼﺤﻴﺔ ﻓﺈﻨﻬﺎ ﺘﺴﻤﺢ ﻟﻠﻤﺴﺘﺨﺩﻡ ﺃﻥ ﻴﻘﻭﻡ ﺒﻌﻤل ‪Create‬‬ ‫ﺃﻭ ‪ Alter‬ﺃﻭ ‪ Drop‬ﻷﻱ ﻤﻥ ﺃل ‪ Object‬ﺍﻟﻤﻭﺠﻭﺩﺓ ﻋﻠﻰ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺃﻭ ﺃﻱ ﻗﺎﻋﺩﺓ ﺒﻴﺎﻨﺎﺕ ﺃﺨﺭﻯ‬ ‫ﻭﻨﻼﺤﻅ ﺃﻥ ﻜﻠﻤﻪ ‪Any‬ﻟﻴﺴﺕ ﻀﺭﻭﺭﻴﺔ ﻭﺘﺴﺘﺨﺩﻡ ﻓﻲ ﺤﺎﻟﻪ ‪ Create procedure‬ﻓﻘﻁ‬ ‫ﻭﻻﺒﺩ ﻋﻨﺩ ﺍﺴﺘﺩﻋﺎﺀ ﺍﻹﺠﺭﺍﺀ ﺃﻭ ﺍﻟﺩﺍﻟﺔ ﺃﻥ ﻴﻜﻭﻥ ﻟﻠﻤﺴﺘﺨﺩﻡ ﺼﻼﺤﻴﺔ ﺍﻟﻤﻨﺎﺩﺍﺓ ﻋﻠﻰ ﺍﻹﺠﺭﺍﺀ ﺃﻭ ﺍﻟﺩﺍﻟﺔ ﺃﻱ ﻋﻤل‬ ‫‪ Execute‬ﻭﻴﺘﻡ ﺇﻋﻁﺎﺀ ﻫﺫﻩ ﺍﻟﺼﻼﺤﻴﺔ ﻓﻲ ﺤﺎﻟﻪ ﺃﻥ ﺍﻟﻤﺴﺘﺨﺩﻡ ﻟﻴﺱ ﻫﻭ ﻤﺎﻟﻙ ﻫﺫﺍ ﺃل ‪Object‬‬ ‫ﻭﺍﻵﻥ ﺴﻨﺭﻯ ﺒﻤﺜﺎل ﻜﻴﻔﻴﻪ ﺇﻋﻁﺎﺀ ﻫﺫﻩ ﺍﻟﺼﻼﺤﻴﺎﺕ‪:‬‬ ‫ﺃﻭﻻ ﻨﺩﺨل ﺒﺎﺴﻡ ﺍﻟﻤﺴﺘﺨﺩﻡ ﻭﻜﻠﻤﻪ ﺍﻟﻤﺭﻭﺭ‪System/manager‬‬

‫ﺜﺎﻨﻴﺎ ﻨﻨﺸﺊ ﺠﺩﻭل ﺩﺍﺨل ﺍﻟﻤﺴﺘﺨﺩﻡ ﻴﺴﻤﻰ ﺍﻟﺠﺩﻭل ‪ Fady‬ﻫﺫﺍ ﺍﻟﺠﺩﻭل ﻴﺤﺘﻭﻱ ﻋﻠﻰ ﻋﻤﻭﺩﻴﻥ ﻫﻤﺎ ‪ID‬ﻭ‪Name‬‬ ‫ﻜﻤﺎ ﻫﻭ ﻤﺒﻴﻥ ﻓﻲ ﺍﻟﺸﻜل ﺍﻻﺘﻲ‪:‬‬

‫‪- ٧٥ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺘﻡ ﺘﻜﻭﻴﻥ ﺍﻟﺠﺩﻭل ﻴﺴﻤﻰ ﺠﺩﻭل ‪ fady‬ﻭﺒﻪ ﺍﻻﻋﻤﺩﻩ ‪id‬ﻭ‪name‬‬

‫ﻓﻲ ھﺬا اﻟﻤﺜﺎل ﺗﻢ إﻋﻄﺎء ﺻﻼﺣﯿﺔ اﻹﺗﯿﺎن ﺑﺎﻟﺒﯿﺎﻧﺎت ﻣﻦ ﺟﺪول ﻟﻤﺴﺘﺨﺪم ﯾﺴﻤﻰ اﺣﻤﺪ وھﺬا اﻟﻤﺴﺘﺨﺪم ﺗﻢ ﺗﻜﻮﯾﻨﮫ ﺳﺎﺑﻘﺎ‬ ‫داﺧﻞ ‪System/manager‬‬ ‫وﺑﮭﺬا ﯾﺴﺘﻄﯿﻊ اﻟﻤﺴﺘﺨﺪم اﺣﻤﺪ أن ﯾﻨﻈﺮ إﻟﻰ اﻟﺠﺪول ﻓﺎﺿﻲ وﯾﺄﺗﻲ ﻣﻨﮫ ﺑﺎﻟﺒﯿﺎﻧﺎت ﺑﻄﺮﯾﻘﮫ ﻣﺒﺎﺷﺮه‬ ‫وﻟﻜﻦ ھﻞ ﯾﺴﺘﻄﯿﻊ ﻣﺴﺘﺨﺪم آﺧﺮ وﻟﯿﻜﻦ ‪ Shereen‬أن ﯾﺮى ھﺬا اﻟﺠﺪول اوﯾﺤﺪد ﺑﯿﺎﻧﺎت ﻣﻨﮫ؟‬ ‫ﺑﺎﻟﻄﺒﻊ ﻣﻤﻜﻦ أن ﯾﻘﻮم ﻣﺴﺘﺨﺪم آﺧﺮ ﺑﺎن ﯾﺮى اﻟﺠﺪول وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ أن ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺘﻜﻮﯾﻦ ‪Procedure‬‬ ‫ﺟﺪﯾﺪ ھﺬا أل ‪ Procedure‬ﻟﮫ اﻟﻘﺪرة ﻋﻠﻰ ﻗﺮاءه اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﺠﺪول ﻛﻤﺎ ﺳﻨﺮى اﻵن‬ ‫ﺃﻭﻻ‪ :‬ﻋﻨﺩ ﻋﻤل ‪ Connect‬ﺒﺎﺴﺘﺨﺩﺍﻡ ‪Ahmed/ihab‬‬

‫‪- ٧٦ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺛﺎﻧﯿﺎ ﯾﺘﻢ ﺗﻜﻮﯾﻦ‪:Procedure‬‬

‫ﺗﻢ ﺗﻜﻮﯾﻦ ‪Procedure‬ﯾﺴﻤﻰ ‪ Hany2‬وإﻋﻄﺎءه ﻣﻌﺎﻣﻞ‪ v_id‬ﻣﻦ اﻟﻨﻮع ‪Out Parameter‬‬ ‫ﺜﻡ ﻨﻜﻭﻥ ﻤﺴﺘﺨﺩﻡ ﺠﺩﻴﺩ ﻴﺴﻤﻰ ‪ Shereen‬ﻫﺫﺍ ﺍﻟﻤﺴﺘﺨﺩﻡ ﺴﻴﻌﻁﻰ ﻟﻪ ﺼﻼﺤﻴﺔ ﻋﻤل ‪ Select‬ﻤﻥ ﺠﺩﻭل ‪Fady‬‬ ‫ﻭﻟﻜﻥ ﺒﻁﺭﻴﻘﻪ ﻏﻴﺭ ﻤﺒﺎﺸﺭﻩ ﻭﺫﻟﻙ ﻋﻥ ﻁﺭﻴﻕ ﺍﻨﻪ ﻴﻘﻭﻡ ﺒﺎﻟﻤﻨﺎﺩﺍﺓ ﻋﻠﻰ ﺃل ‪ Procedure‬ﺍﻟﺫﻱ ﻗﺎﻡ ﺍﻟﻤﺴﺘﺨﺩﻡ ﺍﺤﻤﺩ‬ ‫ﺒﻌﻤﻠﻪ ﻭﺴﻨﺭﻯ ﺫﻟﻙ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل‪:‬‬

‫‪- ٧٧ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫وﺑﮭﺬا ﻓﺎن اﻟﻤﺴﺘﺨﺪﻣﺔ ‪Shereen‬ﻟﮭﺎ اﻟﻘﺪرة أن ﺗﺮى اﻟﺒﯿﺎﻧﺎت داﺧﻞ اﻟﺠﺪول ‪ Fady1‬ﺑﺎﻟﺮﻏﻢ ﻣﻦ أﻧﮭﺎ ﻟﯿﺲ ﻟﮭﺎ‬ ‫ﺻﻼﺣﯿﺔ ﻋﻤﻞ ‪ Select‬ﻣﻦ ھﺬا اﻟﺠﺪول وﻟﻜﻨﮭﺎ ﺗﺴﺘﻄﯿﻊ ﻣﻦ ﺧﻼل أل ‪ Procedure‬اﻟﺬي ﺗﻢ ﺗﻜﻮﯾﻨﮫ وھﻮ ‪Hany3‬‬ ‫أن ﺗﺮى اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﺠﺪول وھﺬه ﺗﺴﻤﻰ ﺑﺎﻟﻄﺮﯾﻘﺔ ﻏﯿﺮ اﻟﻤﺒﺎﺷﺮة‬ ‫وﺑﮭﺬا ﻧﻜﻮن ﻗﺪ ﺗﻌﺮﻓﻨﺎ ﻋﻠﻰ اﻟﻄﺮﯾﻘﺔ اﻟﻤﺒﺎﺷﺮة واﻟﻄﺮﯾﻘﺔ اﻟﻐﯿﺮ ﻣﺒﺎﺷﺮه ﻟﻠﺪﺧﻮل ﻋﻠﻰ اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﺠﺪول‬ ‫ﻭﻟﻠﺘﺄﻜﺩ ﻤﻥ ﺃﻥ ﺍﻟﻤﻨﺎﺩﺍﺓ ﻋﻠﻰ ﺃل ‪ Procedure‬ﻻﺒﺩ ﺃﻥ ﻴﻜﻭﻥ ﺍﻟﻤﺴﺘﺨﺩﻡ ﻟﻪ ﺍﻟﺼﻼﺤﻴﺔ ﻋﻠﻰ ﻋﻤل ‪Execute‬‬ ‫ﻨﺭﻯ ﺍﻟﻤﺜﺎل ﺍﻵﺘﻲ‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻜﻭﻴﻥ ﺩﺍﻟﻪ ﺠﺩﻴﺩﺓ ﻫﺫﻩ ﺍﻟﺩﺍﻟﺔ ﻫﻲ ‪ agc15‬ﻟﻬﺎ ﻤﻌﺎﻤل ﻭﺍﺤﺩ ﻭﻫﻭ ‪ v_id‬ﻤﻥ ﺍﻟﻨﻭﻉ ﺍﻟﺭﻗﻤﻲ ﺜﻡ‬ ‫ﺘﻡ ﻜﺘﺎﺒﻪ ‪Authid‬ﻭﻤﻌﻨﺎﻫﺎ ﻟﻭ ﺃﻥ ﺍﻟﻤﺴﺘﺨﺩﻡ ﻟﻪ ﺼﻼﺤﻴﺔ ﻋﻤل ﺘﻨﻔﻴﺫ ﻫﺫﺍ ﺍﻹﺠﺭﺍﺀ ﻴﻘﻭﻡ ﺒﻌﻤل ‪ Select‬ﻓﻲ ﺍﻟﺠﺩﻭل‬

‫‪- ٧٨ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻟﺘﺤﺩﻴﺩ ﺃﺴﻤﺎﺀ ﺃل ‪ Object‬ﻭﻫﻲ ﻋﺒﺎﺭﺓ ﻋﻥ ﺃﺴﻤﺎﺀ ﺍﻟﺠﺩﺍﻭل ﺃﻭ ﺍﻟﻤﻜﺘﺒﺎﺕ ﺃﻭ ﺃل ﺇﺠﺭﺍﺀﺍﺕ ﺃﻭ ﺍﻟﺩﻭﺍل‬

‫ﻤﺜﺎل‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﺤﺩﻴﺩ ﺃﺴﻤﺎﺀ ﺃل ‪ Object‬ﺍﻟﻤﻭﺠﻭﺩﺓ ﺩﺍﺨل ﺠﺩﻭل‪ USER_OBJECT‬ﻭﻫﺫﺍ ﻤﺎ ﻴﻭﻀﺤﻪ ﺍﻟﻨﺎﺘﺞ‬

‫‪- ٧٩ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻭ ﻴﺴﺘﺨﺩﻡ ﺃل ‪ user_source‬ﻟﻠﻭﺼﻭل ﺇﻟﻰ ﻨﺹ ‪procedure , function , package , package body‬‬ ‫ﻤﺨﺯﻨﺔ ﻭ ﻴﻘﻭﻡ ﺃﻴﻀﺎ ﺒﻔﺤﺹ ﻤﺸﺎﻫﺩﺍﺕ ﺃل ‪ all_source‬ﻭ ‪ dba_source‬ﻜل ﻤﻨﻬﺎ ﺘﺤﺘﻭﻯ ﻋﻠﻰ ﻋﻤﻭﺩ‬ ‫ﺍﻴﻀﺎﻓﻰ ﻭﻫﻭ ‪owner‬ﻭ ﻫﻭ ﻟﻤﺎﻟﻙ ﺃل ‪ object‬ﻭ ﻟﻭ ﻜﺎﻥ ﻤﻠﻑ ﺍﻟﻤﺼﺩﺭ ﻏﻴﺭ ﻤﺘﺎﺡ ﻴﻤﻜﻨﻙ ﺍﺴﺘﺨﺩﺍﻡ ﺒﻴﺌﺔ ﺃل‬ ‫‪ sql*plus‬ﻹﻋﺎﺩﺓ ﺇﻨﺸﺎﺌﻬﺎ ﻤﻥ ﺨﻼل ﺃل ‪user_source‬‬ ‫ﻤﺜﺎل ‪:‬‬

‫‪- ٨٠ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫‪- ٨١ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻟﻠﺤﺼﻭل ﻋﻠﻰ ﻨﺹ ﻤﺼﻨﻑ ﺍﻟﺨﻁﺎﺀ‬ ‫ﻭﺘﺴﺘﺨﺩﻡ ‪ USER_ERROR data Dictionary view‬ﺃﻭ ﺘﺴﺘﺨﺩﻡ ﻟﻤﺸﺎﻫﺩﺓ ﺍﻷﺨﻁﺎﺀ ﻓﻲ ﺃﻭﺍﻤﺭ ﺃل‬ ‫‪SQL*PLUS‬‬ ‫ﻭ ﻴﺴﺘﺨﺩﻡ ﺃﻴﻀﺎ ﻟﻔﺤﺹ ‪ ALL_ERRORS AND DBA_ERRORS‬ﻜل ﻤﻨﻬﺎ ﺘﺤﺘﻭﻯ ﻋﻠﻰ ﻋﻤﻭﺩ ﺍﻴﻀﺎﻓﻰ‬ ‫‪ OWNER‬ﻟﻤﺎﻟﻜﻲ ﺃل ‪. OBJECT‬‬

‫‪- ٨٢ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻭ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻨﺴﺘﺨﺩﻡ ﻋﺒﺎﺭﺓ ﺃل ‪ SQL‬ﻤﻥ ﺨﻼل ‪ USER_ERRORS data dictionary view‬ﻟﻠﻘﻴﺎﻡ‬ ‫ﺒﻌﻤﻠﻴﻪ ﻤﺸﺎﻫﺩﺓ ﺍﻷﺨﻁﺎﺀ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺍﻟﺒﺭﻨﺎﻤﺞ‬

‫ﺤﺯﻡ ﺍﻟﺩﻭﺍل ﻭ ﺍﻟﺒﺭﺍﻤﺞ ﺍﻟﻔﺭﻋﻴﺔ ‪: Package‬‬

‫‪- ٨٣ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻭ ﻫﻲ ﺍﺤﺩ ﺍﻟﻁﺭﻕ ﺍﻟﻤﺘﺎﺤﺔ ﻟﺘﺠﻤﻴﻊ ﺃﻭﺍﻤﺭ ﺃل ‪ PL/SQL‬ﻓﻲ ﻟﻐﺔ ﺍﻻﻭﺭﺍﻜل ﻭ ﺘﺤﺕ ﺍﺴﻡ ﻴﻌﺒﺭ ﻋﻥ ﺍﻟﻐﺭﺽ ﻤﻥ‬ ‫ﻫﺫﻩ ﺍﻷﻭﺍﻤﺭ‬ ‫ﻭ ﺩﺍﺌﻤﺎ ﻴﺴﻌﻰ ﺍﻟﺘﻁﻭﻴﺭ ﻓﻲ ﻁﺭﻕ ﺍﻟﺒﺭﻤﺠﺔ ﺇﻟﻰ ﺍﻟﻨﻅﺎﻡ ﻭ ﺍﺨﺘﺼﺎﺭ ﺃﻭﺍﻤﺭ ﺍﻟﺒﺭﺍﻤﺞ ﻟﺘﺴﻬﻴل ﺇﻋﺎﺩﺓ ﺍﺴﺘﺨﺩﺍﻤﻬﺎ‬ ‫ﻭ ﻜﺎﻨﺕ ﺃﻭل ﻫﺫﻩ ﺍﻟﻁﺭﻕ ﺍﻟﺒﺭﺍﻤﺞ ﺍﻟﻔﺭﻋﻴﺔ ‪ procedure‬ﻭ ﺍﻟﺩﻭﺍل ‪ function‬ﺍﻟﺘﻲ ﺘﻨﺎﻭﻟﻨﺎﻫﺎ ﻓﺒﺩﻻ ﻤﻥ ﻜﺘﺎﺒﻪ‬ ‫ﺃﻭﺍﻤﺭ ﺃل ‪ PL/SQL‬ﻜل ﻤﺭﺓ ﻓﻲ ﺃﻜﺜﺭ ﻤﻥ ﻤﻭﻀﻭﻉ ﻭ ﻋﻨﺩ ﺍﻻﺤﺘﻴﺎﺝ ﺇﻟﻴﻬﺎ ﻴﻌﺎﺩ ﻜﺘﺎﺒﺘﻬﺎ ﻅﻬﺭﺕ ﻓﻜﺭﺓ ﺍﻟﺩﻭﺍل ﻭ‬ ‫ﺍﻟﺒﺭﺍﻤﺞ ﺍﻟﻔﺭﻋﻴﺔ ﺍﻟﺘﻲ ﺘﻘﻭﻡ ﺒﺘﺠﻤﻴﻊ ﻤﺠﻤﻭﻋﺔ ﺍﻷﻭﺍﻤﺭ ﻭ ﺇﻨﺸﺎﺀ ﺩﺍﻟﻪ ‪ function‬ﺃﻭ ‪ procedure‬ﺘﺅﺩﻯ ﻏﺭﺽ‬ ‫ﻤﻌﻴﻥ ﻭ ﻋﻨﺩ ﺍﻻﺤﺘﻴﺎﺝ ﻟﻬﺫﺍ ﺍﻟﻐﺭﺽ ﻴﺘﻡ ﺍﺴﺘﺩﻋﺎﺀ ﺍﻟﺩﺍﻟﺔ ‪ function‬ﻭ ﻟﻴﺱ ﻫﻨﺎﻙ ﺍﻟﺤﺎﺠﺔ ﻹﻋﺎﺩﺓ ﻜﺘﺎﺒﻪ ﺴﻁﻭﺭﻫﺎ‬ ‫ﻤﺭﺓ ﺃﺨﺭﻯ ﻭ ﻫﺫﻩ ﻫﻲ ﺃﻭل ﺨﻁﻭﺓ ﺤﻴﺙ ﻴﺘﻡ ﺍﻹﻨﺸﺎﺀ ﻤﺭﺓ ﻭﺍﺤﺩﺓ ﻭ ﺍﻻﺴﺘﺩﻋﺎﺀ ﺃﻜﺜﺭ ﻤﻥ ﻤﺭﺓ ‪.‬‬ ‫ﻭ ﺠﺎﺀﺕ ﻓﻜﺭﺓ ﺃل ‪ Package‬ﻟﺘﺯﻴﺩ ﺍﻷﻤﺭ ﺘﻨﻅﻴﻤﺎ ﻓﺒﺩﻻ ﻤﻥ ﺇﻨﺸﺎﺀ ﻜﺜﻴﺭ ﻤﻥ ﺍﻟﺩﻭﺍل ‪ Function‬ﻭ ﺍﻟﺒﺭﺍﻤﺞ‬ ‫ﺍﻟﻔﺭﻋﻴﺔ ‪ Procedure‬ﺍﻟﻤﺘﻨﺎﺜﺭﺓ ﻭ ﻏﻴﺭ ﺍﻟﻤﻨﺘﻅﻤﺔ ﻴﺘﻡ ﺇﻨﺸﺎﺀ ﺃل ‪) Package‬ﺍﻟﺤﺯﻤﺔ( ﻟﻐﺭﺽ ﻤﻌﻴﻥ ﻭ ﻟﻴﻜﻥ‬ ‫ﺍﻟﺭﺴﺎﺌل ‪ message‬ﻤﺜﻼ ﺜﻡ ﺘﺠﻤﻴﻊ )ﺇﻨﺸﺎﺀ( ﻤﺠﻤﻭﻋﺔ ﻤﻥ ﺩﻭﺍل ‪ Procedure , Function‬ﺒﺈﺭﺴﺎل ﺍﻟﺭﺴﺎﺌل‬ ‫‪ message‬ﺩﺍﺨل ﻫﺫﻩ ﺍﻟﺤﺯﻤﺔ ‪ Package‬ﻭ ﺒﻬﺫﺍ ﺍﻷﺴﻠﻭﺏ ﻴﺼﺒﺢ ﻟﺩﻴﻙ ﻤﻜﺘﺒﻪ ﻤﻥ ﺍﻟﺤﺯﻡ ‪ Packages‬ﻭ ﻟﻴﺱ‬ ‫ﺍﻟﺩﻭﺍل ﻓﻤﺜﻼ ‪:‬‬ ‫ﺤﺯﻤﺔ ﺍﻟﺭﺴﺎﺌل ‪message package‬‬ ‫ﺤﺯﻤﺔ ﻤﺭﺍﺠﻌﺔ ﺍﻟﺒﻴﺎﻨﺎﺕ ‪validation package‬‬ ‫ﺤﺯﻤﺔ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﻗﻭﺍﺌﻡ ﺍﻻﺨﺘﻴﺎﺭﺍﺕ ‪menu package‬‬ ‫ﻭ ﺒﻬﺫﺍ ﺃﺼﺒﺢ ﺍﻷﻤﺭ ﺃﻜﺜﺭ ﻨﻅﺎﻤﺎ‬ ‫ﻤﺯﺍﻴﺎ ﺍﺴﺘﻌﻤﺎل ﺃل ‪. Package‬‬ ‫ﺘﺠﻤﻴﻊ ﺍﻟﺩﻭﺍل ‪ function‬ﻭ ﺍﻟﺒﺭﺍﻤﺞ ﺍﻟﻔﺭﻋﻴﺔ ‪ procedure‬ﺍﻟﺘﻲ ﺘﺨﺹ ﻤﻭﻀﻭﻉ ﻭﺍﺤﺩ ﻓﻲ ﺤﺯﻤﺔ‬ ‫‪-١‬‬ ‫ﻭﺍﺤﺩﺓ ‪Package‬‬ ‫ﻴﺘﻡ ﺍﺴﺘﻌﻤﺎل ﺍﻟﺩﻭﺍل ﻭ ﺍﻟﺒﺭﺍﻤﺞ ﺍﻟﻔﺭﻋﻴﺔ ﺒﻔﺘﺢ ﺃل ‪ package‬ﺍﻟﺨﺎﺼﺔ ﺒﻬﻡ ﻓﻘﻁ ﻭﻻ ﺘﺤﺘﺎﺝ ﻟﻔﺘﺢ ﻜل‬ ‫‪-٢‬‬ ‫ﺩﺍﻟﻪ ﺍﻭ ﺒﺭﻨﺎﻤﺞ ﻓﺭﻋﻰ ﻋﻠﻰ ﺤﺩﺓ‬ ‫ﻴﺘﻡ ﺍﻹﺸﺎﺭﺓ ﺇﻟﻰ ﺍﺴﻡ ﺍﻟﺤﺯﻤﺔ ‪ package‬ﻋﻨﺩ ﺍﺴﺘﺩﻋﺎﺀ ﺩﺍﻟﻪ ‪ function‬ﺃﻭ ‪ procedures‬ﺩﺍﺨﻠﻬﺎ‬ ‫‪-٣‬‬ ‫ﺒﺎﻟﺸﻜل ﺍﻟﺘﺎﻟﻲ‬ ‫‪( ) package . function‬‬ ‫ﻭ ﻫﺫﺍ ﺍﻷﺴﻠﻭﺏ ﻴﻌﻁﻰ ﺸﻲﺀ ﻤﻥ ﺍﻟﺘﻨﻅﻴﻡ‬ ‫‪ - ٤‬ﺇﻨﺸﺎﺀ ﻭ ﺍﺴﺘﻌﻤﺎل ﺃل ‪ package‬ﻴﻤﻜﻨﻙ ﻤﻥ ﺇﺨﻔﺎﺀ ﻨﺼﻭﺹ ﺃﻭﺍﻤﺭ ‪ pl/sql‬ﺍﻟﺨﺎﺼﺔ ﺒﺎﻟﺩﻭﺍل ﻭ ﺍﻟﺒﺭﺍﻤﺞ‬ ‫ﺍﻟﻔﺭﻋﻴﺔ ﺤﻴﺙ ﻴﻤﻜﻨﻙ ﺘﺭﺠﻤﺘﻬﺎ ﻭ ﺍﺴﺘﻌﻤﺎﻟﻬﺎ ﺩﻭﻥ ﺍﻟﺭﺠﻭﻉ ﻟﻨﺹ ﺍﻟﺒﺭﻨﺎﻤﺞ‬ ‫‪ - ٥‬ﺴﻬﻭﻟﻪ ﻋﻤﻠﻴﻪ ﺍﻟﺼﻴﺎﻨﺔ ﻋﻠﻰ ﺍﻟﻜﻭﺩ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻟﺠﺯﻡ‬

‫ﻭ ﺘﺘﻜﻭﻥ ﺍﻟﺤﺯﻡ ﻤﻥ ﺠﺯﺌﻴﻴﻥ‬ ‫ﺍﻟﺠﺯﺀ ﺍﻷﻭل ‪ PACKAGE SPECIFICATION‬ﻭ ﻓﻴﻪ ﻴﺘﻡ ﺍﻹﻋﻼﻥ ﻋﻥ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﻌﺎﻤﺔ ﻭ ﻜﺫﻟﻙ‬ ‫ﺍﻹﻋﻼﻥ ﻋﻥ ﺍﻟﺩﻭﺍل ‪ FUNCTION‬ﻭ ﺍﻟﺒﺭﺍﻤﺞ ﺍﻟﻔﺭﻋﻴﺔ ‪ PROCEDURE‬ﻭ ﺍﻟﻤﻘﺼﻭﺩ ﺒﺎﻹﻋﻼﻥ ﻋﻨﻬﺎ ﺍﻯ‬ ‫‪- ٨٤ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻜﺘﺎﺒﻪ ﺘﻌﺭﻴﻑ ﺍﻯ ﺍﺴﻡ ﺍﻟﺩﺍﻟﺔ ﻭ ﻤﻌﺎﻤﻠﺘﻬﺎ ﻭ ﺃﻨﻭﻋﻬﺎ ﻭ ﻜﺫﻟﻙ ﺍﻟﻘﻴﻤﺔ ﺍﻟﻤﺭﺘﺠﻌﺔ ‪ RETURN VALUE‬ﺒﺎﻟﻨﺴﺒﺔ‬ ‫ﻟﻠﺩﻭﺍل ﻭ ﻻ ﻴﺘﻡ ﻜﺘﺎﺒﻪ ﺴﻁﻭﺭ ﺃﻭﺍﻤﺭ ‪PL/SQL‬‬

‫ﻭ ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻹﻨﺸﺎﺀ ﺍﻟﺠﺯﺀ ﺍﻷﻭل ﻫﻲ‬ ‫‪CREATE [OR REPLACE] PACKAGE package_name‬‬ ‫‪IS | AS‬‬ ‫‪Puplic type and item declarations subprogram specifications‬‬ ‫;‪END package_name‬‬

‫ﺍﻟﺠﺯﺀ ﺍﻟﺜﺎﻨﻲ ‪:‬‬ ‫ﻗﺴﻡ ﺍﻷﻭﺍﻤﺭ )ﺴﻁﻭﺭ ﺍﻟﺩﻭﺍل( ‪PACKAGE BODY‬‬ ‫ﻴﺴﻤﻰ ﻫﺫﺍ ﺍﻟﻘﺴﻡ ﺒﺠﺴﻡ ﺍﻟﺤﺯﻤﺔ ‪ PACKAGE BODY‬ﻷﻨﺔ ﻴﺤﺘﻭﻯ ﻋﻠﻰ ﺴﻁﻭﺭ ﺃﻭﺍﻤﺭ ‪ PL/SQL‬ﺍﻟﺘﻲ‬ ‫ﺘﺘﻜﻭﻥ ﻤﻨﻬﺎ ﺍﻟﺩﻭﺍل ﻭ ﺍﻟﺒﺭﺍﻤﺞ ﺍﻟﻔﺭﻋﻴﺔ ﻓﺎﻟﻘﺴﻡ ﺍﻷﻭل ﻤﺎ ﻫﻭ ﺇﻻ ﺇﻋﻼﻥ ﻭ ﺘﻌﺭﻴﻑ ﻷﺴﻤﺎﺀ ﺍﻟﺩﻭﺍل ﻭ ﻟﻜﻥ ﻫﺫﺍ ﺍﻟﻘﺴﻡ‬ ‫ﻫﻭ ﺍﻟﺫﻱ ﻴﺤﺘﻭﻯ ﻋﻠﻰ ﺴﻁﻭﺭ ﺍﻷﻭﺍﻤﺭ ﺍﻟﺘﻲ ﺘﺤﻘﻕ ﺃﻋﻤﺎل ﺍﻟﺩﻭﺍل ﻭﺒﺩﻭﻨﻬﺎ ﺘﺼﺒﺢ ﺍﻟﺩﻭﺍل ﺒﺎﻟﺘﺎﻟﻲ ﺤﺯﻤﺔ ﺍﻟﺒﺭﺍﻤﺞ‬ ‫‪ PACKAGE‬ﻟﻴﺱ ﻟﻬﺎ ﻗﻴﻤﺔ ﻓﺘﺨﻴل ﻟﻭ ﺍﻨﻙ ﻜﺘﺒﺕ ﻋﻨﻭﺍﻥ ﺩﺍﻟﻪ ﺘﻘﻭﻡ ﺒﺤﺴﺎﺏ ﺍﻟﻀﺭﻴﺒﺔ ﺍﻟﻤﺴﺘﺤﻘﺔ ﻭ ﻟﻜﻨﻙ ﻟﻡ ﺘﻘﻡ‬ ‫ﺒﻜﺘﺎﺒﻪ ﺍﻷﻤﺭ ﺍﻟﺘﻲ ﺘﻘﻭﻡ ﺒﺤﺴﺎﺏ ﻫﺫﻩ ﺍﻟﻀﺭﻴﺒﺔ ﻓﻬﺫﺍ ﻟﻴﺱ ﻟﻪ ﻤﻌﻨﻰ‬ ‫ﻭ ﻫﺫﺍ ﻤﺎ ﻴﺤﺩﺙ ﺒﺎﻟﻀﺒﻁ ﺒﺎﻟﻨﺴﺒﺔ ﻟﻌﻨﻭﺍﻥ ﺍﻟﺤﺯﻤﺔ ‪ PACKAGE SPECIFICATION‬ﻭ ﺠﺴﻡ ﺍﻟﺤﺯﻤﺔ‬ ‫‪PACKAGE BODY‬‬

‫ﻭ ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻹﻨﺸﺎﺀ ﺍﻟﺠﺯﺀ ﺍﻟﺜﺎﻨﻲ ﻤﺎ ﻴﻠﻲ ‪:‬‬

‫‪CREATE [OR REPLACE ] PACKAGE BODY package_name‬‬ ‫‪IS | AS‬‬ ‫‪Public type and item declarations‬‬ ‫‪Subprogram specifications‬‬ ‫; ‪End package_name‬‬

‫ﺨﻁﻭﺍﺕ ﺇﻨﺸﺎﺀ ﺤﺯﻤﺔ ﺍﻟﺩﻭﺍل ‪package‬‬ ‫ﻴﺘﻡ ﺍﻹﻨﺸﺎﺀ ﺒﺎﻟﺨﻁﻭﺍﺕ ﺍﻟﺘﺎﻟﻴﺔ ‪:‬‬ ‫‪-١‬‬

‫ﺇﻨﺸﺎﺀ ﻗﺴﻡ ﺍﻟﺘﻌﺭﻴﻔﺎﺕ ‪package specification‬‬

‫ﻭ ﻓﻴﻪ ﻴﺘﻡ ﺍﻹﻋﻼﻥ ﻋﻥ ﺍﻟﺩﻭﺍل ‪ function‬ﻭ ﺃل ‪ procedures‬ﻭ ﻜﺫﻟﻙ ﺍﻹﻋﻼﻥ ﻋﻥ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﻌﺎﻤﺔ‬

‫‪- ٨٥ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫‪ -٢‬ﺇﻨﺸﺎﺀ ﺠﺴﻡ ﺍﻟﺤﺯﻤﺔ ‪package body‬‬

‫ﻭ ﻓﻴﻪ ﻴﺘﻡ ﺇﻨﺸﺎﺀ ﺍﻟﺩﻭﺍل ﻭ ﺍﻟﺒﺭﺍﻤﺞ ﺍﻟﻔﺭﻋﻴﺔ ﺍﻟﺘﻲ ﺘﻡ ﺍﻹﻋﻼﻥ ﻋﻨﻬﺎ ﻓﻲ ﻗﺴﻡ ﺍﻟﺘﻌﺭﻴﻔﺎﺕ ﻭ ﺫﻟﻙ ﺒﻜﺘﺎﺒﻪ ﺃﻭﺍﻤﺭ ‪pl/sql‬‬ ‫ﺍﻟﺘﻲ ﺘﺤﻘﻕ ﺍﻟﻐﺭﺽ ﻤﻥ ﺍﻟﺩﻭﺍل‬ ‫ﻭ ﻟﺘﻭﻀﻴﺢ ﺫﻟﻙ ﺴﻭﻑ ﻨﻘﻭﻡ ﺒﻌﻤل ﻤﺜﺎل ﺒﺴﻴﻁ‬ ‫ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻴﻭﻀﺢ ﻜﻴﻔﻴﻪ ﺇﻨﺸﺎﺀ ‪ package‬ﺒﺴﻴﻁﺔ ﺒﻜﺘﺎﺒﻪ ﺍﻷﻭﺍﻤﺭ ﻓﻲ ﺒﻴﺌﺔ ﺃل ‪ sql plus‬ﻭ ﻴﺒﺩﺃ ﺫﻟﻙ ﺒﺈﻨﺸﺎﺀ ﺃل‬ ‫‪package specification‬‬

‫ﻭ ﺒﻬﺫﺍ ﺘﻡ ﺇﻨﺸﺎﺀ ﺃل ‪ package specification‬ﺒﺎﻻﺴﻡ ‪ simplepkg‬ﺒﻬﺎ ﺍﻹﻋﻼﻥ ﻋﻥ ﺍﻟﺩﻭﺍل ﻭ ﺍﻟﺴﻁﻭﺭ‬ ‫ﺍﻟﺘﺎﻟﻴﺔ ﺘﻘﻭﻡ ﺒﺈﻨﺸﺎﺀ ﺴﻁﻭﺭ )ﺠﺴﻡ( ﺍﻹﺠﺭﺍﺀ ﺍﻟﺴﺎﺒﻕ ‪package body‬‬

‫‪- ٨٦ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫ﺤﺫﻑ ﺃل ‪package‬‬ ‫ﻴﺘﻡ ﺇﻟﻐﺎﺀ ﺃل ‪package‬ﻋﻠﻰ ﺨﻁﻭﺘﻴﻥ‬ ‫ﺍﻷﻭﻟﻰ ‪ :‬ﺇﻟﻐﺎﺀ ﺃل ‪ package spec‬ﻭﺫﻟﻙ ﺒﺎﻟﺼﻴﻐﺔ ﺍﻟﺘﺎﻟﻴﺔ‬

‫;‪Drop package package_name‬‬ ‫ﻭ ﻓﻴﻪ ﻴﺘﻡ ﺍﺴﺘﻌﻤﺎل ﺍﻷﻤﺭ ‪ drop package‬ﺜﻡ ﺃل ‪ package name‬ﺍﻯ ﺍﺴﻡ ﺃل ‪package‬‬ ‫ﺍﻟﺜﺎﻨﻴﺔ ‪ :‬ﺤﺫﻑ ﺃل ‪package body‬‬ ‫ﻭ ﻴﺘﻡ ﺒﺎﺴﺘﻌﻤﺎل ﺍﻟﺼﻴﻐﺔ‬ ‫; ‪Drop package body package_name‬‬ ‫ﻓﻲ ﻫﺫﻩ ﺍﻟﺼﻴﻐﺔ ﻴﺘﻡ ﺍﺴﺘﻌﻤﺎل ﺍﻵﻤﺭ ‪ Drop Package body‬ﺜﻡ ﺃل ‪ package name‬ﺍﻯ ﺍﺴﻡ ﺃل‬ ‫‪ Package‬ﻭ ﺒﺎﻟﺘﺎﻟﻲ ﻴﺘﻡ ﺤﺫﻑ ﺇﻟﻰ ‪package body‬‬

‫ﺇﻋﺩﺍﺩ ﺃﻜﺜﺭ ﻤﻥ ﺩﺍﻟﻪ ﺒﻨﻔﺱ ﺍﻻﺴﻡ ‪overloading‬‬ ‫ﻤﻥ ﺍﻟﺨﺼﺎﺌﺹ ﺍﻟﻤﺘﺎﺤﺔ ﻋﻨﺩ ﺇﻨﺸﺎﺀ ﺍﻹﺠﺭﺍﺀﺍﺕ ‪ procedure‬ﺃﻭ ﺍﻟﺩﻭﺍل ‪ function‬ﺨﺎﺼﻴﺔ ﺘﺴﻤﻰ‬ ‫‪ overloading‬ﻭ ﻫﻲ ﻤﻥ ﺍﻟﺨﺼﺎﺌﺹ ﺍﻟﻤﺸﻬﻭﺭﺓ ﻓﻲ ﻟﻐﺎﺕ ﺍﻟﺒﺭﻤﺠﺔ ﻓﻲ ﻤﻔﻬﻭﻡ ‪oop‬‬ ‫) ‪ (object oriented programming‬ﻭ ﻤﻌﻨﺎﻩ ﺃﻤﻜﺎﻨﻴﻪ ﺇﻨﺸﺎﺀ ﺃﻜﺜﺭ ﻤﻥ ﺇﺠﺭﺍﺀ ‪ procedure‬ﺃﻭ ﺩﺍﻟﻪ‬ ‫‪ function‬ﺒﻨﻔﺱ ﺍﻻﺴﻡ ﺒﺸﺭﻁ ﺍﺨﺘﻼﻑ ﺍﻟﻤﻌﺎﻤﻼﺕ ﻭ ﻴﻔﻴﺩ ﺫﻟﻙ ﺒﺈﻨﺸﺎﺀ ﻜﺜﻴﺭ ﻤﻥ ﺍﻟﺩﻭﺍل ﺍﻟﺘﻲ ﺘﺅﺩﻯ ﺃﻏﺭﺍﺽ‬ ‫ﻤﺘﻘﺎﺭﺒﺔ ﺒﻨﻔﺱ ﺍﻻﺴﻡ‬ ‫ﻭ ﻟﺘﻭﻀﻴﺢ ﻜﻴﻔﻴﻪ ﺇﻨﺸﺎﺀ ﺃﻜﺜﺭ ﻤﻥ ﺩﺍﻟﻪ ﺒﻨﻔﺱ ﺍﻻﺴﻡ ﻭ ﻜﻴﻑ ﻴﺘﻡ ﺍﻟﺘﻔﺭﻗﺔ ﺒﻴﻨﻬﻡ ﻋﻨﺩ ﺍﻻﺴﺘﺩﻋﺎﺀ ﺘﺎﺒﻊ ﺍﻟﻤﺜﺎل ﺍﻟﺘﺎﻟﻲ ‪:‬‬ ‫ﺍ ‪ -‬ﺇﻨﺸﺎﺀ ﺘﻌﺭﻴﻑ ﺍﻟﺤﺯﻤﺔ‬

‫‪- ٨٧ -‬‬


‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫‪-٢‬‬

‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﺇﻨﺸﺎﺀ ﺠﺴﻡ ﺍﻟﺤﺯﻤﺔ‬

‫ﻓﻲ ﻫﺫﻩ ﺍﻟﺴﻁﻭﺭ ﻴﺘﻡ ﺇﻨﺸﺎﺀ ﺠﺴﻡ ﺍﻟﺤﺯﻤﺔ ﻭ ﺒﺎﻟﺘﺎﻟﻲ ﺇﻨﺸﺎﺀ ﺴﻁﻭﺭ ﺍﻟﺩﻭﺍل ﺍﻟﻤﻌﺭﻓﺔ ﻤﺴﺒﻘﺎ ﻓﻲ ﺠﺯﺀ ﺍﻟﺘﻌﺭﻴﻑ ﺤﻴﺙ‬ ‫ﻴﺘﻡ ﺇﻨﺸﺎﺀ ﺍﻟﺩﺍﻟﺔ )( ‪ TESTFUN‬ﺒﻤﻌﺎﻤل ﻭﺍﺤﺩ ﺘﻌﻴﺩ ﺍﻟﻌﺒﺎﺭﺓ ‪ VERSION 1‬ﻭ ﺍﻟﺩﺍﻟﺔ ﺍﻟﺜﺎﻨﻴﺔ‬ ‫)(‪ TESTFUNC‬ﺒﻤﻌﺎﻤﻠﻴﻥ ﺘﻌﻴﺩ ﺍﻟﻌﺒﺎﺭﺓ ‪VERSION 2‬‬ ‫ﻭ ﻟﺘﺠﺭﺒﻪ ﺍﺴﺘﺩﻋﺎﺀ ﻫﺫﻩ ﺍﻟﺩﻭﺍل ﺒﻌﺩ ﺇﻨﺸﺎﺌﻬﺎ ﻨﻘﻭﻡ ﺒﻌﻤل ﺍﻻﺘﻰ ‪:‬‬

‫‪- ٨٨ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫ﺇﻨﺸﺎﺀ ﺃل ‪one-time-only procedure‬‬

‫ﻭ ﻴﻌﺭﻑ ﺍﺘﻭﻤﺎﺘﻴﻜﻴﺎ ﻭ ﻴﻨﻔﺫ ﻤﺭﺓ ﻭﺍﺤﺩﺓ ﻓﻘﻁ ﻋﻨﺩﻤﺎ ﻨﻘﻭﻡ ﺒﺎﺴﺘﺭﺠﺎﻉ ﺤﺯﻤﺔ ﺍﻟﺒﺭﺍﻤﺞ ﺃﻭﻻ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻟﻤﺴﺘﺨﺩﻤﻴﻥ‬ ‫ﻓﻌﻠﻰ ﺴﺒﻴل ﺍﻟﻤﺜﺎل‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺍﻟﻘﻴﻤﺔ ﺍﻟﺤﺎﻟﻴﺔ ﻟﻠﻤﺘﻐﻴﺭ ‪ tax‬ﺘﻭﻀﻊ ﻜﺄﻨﻬﺎ ﻗﻴﻤﺔ ﻓﻲ ﺠﺩﻭل ﺃل ‪ tax_rates‬ﻓﻲ ﺃﻭل ﻤﺭﺓ ﻭ ﺍﻟﻤﺸﺎﺭ‬ ‫ﺇﻟﻴﻬﺎ ﻤﻥ ﻗﺒل ﺤﺯﻤﺔ ﺍﻟﺒﺭﺍﻤﺞ ‪taxes_package‬‬ ‫ﻭ ﻋﻨﺩﻤﺎ ﻨﻘﻭﻡ ﺒﻭﻀﻊ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻋﻠﻰ ﺍﻟﻌﺎﻡ ﺃﻭ ﺍﻟﺨﺎﺹ ﺍﺘﻭﻤﺎﺘﻴﻜﻴﺎ ﺒﺎﺴﺘﺨﺩﺍﻡ ‪one-time-only procedure‬‬ ‫ﻓﻌﻨﺩ ﺇﻨﺸﺎﺌﻬﺎ ﺘﻜﻭﻥ ﻤﻌﻘﺩﺓ ﺠﺩﺍ ﻭﺫﻟﻙ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺘﻠﻙ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻭ ﻓﻲ ﻫﺫﻩ ﺍﻟﺤﺎﻟﺔ ﻻﻴﺠﺏ ﺃﻥ ﻨﻀﻊ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﻓﻲ‬ ‫ﺠﺯﺀ ﺍﻟﺘﻌﺭﻴﻑ ﻻﻥ ﺍﻟﻘﻴﻡ ﻴﻌﺎﺩ ﻭﻀﻌﻬﺎ ﺍﺘﻭﻤﺎﺘﻴﻜﻴﺎ ﻓﻲ ﺤﺎﻟﻪ ‪one-time-only procedure‬‬

‫ﺍﻟﻘﻴﻭﺩ ﺍﻟﻼﺯﻤﺔ ﻟﻠﺩﻭﺍل ﺍﻟﻤﺴﺘﺨﺩﻤﺔ ﺏ ﺃل ‪ sql‬ﻓﻲ ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ‬ ‫ﻴﻘﻭﻡ ﺍﻻﻭﺭﺍﻜل ﺒﺘﻨﻔﻴﺫ ﺠﻤل ﺍﻻﺴﺘﻌﻼﻤﺎﺕ ﺍﻟﺘﻲ ﺘﺘﻁﻠﺒﻬﺎ ﺍﻟﺩﻭﺍل ﺍﻟﻤﺨﺯﻨﺔ ﻭ ﻫﻲ ﻴﺠﺏ ﺃﻥ ﺘﻌﺭﻑ ﻓﻲ ﺍﻟﺠﺯﺀ ﺍﻟﻐﻴﺭ‬ ‫ﻤﺅﺜﺭ ﺍﻟﺫﻱ ﻴﻘﻭﻡ ﺒﺘﻐﻴﻴﺭ ﺠﺩﺍﻭل ﻭ ﻤﺘﻐﻴﺭﺍﺕ ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ ﻓﻲ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫ﺃﻤﺎ ﻓﻲ ﺍﻟﺠﺯﺀ ﺍﻟﻤﺅﺜﺭ ﻗﺩ ﻴﺅﺠل ﻋﻤﻠﻴﻪ ﺘﻨﻔﻴﺫ ﺍﻻﺴﺘﻌﻼﻡ ﺍﻟﺫﻱ ﻴﺴﺘﺴﻠﻡ ﻟﻸﻤﺭ ﻭ ﻴﺅﺩﻯ ﺇﻟﻰ ﻨﺘﺎﺌﺞ ﻏﻴﺭ ﻤﻌﺭﻭﻓﺔ ﺃﻭ‬ ‫ﺘﺼﻠﻴﺢ ﺤﺎﻟﻪ ﻤﺘﻐﻴﺭﺍﺕ ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ ﻤﻥ ﻗﺒل ﺍﻟﻤﺴﺘﺨﺩﻡ‬ ‫ﻭ ﺇﻟﻴﻙ ﺒﻌﺽ ﺍﻟﻘﻴﻭﺩ ﺍﻟﺘﻲ ﻴﺠﺏ ﺃﻥ ﺘﻭﻀﻊ ﺃﻭ ﺘﻁﺒﻕ ﻋﻠﻰ ﺍﻟﺩﻭﺍل ﺍﻟﻤﺨﺯﻨﺔ ﺍﻟﺘﻲ ﺘﻨﺎﺩﻯ ﻋﻠﻰ ﻤﺘﻐﻴﺭﺍﺕ ﺃل ‪sql‬‬

‫‪- ٨٩ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺍﻟﺩﻭﺍل ﻴﺠﺏ ﺃﻥ ﻻ ﺘﻘﻭﻡ ﺒﻌﻤل ﺘﻌﺩﻴل ﻓﻲ ﺍﻟﺠﺩﺍﻭل ﺍﻟﻤﻭﺠﻭﺩﺓ ﻋﻠﻰ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻓﺈﺫﺍ ﻗﻤﺕ ﺒﺘﻌﺩﻴل‬ ‫·‬ ‫ﻓﺈﻨﻙ ﻻ ﻴﻤﻜﻨﻙ ﺃﻥ ﺘﻘﻭﻡ ﺒﻌﻤﻠﻴﺎﺕ ﺍﻟﺘﻌﺩﻴل ﻭ ﺍﻟﺤﺫﻑ ﻭ ﺍﻹﺩﺨﺎل‬ ‫ﺍﻟﺩﻭﺍل ﺍﻟﺘﻲ ﺘﻘﻭﻡ ﺒﻘﺭﺍﺀﺓ ﻭ ﻜﺘﺎﺒﻪ ﺍﻟﻘﻴﻡ ﻤﻥ ﻤﺘﻐﻴﺭﺍﺕ ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ ﻻ ﻴﻤﻜﻥ ﺃﻥ ﺘﻨﻔﺫ ﺒﻌﻴﺩﺍ‬ ‫·‬ ‫ﺍﻟﺩﻭﺍل ﺍﻟﺘﻲ ﺘﻨﻔﺫ ﺒﻭﺍﺴﻁﺔ ﺍﻟﻜﻠﻤﺎﺕ ‪ select , values ,set‬ﻴﻤﻜﻥ ﺃﻥ ﺘﻜﺘﺏ ﻓﻲ ﻗﻴﻡ ﻤﺘﻐﻴﺭﺍﺕ ﺤﺯﻡ‬ ‫·‬ ‫ﺍﻟﺒﺭﺍﻤﺞ‬ ‫ﻓﺤﺹ ﺍﻟﻘﻴﻭﺩ ﻓﻲ ﺃل ‪PARAGMA RESTRICT_REFERENCE pl/sql‬‬ ‫ﻴﻘﻭﻡ ﺍﻟﻤﺴﺘﺨﺩﻡ ﺒﺘﻌﺭﻴﻑ ﺍﻟﺩﺍﻟﺔ ﺍﻟﺘﻲ ﺘﻨﺎﺩﻯ ﻋﻠﻰ ﺠﻤﻠﻪ ﺃل ‪ SQL‬ﻓﺈﺫﺍ ﻜﺎﻥ ﺘﻡ ﻜﺴﺭ ﺍﻟﻘﻭﺍﻋﺩ ﺃﻡ ﻻ ﻭ ﺩﻭﺍل ﺤﺯﻡ‬ ‫ﺍﻟﺒﺭﺍﻤﺞ ﺘﺴﺘﺨﺩﻡ ‪ PARAGMA RESTRICT_REFERENCES‬ﻟﻌﻤل ﻓﺤﺹ ﺇﺫﺍ ﺘﻡ ﻜﺴﺭ ﺍﻟﻘﺎﻋﺩﺓ ﺃﻡ ﻻ‬

‫ﻭ ﻟﻨﻘﺎﺀ ﻤﺴﺘﻭﻴﺎﺕ ﺩﻭﺍل ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ‬ ‫ﻨﺴﺘﺨﺩﻡ ‪PARAGMA RESTRICT_REFERENCES‬‬

‫ﻭ ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻟﻸﻤﺭ ﻫﻲ‬ ‫‪PARAGMA RESTRICT_REFERENCES ( function name, WNDS ,‬‬ ‫]‪[,WNPS‬‬ ‫]‪[,RNDS‬‬ ‫;)]‪[,RNPS‬‬

‫‪ : WNDS‬ﺘﻌﻨﻰ ﺍﻨﻪ ﻟﻥ ﻴﻜﺘﺏ ﺍﻯ ﺤﺎﻟﻪ ﻓﻲ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻯ ﺇﻨﻨﺎ ﻻ ﻴﻤﻜﻨﻨﺎ ﺍﻟﺘﻐﻴﻴﺭ ﻓﻲ ﺠﺩﺍﻭل ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫ﻟﻠﺩﺍﻟﺔ‬ ‫‪ : WNPS‬ﺘﻌﻨﻰ ﺍﻨﻪ ﻟﻥ ﻴﻜﺘﺏ ﺍﻯ ﺤﺎﻟﻪ ﻓﻲ ﺤﺯﻤﺔ ﺍﻟﺒﺭﺍﻤﺞ ﻭﻻ ﻴﻤﻜﻨﻙ ﺍﻟﺘﻐﻴﻴﺭ ﻓﻲ ﻗﻴﻡ ﺍﻟﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ‬ ‫ﺤﺯﻤﺔ ﺍﻟﺒﺭﺍﻤﺞ ﻟﻠﺩﺍﻟﺔ‬ ‫‪ : RNDS‬ﺘﻌﻨﻰ ﺍﻨﻪ ﻟﻥ ﻴﻘﺭﺍ ﺍﻯ ﺤﺎﻟﻪ ﻓﻲ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻭ ﻟﻴﻤﻜﻨﻨﺎ ﺃﻥ ﻨﻘﻭﻡ ﺒﺎﻻﺴﺘﻌﻼﻡ ﻋﻥ ﺍﻯ ﺠﺩﻭل ﻓﻲ ﻗﺎﻋﺩﺓ‬ ‫ﺍﻟﺒﻴﺎﻨﺎﺕ ﻟﻠﺩﺍﻟﺔ‬ ‫‪ : RNPS‬ﺘﻌﻨﻰ ﺍﻨﻪ ﻟﻥ ﻴﻘﺭﺍ ﺍﻯ ﺤﺎﻟﻪ ﻓﻲ ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ ﻭ ﻻ ﻴﻤﻜﻥ ﺇﺭﺠﺎﻉ ﺍﻟﻘﻴﻡ ﻟﻠﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﻌﺎﻤﺔ ﻓﻲ ﺤﺯﻡ‬ ‫ﺍﻟﺒﺭﺍﻤﺞ ﻟﻠﺩﺍﻟﺔ‬ ‫ﺘﻌﻴﻴﻥ ﻤﺴﺘﻭﻯ ﺍﻟﻨﻘﺎﺀ ﻟﻠﺩﺍﻟﺔ ﻓﻲ ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ ﻋﻨﺩﻤﺎ ﻨﻘﻭﻡ ﺒﺈﻨﺸﺎﺀ ﺩﻭﺍل ﻓﻲ ﺤﺯﻤﺔ ﺒﺭﺍﻤﺞ‬ ‫ﻭ ﻴﺅﻜﺩ ﻤﺴﺘﻭﻯ ﺍﻟﻨﻘﺎﺀ ﻟﻠﺩﺍﻟﺔ ﻓﻲ ﺤﺯﻤﺔ ﺍﻟﺒﺭﺍﻤﺞ ﻤﺩﻯ ﺍﻟﺩﺍﻟﺔ ﺍﻟﺘﻲ ﺘﺴﻤﺢ ﻟﻌﻤﻠﻴﺎﺕ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫ﻭ ﻋﻨﺩﻤﺎ ﺘﻘﻭﻡ ﺒﺘﻌﻴﻴﻥ ﻤﺴﺘﻭﻯ ﺍﻟﻨﻘﺎﺀ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻟﻤﺤﻠل ﺃﻭ ﺍﻟﻤﺼﻨﻑ‬

‫‪- ٩٠ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫‪PRAGMA RESTRICT_REFERENCES‬‬

‫ﻓﺈﻥ ﺃل ‪ PRAGMA‬ﺘﻜﻠﻡ ﻤﺤﻠل ﺃل ‪ PL/SQL‬ﻟﻔﺭﺽ ﺩﺍﻟﻪ ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ ﺒﺎﻟﻘﺭﺍﺀﺓ ﺃﻭ ﺍﻟﻜﺘﺎﺒﺔ ﺇﻟﻰ ﺍﻟﻭﺼﻭل‬ ‫ﺇﻟﻰ ﺠﺩﻭل ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ‬ ‫ﻭ ﺇﺫﺍ ﻜﻨﺕ ﺘﺤﺎﻭل ﻓﻲ ﺘﺼﻨﻴﻑ ﺃﻭ ﺘﺤﻠﻴل ﺤﺴﻡ ﺍﻟﺩﺍﻟﺔ ‪ FUNCTION BODY‬ﻴﺅﺩﻯ ﺫﻟﻙ ﺇﻟﻰ ﺍﻨﺘﻬﺎﻙ ﺃل‬ ‫‪ PRAGMA‬ﻭ ﺘﻌﻁﻰ ﺨﻁﺄ‬ ‫ﺍﻻﻭﺭﺍﻜل ﻤﻤﻜﻥ ﺃﻥ ﻴﻔﺭﺽ ﻫﺫﻩ ﺍﻟﻘﻭﺍﻋﺩ ﺒﺎﻟﻔﺤﺹ ﻓﻲ ﺠﺴﻡ ﺍﻟﺩﺍﻟﺔ ﻋﻠﻰ ﺃﻴﻪ ﺤﺎل ﺠﺴﻡ ﺩﺍﻟﻪ ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ ﺘﺨﻔﻰ‬ ‫ﻭﻻ ﺘﺒﻘﻰ ﺇﻻ ﺍﻟﻤﻭﺍﺼﻔﺎﺕ ﺍﻟﻭﺤﻴﺩﺓ ﻭ ﺘﺒﻘﻰ ﻅﺎﻫﺭﺓ ﻟﺫﻟﻙ ﻴﺠﺏ ﻋﻠﻴﻙ ﺃﻥ ﺘﺴﺘﺨﺩﻡ ﻤﺤﻠل ‪ /‬ﻤﺼﻨﻑ‬ ‫‪ PRAGMA RESTRICT_REFERENCES‬ﻟﺩﻭﺍل ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ‬ ‫ﻤﺜﺎل‬

‫‪- ٩١ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻭ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻨﺠﺩ ﺃﻥ ﺍﻟﺩﺍﻟﺔ ﺘﻨﺎﺩﻯ ﻋﻠﻰ ﻋﺒﺎﺭﺍﺕ ﺃل ‪ sql‬ﻓﻲ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﺒﻌﻴﺩﺓ ﻟﺫﺍ ﺃﻨﺕ ﺘﺤﺘﺎﺝ ﺇﻟﻰ‬ ‫ﺍﻟﺘﺼﺭﻴﺢ ﻋﻠﻰ ﻨﻘﺎﺀ ﺍﻟﺩﺍﻟﺔ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻷﻤﺭ ‪ PRAGMA RESTRICT_REFERENCES‬ﺒﺎﺴﺘﺨﺩﺍﻡ‬ ‫ﺍﻟﻤﺴﺘﻭﻴﺎﺕ ‪ RNPS,WNPS,WNDS‬ﻻﻥ ﺍﻟﺩﺍﻟﺔ ﺍﻟﺒﻌﻴﺩﺓ ﻴﻤﻜﻥ ﺃﻥ ﻻ ﺘﻘﻭﻡ ﺒﻘﺭﺍﺀﺓ ﻭ ﻜﺘﺎﺒﺔ ﻤﺘﻐﻴﺭﺍﺕ ﺍﻟﺤﺯﻡ ﻭﻻ‬ ‫ﻓﻲ ﺠﺩﺍﻭل ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻋﻨﺩﻤﺎ ﻨﺴﺘﺩﻋﻰ ﻋﺒﺎﺭﺍﺕ ﺃل ‪ SQL‬ﻭ ﻟﻭ ﺃﻥ ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ ﺘﺤﺘﻭﻯ ﻋﻠﻰ ﻋﺩﺓ ﺩﻭﺍل‬ ‫ﺒﻨﻔﺱ ﺍﻻﺴﻡ ﺘﻘﻭﻡ ﺃل ‪ PRAGMA‬ﺒﺘﻁﺒﻴﻕ ﺁﺨﺭ ﺩﺍﻟﻪ‬ ‫ﻭ ﻴﻤﻜﻨﻨﺎ ﺇﺤﻀﺎﺭ ﺃﻭ ﺍﺴﺘﺭﺠﺎﻉ ﺩﻭﺍل ﺤﺯﻡ ﺍﻟﺒﺭﺍﻤﺞ ﻓﻲ ﺠﻤل ﺍﻻﺴﺘﻌﻼﻤﺎﺕ‬ ‫ﻜﻤﺎ ﺴﻨﺭﻯ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل‬

‫ﺍﻷﺤﺩﺍﺙ ﻋﻠﻰ ﻗﺎﻋﺩﺓ ﺍﻟﺒﻴﺎﻨﺎﺕ ‪:‬‬ ‫ﺗﺴﻤﻰ اﻷﺣﺪاث ﻋﻠﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﺑﺎﻻﺳﻢ ‪ Trigger‬وھﻲ ﻋﺒﺎرة ﻋﻦ ﺟﻤﻞ أل ‪ Pl/sql‬ﺗﻨﻔﺬ ﻣﻊ ﻋﻤﻠﯿﺎت أل‬ ‫‪ DML‬وﻋﻤﻠﯿﺎت أل ‪ DML‬ﻛﻤﺎ ﺗﻌﺮﻓﻨﺎ ﺳﺎﺑﻘﺎ ﻋﺒﺎرة ﻋﻦ )‪ (Insert,Update,Delete‬وﻧﻼﺣﻆ أن ھﺬه اﻟﺠﻤﻞ‬ ‫ﺗﻜﻮن ﻣﺮﺗﺒﻄﺔ ﺑﺎﻟﺠﺪاول أو أل ‪ View‬أو ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت‬ ‫وﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬه اﻟﺠﻤﻞ أو أل ‪ Trigger‬ﺑﺼﻮره ﺗﻠﻘﺎﺋﯿﺔ دون ﺗﺪﺧﻞ ﻣﻦ اﻟﻤﺒﺮﻣﺞ أو اﻟﻤﻨﺎداة ﻋﻠﯿﮭﺎ داﺧﻞ اﻟﻜﻮد‬ ‫اﻟﻤﻜﺘﻮب ﻣﺜﻞ اﻟﻤﻨﺎداة ﻋﻠﻰ أل ‪ Procedure‬أو أل ‪ Function‬داﺧﻞ اﻟﻜﻮد‬ ‫وﯾﻮﺟﺪ ﻧﻮﻋﺎن ﻣﻦ اﻷﺣﺪاث اﻟﺘﻲ ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ‪:‬‬ ‫‪:Application trigger-١‬‬ ‫وھﻲ ﻋﺒﺎرة ﻋﻦ ‪ Trigger‬ﯾﺘﻢ ﺗﻄﺒﯿﻘﮫ ﻋﻠﻰ ﺣﺪث ھﺬا اﻟﺤﺪث ﯾﺤﺘﻮي ﻋﻠﻰ ﺟﻤﻞ ‪ DML‬ﻣﻮﺟﻮدة ﻋﻠﻰ أل‬ ‫‪Application‬ﻣﺜﻞ أل‪Forms‬‬ ‫‪- ٩٢ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫‪:Database trigger -٢‬‬

‫ﯾﺘﻢ ﺗﻨﻔﯿﺬ أل ‪ Trigger‬ﻋﻠﻰ أﺣﺪاث أل ‪ DML‬اﻟﺘﻲ ﺗﺤﺪث ﻋﻠﻰ اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﺠﺪول ﻣﺜﻞ أﺿﺎﻓﮫ ﺻﻒ أو‬ ‫اﻟﺘﻌﺪﯾﻞ ﻓﻲ ﺻﻒ أو ﺣﺬف ﺻﻒ‬ ‫وﯾﺘﻢ أﯾﻀﺎ ﺗﻨﻔﯿﺬ ھﺬه اﻷﺣﺪاث أﯾﻀﺎ إذا ﺣﺪﺛﺖ أﺣﺪاث ﻣﻌﯿﻨﮫ ﻋﻠﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻣﺜﻞ اﻟﺪﺧﻮل ﻋﻠﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت‬ ‫)‪ (Logon‬أو )‪(Logoff‬‬ ‫وﯾﺘﻢ اﻟﺴﻤﺎح ﺑﺎﺳﺘﺨﺪام ﺟﻤﻞ أل ‪ DDL‬ﻣﻊ أل ‪ Trigger‬وال ‪ DDL‬ﻋﺒﺎرة ﻋﻦ ‪Create, Alter‬‬ ‫وﻟﻜﻦ اﻟﺴﺆال ھﻮ ‪:‬ﻣﺘﻰ ﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬه اﻷﺣﺪاث ؟‬ ‫ﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬه اﻷﺣﺪاث ﻛﯿﻔﻤﺎ ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺘﺤﺪﯾﺪ وﻗﺖ ﺣﺪوث اﻟﺤﺪث ﺣﯿﺚ اﻧﮫ ﯾﺘﻢ ﺗﺤﺪﯾﺪ ﻣﺎ إذا ﻛﺎﻧﺖ ھﺬه اﻟﺠﻤﻞ‬ ‫اﻟﺒﺮﻣﺠﯿﺔ اﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ ﺟﻤﻞ أل ‪ DML‬ﺗﻨﻔﺬ ﻗﺒﻞ أو ﺑﻌﺪ ھﺬه اﻷﺣﺪاث وﺳﻨﺘﻌﺮف اﻵن ﻋﻠﻰ ﺗﻮﻗﯿﺖ ﺣﺪوث‬ ‫اﻟﺤﺪث‪:‬‬ ‫‪ : After‬وﻣﻌﻨﺎھﺎ اﻧﮫ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﺤﺪث ﺑﻌﺪ ﻣﺜﻼ ﻋﻤﻠﯿﮫ اﻻﺿﺎﻓﮫ أو اﻟﺘﻌﺪﯾﻞ أو اﻟﺤﺬف ﻓﻲ اﻟﺠﺪول‬ ‫‪ :Before‬وﻣﻌﻨﺎھﺎ اﻧﮫ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﺤﺪث ﻗﺒﻞ ﺣﺪوث ﻋﻤﻠﯿﺎت أل ‪ DML‬ﻋﻠﻰ اﻟﺠﺪول ﻣﺜﻞ ﻗﺒﻞ اﻻﺿﺎﻓﮫ ﻓﻲ اﻟﺠﺪول‬ ‫أو ﻗﺒﻞ ﻋﻤﻞ ﺗﻌﺪﯾﻞ ﻓﻲ اﻟﺠﺪول أو ﻗﺒﻞ ﻋﻤﻞ ﺣﺬف ﻓﻲ اﻟﺠﺪول‬ ‫‪: Instead of-٣‬ﯾﺘﻢ اﺳﺘﺨﺪام ‪ Instead of‬وﻣﻌﻨﺎھﺎ ﺑﺪﻻ ﻣﻦ اﺣﺪ ﻋﻤﻠﯿﺎت ‪ DML‬ﻓﻲ اﻟﺠﺪول وﺗﺴﺘﺨﺪم ﻟﺘﺤﺴﯿﻦ‬ ‫ﻋﻤﻠﯿﺎت أل ‪ DML‬ﻓﻲ اﻟﺠﺪول وﯾﺘﻢ اﺳﺘﺨﺪاﻣﮭﺎ ﻣﻊ أل ‪ View‬ﻓﻘﻂ‬ ‫وﺳﯿﺘﻢ ﻻﺣﻘﺎ ﻣﻌﺮﻓﮫ ﻛﻞ ﻣﻦ ھﺬه اﻷﻧﻮاع ﺑﺎﻟﺘﻔﺼﯿﻞ‬ ‫وﻟﻜﻦ اﻟﺴﺆال ھﻮ ﻟﻤﺎذا ﻧﻘﻮم ﺑﺈﻧﺸﺎء ‪ Trigger‬؟‬ ‫‪-١‬ﯾﺘﻢ إﻧﺸﺎء ‪ Trigger‬إذا أردﻧﺎ ﺑﻌﺪ ﻋﻤﻠﯿﮫ ﻣﻌﯿﻨﮫ ﻣﺜﻞ اﻻﺿﺎﻓﮫ أو اﻟﺘﻌﺪﯾﻞ أو اﻟﺤﺬف ﻣﻦ اﻟﺠﺪول ﯾﺤﺪث ﺣﺪث‬ ‫ﻣﻌﯿﻦ وﻟﯿﻜﻦ ﻣﺜﻼ ﺣﺪث ﻋﻤﻞ ‪ Loop‬ﻋﻠﻰ اﻟﺼﻔﻮف داﺧﻞ اﻟﺠﺪول‬ ‫‪-٢‬ﻣﻦ اﻟﻤﻤﻜﻦ داﺧﻞ أل ‪ Trigger‬أن ﻧﻨﺎدي ﻋﻠﻰ ‪ Procedure‬أو ‪ Function‬ﺗﻢ ﺗﻜﻮﯾﻨﮭﻢ ﺳﺎﺑﻘﺎ ﻓﯿﺘﻢ اﻟﻤﻨﺎده ﻋﻠﯿﻢ‬ ‫داﺧﻞ أل ‪ Trigger‬وذﻟﻚ ﻟﻠﺘﺴﮭﯿﻞ ﺣﺘﻰ ﻻ ﯾﻜﻮن اﻟﻜﻮد ﻃﻮﯾﻞ‬ ‫واﻵن ﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ اﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﺘﻜﻮﯾﻦ أل ‪: Trigger‬‬ ‫اﺳﻢ أل ‪Create or replace trigger Trigger‬‬ ‫‪Timing event on table‬‬ ‫وﻗﺖ ﺗﻨﻔﯿﺬ اﻟﺤﺪث ‪ Timing‬واﻟﺤﺪث اﻟﻤﻄﻠﻮب ﺗﻨﻔﯿﺬ اﻟﺤﺪث إﻣﺎ ﻗﺒﻠﮫ أو ﺑﻌﺪه واﺳﻢ اﻟﺠﺪول اﻟﻤﺮاد ﺗﻨﻔﯿﺬ اﻟﺤﺪث‬ ‫ﻋﻠﯿﮫ‬ ‫ﻛﻮد ‪Trigger body Pl/sql‬‬

‫وﺑﮭﺬا ﻧﻜﻮن ﻗﺪ ﺗﻌﺮﻓﻨﺎ ﻋﻠﻰ ﻣﺎھﻮ اﻟﺤﺪث وﻛﯿﻔﯿﮫ ﻋﻤﻠﮫ وﻣﻢ ﯾﺘﻜﻮن‬

‫‪- ٩٣ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻭﺍﻵﻥ ﺴﻨﺘﻌﺭﻑ ﻋﻠﻰ ﺃﻟﻴﻪ ﻋﻤل ﺃل ‪Trigger‬‬ ‫ﻴﻭﺠﺩ ﺃﻨﻭﺍﻉ ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺃل ‪ Trigger‬ﻋﻠﻴﻬﺎ ‪:‬‬ ‫‪- ١‬ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺃل‬

‫‪ Trigger‬ﻋﻠﻰ ﺃل ‪:Statement‬‬

‫ﻭﻤﻌﻨﻰ ﺃل ‪ Statement‬ﻫﻲ ﺍﻨﻪ ﻻﻴﻭﺠﺩ ﺼﻔﻭﻑ ﺘﺘﺄﺜﺭ ﺒﺎل ‪ Trigger‬ﺤﻴﺙ ﺃﻥ ﺍﻻﻤﺜﻠﻪ ﺍﻟﺴﺎﺒﻘﺔ ﻻ ﺘﻌﺘﻤﺩ ﻋﻠﻰ‬ ‫ﺍﻟﺼﻔﻭﻑ ﻭﻟﻜﻥ ﺘﻌﺘﻤﺩ ﻋﻠﻰ ﺃل ‪ Statement‬ﺤﻴﺙ ﺍﻨﻪ ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ ﻓﻲ ‪ trigger body‬ﻤﺭﻩ ﻭﺍﺤﺩﻩ‬ ‫ﻓﻘﻁ ﻭﻻ ﻴﺘﻡ ﺘﻜﺭﺍﺭﻩ‬ ‫‪- ٢‬ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺃل ‪ Trigger‬ﻋﻠﻰ ﺍﻟﺼﻑ‪: Row‬‬ ‫ﻭﻤﻌﻨﻰ ﻫﺫﺍ ﺍﻨﻪ ﺘﻭﺠﺩ ﺼﻔﻭﻑ ﺘﺘﺄﺜﺭ ﺒﺎل ‪ Trigger‬ﻭﻴﺘﻡ ﺘﻜﺭﺍﺭ ﺍﻟﻜﻭﺩ ﺍﻟﻤﻜﺘﻭﺏ ﺩﺍﺨل ﺃل ‪ Trigger body‬ﻋﻠﻰ‬ ‫ﻜل ﺼﻑ ﻤﻥ ﺍﻟﺼﻔﻭﻑ‬ ‫ﻭﻜﺘﺎﺒﻪ ﺃل ‪ Trigger‬ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺍﻟﺼﻑ ﺘﺨﺘﻠﻑ ﻋﻥ ﻜﺘﺎﺒﻪ ﺃل‪ Trigger‬ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺃل ‪ Statement‬ﻭﻟﻜﻥ‬ ‫ﺍﻻﺨﺘﻼﻑ ﻴﻜﻭﻥ ﺒﺴﻴﻁ‬ ‫ﻭﺴﻨﺭﻯ ﻫﺫﺍ ﺍﻻﺨﺘﻼﻑ ﻓﻲ ﺍﻻﻤﺜﻠﻪ ﺍﻟﺘﻲ ﺴﻴﺘﻡ ﺫﻜﺭﻫﺎ ﻻﺤﻘﺎ‬ ‫ﻭﻟﻜﻥ ﻻﺒﺩ ﺃﻥ ﻨﻌﺭﻑ ﻜﻴﻑ ﻴﺘﻡ ﺘﺴﻠﺴل ﺘﻨﻔﻴﺫ ﺍﻷﺤﺩﺍﺙ ﺩﺍﺨل ﺍﻟﻜﻭﺩ؟‬ ‫ﻴﺘﻡ ﺍﻟﺘﺴﻠﺴل ﻜﺎﻵﺘﻲ‪:‬‬ ‫ﻗﺒل ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻲ ﻴﻨﻔﺫ ﻋﻠﻴﻬﺎ ﺃل ‪1- Before statement trigger‬‬ ‫ﻗﺒل ﺍﻟﺼﻑ ﺍﻟﺫﻱ ﻴﻨﻔﺫ ﻋﻠﻴﻪ ﺃل ‪2-Before row trigger Trigger‬‬ ‫ﺒﻌﺩ ﺍﻟﺼﻑ ﺍﻟﺫﻱ ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺃل ‪3-after row trigger trigger‬‬ ‫ﺒﻌﺩ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻲ ﻴﻨﻔﺫ ﻋﻠﻴﻬﺎ ﺃل ‪4-After statement trigger‬‬

‫ﻭﻫﺫﻩ ﻫﻲ ﺍﻻﻟﻴﻪ ﺍﻟﺘﻲ ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺃل ‪Trigger‬ﺒﻬﺎ‬

‫ﻭﺴﻨﻘﻭﻡ ﺍﻵﻥ ﺒﺈﻋﻁﺎﺀ ﺃﻤﺜﻠﻪ ل ‪ Trigger‬ﺍﻟﺘﻲ ﺘﻨﻔﺫ ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺃل ‪Statement‬‬ ‫ﺃﻭﻻ‪:‬ﺘﻨﻔﻴﺫ ﺃل ‪ Trigger‬ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺃل ‪Statement‬‬

‫ﻨﻀﻴﻑ ﺃﻭﻻ ﺼﻑ ﺇﻟﻰ ﺍﻟﺠﺩﻭل ﻜﻤﺎ ﺴﻨﺭﻯ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل‪:‬‬

‫‪- ٩٤ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻤﺜﺎل‪:‬‬

‫ﻋﻨﺩ ﻋﻤل ﺃﻭﻻ ‪ Insert‬ﻓﻲ ﺍﻟﺠﺩﻭل ﻭﺒﺎﻟﺘﺎﻟﻲ ﺘﻤﺕ ﺃﻀﺎﻓﻪ ﺍﻟﺼﻑ ﻓﻲ ﺍﻟﺠﺩﻭل ﻭﻋﻠﻰ ﻫﺫﻩ ﺍﻻﻀﺎﻓﻪ ﺴﻴﺘﻡ ﺘﻭﻀﻴﺢ‬ ‫ﺇﻟﻴﻪ ﻋﻤل ﺃل ‪ Trigger‬ﻋﻠﻰ ﻫﺫﺍ ﺍﻟﺼﻑ‬ ‫ﻴﺒﻴﻥ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻜﻴﻔﻴﻪ ﺘﻨﻔﻴﺫ ﺃل ‪ Trigger‬ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺍﻟﺠﻤﻠﺔ ﺍﻟﺘﻲ ﺘﺘﺄﺜﺭ ﺏ ‪ Trigger‬ﻤﻌﻴﻥ ﺘﻡ ﺘﻜﻭﻴﻨﻪ ﺴﺎﺒﻘﺎ‬ ‫ﻓﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺃل ‪ Trigger‬ﺃﻭﻻ ﻋﻠﻰ ﺃل ﺠﻤﻠﻪ ﺜﻡ ﺜﺎﻨﻴﺎ ﻋﻠﻰ ﺍﻟﺼﻑ ﺍﻟﺫﻱ ﻴﺘﺄﺜﺭ ﺒﺎل ‪ Trigger‬ﻜﻤﺎ ﻫﻭ ﻤﻭﻀﺢ‬ ‫ﺒﺎﻟﺸﻜل‬ ‫ﻭﺴﻨﺘﻌﺭﻑ ﻓﻴﻤﺎ ﻴﻠﻲ ﻋﻠﻰ ﻜﻴﻔﻴﻪ ﺘﻜﻭﻴﻥ ‪Trigger‬‬ ‫ﻤﺜﺎل ‪:‬‬

‫‪- ٩٥ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻜﻭﻴﻥ ‪ Trigger‬ﻴﺴﻤﻰ ‪ Agc2‬ﻫﺫﺍ ﺃل‪ Trigger‬ﻴﺘﻡ ﺘﻨﻔﻴﺫﻩ ﻫﺫﺍ ﺍﻟﺤﺩﺙ ﻗﺒل ﻋﻤل ﺃﻱ ﺘﻌﺩﻴل‬ ‫ﻓﻲ ﺍﻟﺠﺩﻭل ﻭﻫﺫﺍ ﻴﺴﻤﻰ ﺒﻭﻗﺕ ﺍﻟﺤﺩﺙ ﻭﺍﻟﺤﺩﺙ ﺍﻟﺫﻱ ﻴﺤﺩﺙ ﻋﻨﺩﻩ ﺘﻨﻔﻴﺫ ﺃل ‪ Trigger‬ﻓﻌﻨﺩ ﺤﺩﻭﺙ ﺃﻱ ﺘﻌﺩﻴل ﻓﻲ‬ ‫ﺍﻟﺠﺩﻭل ﻴﻘﻭﻡ ﺃﻭﻻ ﺒﺘﻨﻔﻴﺫ ﺠﻤﻠﻪ ﺃل ‪ Insert‬ﻋﻠﻰ ﺍﻟﺠﺩﻭل‬ ‫ﻭﻟﻠﺘﺄﻜﺩ ﻤﻥ ﻋﻤل ﺃل ‪ Trigger‬ﻨﺘﺒﻊ ﺍﻵﺘﻲ‪:‬‬

‫‪- ٩٦ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻨﻜﺘﺏ ﺠﻤﻠﻪ ‪ Update‬ﻭﻤﻌﻨﺎﻫﺎ ﺍﻟﺘﻌﺩﻴل ﻓﻲ ﺍﻟﺠﺩﻭل ﺒﺠﻌل ﺃﺭﻗﺎﻡ ﺍﻟﻁﻼﺏ ﺍﻟﻠﺫﻴﻥ ﺃﺴﻤﺎﺅﻫﻡ ﺍﺤﻤﺩ=‪٦‬‬ ‫ﺍﻟﻤﻔﺭﻭﺽ ﺍﻨﻪ ﺤﺴﺏ ﺃل ‪ Trigger‬ﺍﻟﻤﻜﺘﻭﺏ ﺍﻨﻪ ﻴﻜﻭﻥ ﻗﺩ ﺘﻤﺕ ﺍﻻﻀﺎﻓﻪ ﺃﻭﻻ ﻓﻲ ﺍﻟﺠﺩﻭل ﻗﺒل ﻋﻤل ﺍﻟﺘﻌﺩﻴل ﻓﻲ‬ ‫ﺍﻟﺠﺩﻭل ﻭﻟﻨﺘﺄﻜﺩ ﻤﻥ ﺫﻟﻙ‪:‬‬

‫‪- ٩٧ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺒﺎﻟﻔﻌل ﺘﻤﺕ ﺍﻻﻀﺎﻓﻪ ﻓﻲ ﺍﻟﺠﺩﻭل ﺃﻭﻻ ﻗﺒل ﻋﻤل ﺍﻟﺘﻌﺩﻴل ﻜﻤﺎ ﻫﻭ ﺒﺎﻴﻥ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻭﺒﻌﺩ ﺫﻟﻙ ﺤﺩﺙ ﺍﻟﺘﻌﺩﻴل‬ ‫ﻤﻥ ﺍﻟﻤﻤﻜﻥ ﺩﺍﺨل ﺃل ‪ Trigger‬ﺃﻥ ﻴﺤﺩﺙ ﺘﺩﺍﺨل ﺒﻴﻥ ﻤﺠﻤﻭﻋﻪ ﻤﻥ ﺍﻷﺤﺩﺍﺙ ﻤﺜل ﺍﻻﻀﺎﻓﻪ ﻭﺍﻟﺘﻌﺩﻴل ﻭﺍﻟﺤﺫﻑ‬ ‫ﻤﺜﺎل ﻴﺒﻴﻥ ﺍﻟﺘﺩﺍﺨل ﺒﻴﻥ ﺍﻷﺤﺩﺍﺙ‪:‬‬

‫‪- ٩٨ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻜﻭﻴﻥ ‪Trigger‬ﺠﺩﻴﺩ ﻴﺴﻤﻰ ‪ AGC‬ﻫﺫﺍ ﺍﻟﺤﺩﺙ ﻴﺘﻡ ﺘﻨﻔﻴﺫﻩ ﻗﺒل ﻋﻤل ﺃﻀﺎﻓﻪ ﺃﻭ ﺘﻌﺩﻴل ﺃﻭ ﺤﺫﻑ‬ ‫ﻓﻲ ﺍﻟﺠﺩﻭل ﺜﻡ ﺇﺫﺍ ﻜﺎﻥ ﺘﺎﺭﻴﺦ ﺍﻟﻴﻭﻡ ﻭﻫﻭ ‪Sysdate‬ﺒﻴﻥ ﻫﺫﻴﻥ ﺍﻟﺘﺎﺭﻴﺨﻴﻥ ﻓﻠﻭ ﺤﺩﺙ ﺃﻀﺎﻓﻪ ﻴﻅﻬﺭ ﻫﺫﺍ ﺍﻟﺨﻁﺄ ﻭﺇﺫﺍ‬ ‫ﺤﺩﺙ ﺘﻌﺩﻴل ﻴﺤﺩﺙ ﻫﺫﺍ ﺍﻟﺨﻁﺄ ﻭﺇﺫﺍ ﺤﺩﺙ ﺤﺫﻑ ﻴﺤﺩﺙ ﻫﺫﺍ ﺍﻟﺨﻁﺄ ﻭﺇﻻ ﻴﺤﺩﺙ ﺨﻁﺄ ﺁﺨﺭ ﻭﻫﺫﺍ ﻴﺒﻴﻥ ﺍﻟﺘﺩﺍﺨل ﺒﻴﻥ‬ ‫ﺠﻤل ﺃل‬ ‫‪DML‬‬ ‫ﻭﺒﻬﺫﺍ ﻨﻜﻭﻥ ﻗﺩ ﺍﻨﺘﻬﻴﻨﺎ ﻤﻥ ﺘﻁﺒﻴﻕ ﺃل ‪ Trigger‬ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺃل ‪Statement‬‬ ‫ﺜﺎﻨﻴﺎ ‪ :‬ﺘﻜﻭﻴﻥ ‪ Trigger‬ﻭﻟﻜﻥ ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺍﻟﺼﻑ ‪:Row‬‬ ‫ﺍﻟﺼﻴﻐﺔ ﺍﻟﻌﺎﻤﺔ ﻟﻬﺎ ﻫﻲ‪:‬‬ ‫ﺍﺴﻡ ﺃل ‪Create or replace trigger Trigger‬‬ ‫ﺃﻤﺭ ﺘﻜﻭﻴﻥ ‪Trigger‬‬ ‫‪Timing‬‬ ‫ﻭﻗﺕ ﺤﺩﻭﺙ ﺍﻟﺤﺩﺙ‬ ‫‪Event on table‬‬ ‫‪- ٩٩ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫)‪(reference old as old/new as new‬‬ ‫ﺍﻷﺤﺩﺍﺙ ﺍﻟﺘﻲ ﺘﺘﻡ ﻋﻠﻰ ﺴﻭﺍﺀ ﺍﻻﻀﺎﻓﻪ ﺃﻭ ﺍﻟﺤﺫﻑ ﺃﻭ ﺍﻟﺘﻌﺩﻴل ﻓﻲ ﺍﻟﺠﺩﻭل ﻭﻴﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ‪ Reference‬ﻹﻋﻁﺎﺀ‬ ‫ﺃﺴﻤﺎﺀ ﻟﻠﻘﻴﻡ ﺍﻟﻘﺩﻴﻤﺔ ﻭﺍﻟﻘﻴﻡ ﺍﻟﺠﺩﻴﺩﺓ ﺍﻟﻤﺭﺍﺩ ﺍﺴﺘﺨﺩﺍﻤﻬﺎ‬ ‫‪For each row‬‬ ‫ﻟﻜل ﺼﻑ ﻤﻥ ﺼﻔﻭﻑ ﺍﻟﺠﺩﻭل‬ ‫)‪When(condition‬‬ ‫ﺃﻱ ﻻ ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺃل ‪ Trigger‬ﺇﻻ ﺇﺫﺍ ﺘﻡ ﻫﺫﺍ ﺍﻟﺸﺭﻁ‬

‫‪:‬ﺍﻟﻘﺩﻴﻤﺔ ﻭﺍﻟﺠﺩﻴﺩﺓ ﺒﺎﻟﻨﺴﺒﺔ ﻟﻠﺘﻌﺎﻤل ﻤﻊ ﺍﻟﻘﻴﻡ‬ ‫ﻓﻲ ﺤﺎﻟﻪ ﺇﻨﺸﺎﺀ ﺃﺤﺩﺍﺙ ﺨﺎﺼﺔ ﺒﻌﻤﻠﻴﻪ ﺍﻟﺤﺫﻑ ﺃﻭ ﺍﻟﺘﻌﺩﻴل ﻓﺎﻨﻪ ﻗﺩ ﺘﺤﺘﺎﺝ ﺇﻟﻰ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻟﻘﻴﻡ ﺍﻟﻘﺩﻴﻤﺔ ﻗﺒل ﺇﻟﻐﺎﺌﻬﺎ‬ ‫ﺃﻭ ﻗﺒل ﺍﻟﺘﻌﺩﻴل ﻓﻴﻬﺎ ﻭﺫﻟﻙ ﻴﺘﻡ ﺒﺎﺴﺘﺨﺩﺍﻡ ﺍﻟﻜﻠﻤﺘﺎﻥ ‪ Old‬ﺃﻭ ‪New‬‬

‫ﻨﻼﺤﻅ ﺍﻨﻪ ﺒﺎﻟﻨﺴﺒﺔ ﻟل ‪ Trigger‬ﺍﻟﺘﻲ ﺘﻨﻔﺫ ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺍﻟﺼﻑ ﻫﻲ ﺍﻟﺘﻲ ﻴﻤﻜﻥ ﺃﻥ ﻴﺄﺘﻲ ﻤﻌﻬﺎ ﺃل ﻗﻴﻡ ﺍﻟﻘﺩﻴﻤﺔ‬ ‫‪ Old‬ﻭﺍﻟﻘﻴﻡ ﺍﻟﺠﺩﻴﺩﺓ‪New‬‬ ‫ﻭﻻ ﻴﺼﺢ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻜﻠﻤﺔ ‪ old‬ﺃﻭ ﺍﻟﻜﻠﻤﺔ ‪ new‬ﻋﻨﺩﻤﺎ ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﺃل ‪ Trigger‬ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺍﻟﺠﻤل‪Statement‬‬

‫ﻤﺜﺎل‪:‬‬

‫‪- ١٠٠ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﻫﻭ ﻤﺜﺎل ﻟﺘﻁﺒﻴﻕ ﺃل ‪ Trigger‬ﻋﻠﻰ ﺍﻟﺼﻑ ﺤﻴﺙ ﺃﻥ ﺍﻟﺠﻤﻠﺔ ‪ For each row‬ﻤﻌﻨﺎﻫﺎ ﺃﻥ ﺃل‬ ‫‪ Trigger‬ﻴﺘﻡ ﺘﻨﻔﻴﺫﻩ ﻋﻠﻰ ﻜل ﺼﻑ ﻤﻥ ﺍﻟﺼﻔﻭﻑ ﻓﻲ ﺍﻟﺠﺩﻭل ﺜﻡ ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺠﻤﻠﻪ ﺸﺭﻁﻴﻪ ﻭﻫﻲ ‪When‬‬ ‫ﻭﺍﻟﻬﺩﻑ ﻤﻥ ﺍﺴﺘﺨﺩﺍﻡ ﻫﺫﻩ ﺍﻟﺠﻤﻠﺔ ﺍﻨﻪ ﻻ ﻴﺘﻡ ﺘﺸﻐﻴل ﻫﺫﺍ ﺃل ‪ Trigger‬ﺇﻻ ﺇﺫﺍ ﺘﻡ ﺘﻨﻔﻴﺫ ﻫﺫﺍ ﺍﻟﺸﺭﻁ ﺃﻭﻻ ﻭﻫﻭ ﺃﻥ‬ ‫ﻴﻜﻭﻥ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ ﺍﻟﻘﺩﻴﻡ‬ ‫= ‪ ١‬ﻭﻫﺫﻩ ﺘﺴﻤﻰ ﺍﻟﻘﻴﻭﺩ ﻋﻠﻰ ﺃل ‪ Trigger‬ﺜﻡ ﺘﻤﺕ ﻜﺘﺎﺒﻪ ﻜﻭﺩ ﺩﺍﺨل ﺃل ‪ Begin‬ﻫﺫﺍ ﺍﻟﻜﻭﺩ ﻤﻌﻨﺎﻩ ﺍﻨﻪ ﻟﻭ ﺭﻗﻡ‬ ‫ﺍﻟﻁﺎﻟﺏ ﺍﻟﻘﺩﻴﻡ =‪ ٣‬ﻭﻨﻼﺤﻅ ﺍﻨﻪ ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻌﻼﻤﺔ ‪ :‬ﻷﻨﻪ ﺘﻡ ﺘﻌﺭﻴﻑ ﺍﻟﻤﺘﻐﻴﺭ ﻓﻲ ﺍﻟﺨﺎﺭﺝ ﻓﻴﻌﺘﺒﺭ ﺍﻟﻤﺘﻐﻴﺭ ﺍﻨﻪ‬ ‫‪ Host variable‬ﻓﺎﺩﺍ ﺘﺤﻘﻕ ﻫﺫﺍ ﺍﻟﺸﺭﻁ‬ ‫ﻴﺠﻌل ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ ﺍﻟﺠﺩﻴﺩ =‪ ٣٢٠‬ﻭﺇﻻ ﺇﺫﺍ ﻟﻡ ﻴﺘﺤﻘﻕ ﻫﺫﺍ ﺍﻟﺸﺭﻁ ﻴﻜﻭﻥ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ = ‪٣١٠‬‬

‫ﻭﻨﻼﺤﻅ ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺍﻨﻪ ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﻜﻼ ﻤﻥ ﺍﻟﻜﻠﻤﺘﻴﻥ ‪ New, Old‬ﻭﺃﻴﻀﺎ ﺘﻡ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﺸﺭﻁ ‪ When‬ﻟﺘﻨﻔﻴﺫ‬ ‫ﻫﺫﺍ ﺍﻟﺤﺩﺙ‬ ‫ﻤﺜﺎل ﺁﺨﺭ ﻴﺒﻴﻥ ﻜﻴﻔﻴﻪ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻟﻘﻴﻡ ﺍﻟﻘﺩﻴﻤﺔ ﻭﺍﻟﺠﺩﻴﺩﺓ‪:‬‬

‫ﻓﻲ ﻫﺫﺍ ﺍﻟﻤﺜﺎل ﺘﻡ ﺘﻜﻭﻴﻥ‪ Trigger‬ﺍﺴﻤﻪ ‪ agc3‬ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﻫﺫﺍ ﺃل ‪ Trigger‬ﻗﺒل ﻋﻤل ‪ Insert‬ﻓﻲ ﺍﻟﺠﺩﻭل ﻭﻴﺘﻡ‬ ‫ﺘﻨﻔﻴﺫ ﻫﺫﺍ ﺃل‪ Trigger‬ﻋﻠﻰ ﻜل ﺼﻑ ﻤﻭﺠﻭﺩ ﻓﻲ ﺍﻟﺠﺩﻭل ﻭﻟﻜﻥ ﻴﺘﻡ ﺘﻨﻔﻴﺫ ﻫﺫﺍ ﺃل ‪ Trigger‬ﺇﺫﺍ ﺘﺤﻘﻕ ﻫﺫﺍ‬ ‫ﺍﻟﺸﺭﻁ ﻭﻫﻭ ﺃﻥ ﻴﻜﻭﻥ ﺭﻗﻡ ﺍﻟﻁﺎﻟﺏ=‪ ١‬ﺜﻡ ﺘﻡ ﻜﺘﺎﺒﻪ ﺍﻟﻜﻭﺩ ﻭﻤﻌﻨﺎﻩ ﺇﺫﺍ ﺤﺩﺙ ﺃﻀﺎﻓﻪ ﻓﻲ ﺍﻟﺠﺩﻭل ﻴﻜﻭﻥ ﺭﻗﻡ ﺍﻟﺩﻭﺭﺓ‬ ‫ﺍﻟﺠﺩﻴﺩ =‪ ٣٢٠‬ﻭﺇﻻ ﻴﻜﻭﻥ ﺜﻤﻥ ﺍﻟﺩﻭﺭﺓ ﺍﻟﺠﺩﻴﺩ = ‪٣١٠‬‬

‫ﻭﺒﻬﺫﺍ ﻨﻜﻭﻥ ﻗﺩ ﺘﻌﺭﻓﻨﺎ ﻋﻠﻰ ﻜﻴﻔﻴﻪ ﺘﻜﻭﻴﻥ ‪ Trigger‬ﺒﺎﻟﻨﺴﺒﺔ ﻟﻠﺼﻑ ﻭﺒﺎﻟﻨﺴﺒﺔ ﻟﻠﺠﻤل ﻜﻠﻬﺎ‬ ‫‪- ١٠١ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫ﻭﻜﻴﻔﻴﻪ ﺍﺴﺘﺨﺩﺍﻡ ﺍﻟﻘﻴﻡ ﺍﻟﻘﺩﻴﻤﺔ ﻭﺍﻟﻘﻴﻡ ﺍﻟﺠﺩﻴﺩﺓ ﺩﺍﺨل ﺃل ‪Trigger‬‬

‫ﻓﻲ ﻜل ﺍﻻﻤﺜﻠﻪ ﺍﻟﺴﺎﺒﻘﺔ ﺘﻡ ﺍﻟﺘﻌﺎﻤل ﻤﻊ ﺍﻟﺠﺩﺍﻭل ﻭﺘﻜﻭﻴﻥ ‪ Triggers‬ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺍﻟﺠﺩﺍﻭل ﻓﻘﻁ ﻭﻟﻜﻥ‬ ‫ﻫل ﺃل ‪ Trigger‬ﻋﻠﻰ ﻤﺴﺘﻭﻯ ﺃل ‪ View‬ﻤﺨﺘﻠﻔﺔ ﻋﻥ ﺘﻜﻭﻴﻥ ‪ Trigger‬ﺒﺎﻟﻨﺴﺒﺔ ل‪Table‬؟‬ ‫ﺍ ﻓﺭﻀﻨﺎ ﺃﻥ ﻫﺫﺍ ﺃل‪ view‬ﻴﺄﺨﺫ ﺒﻴﺎﻨﺎﺘﻪ ﻤﻥ ﺠﺩﻭﻟﻴﻥ ﻤﺨﺘﻠﻔﻴﻥ ﻓﻌﻨﺩ ﻋﻤل ﺘﻌﺩﻴل ﻓﻲ ﺠﺩﻭل ﻤﻌﻴﻥ ﻓﺎﻥ ﺍﻟﺠﺩﻭل‬ ‫ﻴﻘﻭﻡ ﺒﺎﻟﺘﻌﺩﻴل ﻓﻲ ﺠﺩﻭل ﻭﻓﻲ ﺍﻷﺨﺭ ﻴﻘﻭﻡ ﺒﻌﻤل ‪Insert‬ﻓﻴﻪ ﻭﻫﺫﺍ ﻴﺅﺩﻱ ﺇﻟﻰ ﺤﺩﻭﺙ ﺨﻁﺎ ﻟﺫﻟﻙ ﻴﺘﻡ ﻓﻲ ﺤﺎﻟﻪ ﺃل‬ ‫‪ View‬ﺍﺴﺘﺨﺩﺍﻡ ‪ Instead of‬ﺍﻟﺘﻲ ﺘﻤﻜﻥ ﺃل ‪ view‬ﻤﻥ ﻋﻤل ‪ Insert‬ﺩﻭﻥ ﺤﺩﻭﺙ ﻤﺸﺎﻜل‬ ‫ﻭﺒﺎﻟﺘﺎﻟﻲ ﻓﺎﻥ ﺃل‪ Trigger‬ﻴﻜﻭﻥ ﻤﺨﺘﻠﻑ ﻋﻥ ﺃل‪ Trigger‬ﺍﻟﺴﺎﺒﻕ ﺍﻟﻤﺴﺘﺨﺩﻡ ﺒﺎﻟﻨﺴﺒﺔ ﻟﻠﺠﺩﺍﻭل‬ ‫ﻭﺍﻵﻥ ﺴﻴﺘﻡ ﺘﻭﻀﻴﺢ ﻤﺜﺎل ﻴﺒﻴﻥ ﻜﻴﻔﻴﻪ ﺍﺴﺘﺨﺩﺍﻡ ‪Instead of‬‬ ‫ﺃﻭﻻ ‪:‬ﻨﻘﻭﻡ ﺒﺈﻨﺸﺎﺀ ‪: View‬‬

‫ﺘﻡ ﺇﻨﺸﺎﺀ ‪ View‬ﺒﺎﺴﻡ ‪ Ihab‬ﻭﺘﻡ ﻭﻀﻊ ﺒﺩﺍﺨﻠﻪ ﺍﻟﺒﻴﺎﻨﺎﺕ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺍﻟﺠﺩﻭﻟﻴﻥ ﺍﻟﻁﻼﺏ ﻭﺠﺩﻭل ﺍﻟﺩﻭﺭﺍﺕ‬ ‫ﺍﻟﺩﺭﺍﺴﻴﺔ‬

‫ﺜﺎﻨﻴﺎ‪:‬ﺇﻅﻬﺎﺭ ﺒﻴﺎﻨﺎﺕ ﺃل ‪View‬‬

‫‪- ١٠٢ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻹﻅﻬﺎﺭ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻓﻲ ﺃل‪View‬‬

‫ﺜﺎﻟﺜﺎ ‪:‬ﻋﻨﺩ ﻋﻤل ‪ Insert‬ﺩﺍﺨل ﺃل‪View‬‬

‫‪- ١٠٣ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﻋﻨﺩ ﺍﻻﻀﺎﻓﻪ ﺩﺍﺨل ﺃل ‪ View‬ﺘﻡ ﺤﺩﻭﺙ ﺨﻁﺎ ﻻﻥ ﺃل ‪ View‬ﻴﺄﺨﺫ ﺍﻟﺒﻴﺎﻨﺎﺕ ﻤﻥ ﺠﺩﻭﻟﻴﻥ ﻤﺨﺘﻠﻔﻴﻥ‬ ‫ﻭﻟﻠﺘﻐﻠﺏ ﻋﻠﻰ ﻫﺫﻩ ﺍﻟﻤﺸﻜﻠﺔ ﻨﺴﺘﺨﺩﻡ ‪instead of‬‬

‫‪- ١٠٤ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫ﺘﻡ ﺍﻟﺘﻐﻠﺏ ﻋﻠﻰ ﻫﺫﻩ ﺍﻟﻤﺸﻜﻠﺔ ﺒﺎﺴﺘﺨﺩﺍﻡ ‪ Instead of‬ﻭﻫﻲ ﻤﻌﻨﺎﻫﺎ ﺒﺩﻻ ﻤﻥ ﻋﻤﻠﻴﻪ ﺍﻟﺤﺫﻑ ﻋﻠﻰ ﺍل‪ View‬ﻭﺫﻟﻙ‬ ‫ﻟﻜل ﺼﻑ ﻤﻥ ﺍﻟﺼﻔﻭﻑ ﺜﻡ ﺒﻌﺩ ﺫﻟﻙ ﻴﺤﺩﺙ ﺃﻀﺎﻓﻪ ﻓﻲ ﺍﻟﺠﺩﻭل‬ ‫ﻭﺒﻬﺫﺍ ﻨﻜﻭﻥ ﺘﻐﻠﺒﻨﺎ ﻋﻠﻰ ﺍﻟﻤﺸﻜﻠﺔ ﺍﻟﺨﺎﺼﺔ ﺒﺎل ‪View‬‬

‫ﻹﻴﻘﺎﻑ ﺘﺸﻐﻴل ﺃل ‪ Trigger‬ﺃﻭ ﺘﺸﻐﻴﻠﻪ‬

‫ﻴﺴﺘﺨﺩﻡ ﻫﺫﺍ ﺍﻷﻤﺭ ﻟﺘﺸﻐﻴل ﺃﻭ ﻋﺩﻡ ﺘﺸﻐﻴل ﺍﻟﺤﺩﺙ ﺤﻴﺙ ﺍﻨﻪ ﻴﺘﻡ ﻜﺘﺎﺒﻪ ﺍﻷﻤﺭ ‪ Alter trigger‬ﺜﻡ ﺍﺴﻡ ﺍل‬ ‫‪Trigger‬‬ ‫ﻭﻴﻜﺘﺏ ﺒﻌﺩﻫﺎ ‪Enable‬ﻭﻤﻌﻨﺎﻫﺎ ﺸﻐﺎل ﺃﻭ ‪Disable‬ﻭﻤﻌﻨﺎﻫﺎ ﻏﻴﺭ ﺸﻐﺎل‬

‫ﻟﺘﺸﻐﻴل ﺃﻭ ﺇﻴﻘﺎﻑ ﺍﻷﺤﺩﺍﺙ ﺍﻟﻤﻭﺠﻭﺩﺓ ﻓﻲ ﺍﻟﺠﺩﻭل‬

‫‪- ١٠٥ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫ﻜﻤﺎ ﻓﻲ ﺍﻟﻤﺜﺎل ﺍﻵﺘﻲ‪:‬‬

‫ﻨﻜﺘﺏ ﺍﻷﻤﺭ ‪ Alter‬ﺜﻡ ﺍﺴﻡ ﺍﻟﺠﺩﻭل ﻭﻨﻜﺘﺏ ‪ Enable‬ﻭﻤﻌﻨﺎﻫﺎ ﺸﻐﺎل ﺃﻭ ﻨﻜﺘﺏ ‪ Disable‬ﻭﻤﻌﻨﺎﻫﺎ ﻏﻴﺭ ﺸﻐﺎل‬ ‫ﺇﺫﺍ ﺃﺭﺩﻨﺎ ﺘﺭﺠﻤﻪ ﺍﻟﺤﺩﺙ ﻨﻘﻭﻡ ﺒﻜﺘﺎﺒﻪ ﺍﻷﻤﺭ ‪ Alter‬ﺜﻡ ﺍﺴﻡ ﺃل ‪ Trigger‬ﺜﻡ ﻨﻜﺘﺏ ‪ Compile‬ﻭﺒﻬﺫﺍ ﻨﻜﻭﻥ ﻗﺩ‬ ‫ﺃﻋﺩﻨﺎ ﺘﺭﺠﻤﻪ ﺍﻟﺤﺩﺙ‬

‫ﻭﻟﺤﺫﻑ ﺍﻟﺤﺩﺙ ﻨﺴﺘﺨﺩﻡ ﺍﻷﻤﺭ ‪Drop‬ﺜﻡ ﺍﺴﻡ ﺃل ‪Trigger‬‬

‫‪- ١٠٦ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬ ‫ﺗﻢ ﺑﺤﻤﺪ اﷲ‬

‫ﺗﻢ ﺷﺮح ھﺬا اﻟﻜﺘﺎب ﻋﻠﻲ ﺻﻔﺤﺎت ﻣﻮﻗﻊ اﻟﻤﺠﻤﻮﻋﺔ اﻟﻌﺮﺑﯿﺔ ﻟﻠﻜﻤﺒﯿﻮﺗﺮ‬ ‫ﺗﺼﻤﯿﻢ اﻟﻐﻼف و ﺗﺠﻤﻊ إﺑﺮاھﯿﻢ ﻣﺤﻤﺪ اﺑﻮﻃﺎﻟﺐ‬ ‫ﯾﻤﻨﻊ ﻣﻨﻌﺎً ﺑﺎﺗﺎً ﻧﺴﺦ ھﺬا اﻟﻜﺘﺎب إﻻ ﺑﻤﻮاﻓﻘﺔ ﻛﺘﺎﺑﯿﺔ ﻣﻦ اﻷﺳﺘﺎذ اﻟﺪﻛﺘﻮر ﻋﻤﺮو ﻣﻮﺳﻲ‬ ‫ﺯﻭﺭﻭﺍ ﻤﻭﻗﻊ ﺍﻷﻜﺎﺩﻴﻤﻴﺔ ﻋﺒﺭ ﺍﻻﻨﺘﺭﻨﺕ‬ ‫‪www.agcacademy.com‬‬ ‫ﺠﻤﻴﻊ ﺍﻟﺤﻘﻭﻕ ﻤﺤﻔﻭﻅﺔ ﻟﻠﻤﺠﻤﻭﻋﺔ ﺍﻟﻌﺭﺒﻴﺔ ﻟﻠﻜﻤﺒﻴﻭﺘﺭ‬

‫‪- ١٠٧ -‬‬


‫ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ‬

‫ﻛﺘﺎﺏ ‪PL/SQL‬‬

‫‪- ١٠٨ -‬‬


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.