ﺇﻋﺪﺍﺩ ﺍﻟﻤﺠﻤﻮﻋﺔ ﺍﻟﻌﺮﺑﻴﺔ ﻟﻠﻜﻤﺒﻴﻮﺗﺮ
ﻛﺘﺎﺏ 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
- ١٠٨ -