Professional Documents
Culture Documents
الكامل في الأوراكل الجزء الثاني
الكامل في الأوراكل الجزء الثاني
الكامل في الأوراكل الجزء الثاني
PL/SQL
اﻻﻣﺘﯿﺎزات Privileges
35 اﻟﺮاﺑﻊ
اﻟﺴﻤﺎح ﻟﻠﻮﺻﻮل إﻟﻰ اﻟﺒﯿﺎﻧﺎت Granting Access to
36 Data
37 اﺳﺘﻌﺮاض اﻟﻤﻌﻠﻮﻣﺎت واﻟﻜﻮد اﻟﺨﺎص ﺑﺎﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ إدارة اﻟﺒﺮاﻣﺞ
اﺳﺘﻌﺮاض ﺑﯿﺎﻧﺎت اﻷﺧﻄﺎء وﻣﻌﻄﯿﺎت اﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ اﻟﻔﺮﻋﯿﺔ
38
اﻟﺤﻤﺪ ﷲ رب اﻟﻌﺎﻟﻤﯿﻦ واﻟﺼﻼة واﻟﺴﻼم ﻋﻠﻰ أﺷﺮف اﻷﻧﺒﯿﺎء واﻟﻤﺮﺳﻠﯿﻦ ﺳﯿﺪﻧﺎ وﺣﺒﯿﺒﻨﺎ اﻟﻤﺒﻌﻮث رﺣﻤﺔ ﻟﻠﻌﺎﻟﻤﯿﻦ
ﻣﺤﻤﺪ ﺑﻦ ﻋﺒﺪاﷲ اﻟﺼﺎدق اﻷﻣﯿﻦ أم ﺑﻌﺪ:
ﻟﻘﺪ ﺗﻢ ﺗﻘﺴﯿﻢ ھﺬا اﻟﺠﺰء إﻟﻰ ﺛﻤﺎﻧﯿﺔ ﻓﺼﻮل وﺗﻢ ﺗﻘﺴﯿﻢ اﻟﻔﺼﻞ اﻟﻮاﺣﺪ إﻟﻰ ﻋﺪة دروس اﻟﻤﺘﻌﻠﻘﺔ ﺑﺎﻟﻠﻐﺔ PL/SQL
ﺣﯿﺚ ﺗﻢ ﺷﺮح اﻟﺪروس ﺑﺎﻟﺘﻔﺼﯿﻞ وان ﺷﺎء اﷲ ﯾﺴﺘﻔﯿﺪ اﻟﺠﻤﯿﻊ ﻣﻦ ھﺬه اﻟﻠﻐﺔ واﻟﺘﻲ ﺗﻌﺘﺒﺮ اﻷﺳﺎس ﻓﻲ اﻷوراﻛﻞ .
وﻏﯿﺮھﺎ ﻣﻦ اﻟﻨﻘﺎط
ﺷﺮح اﻟﻔﺼﻮل
Exceptions
ﺳﻮفﻧﺘﻌﺮفﻓﻲ ھﺬااﻟﺠﺰءﻋﻠﻰ ﻛﯿﻔﯿﺔﻣﻌﺎﻟﺠﺔاﻻﺳﺘﺜﻨﺎءاتExceptionsاﻟﺘﻲﺗﻨﺘﺞأﺛﻨﺎءﺗﻨﻔﯿﺬاﻟﺒﺮﻧﺎﻣﺞوﻓﻲﻣﻌﻈﻢ
اﻷﺣﯿﺎنﺗﻌﻤﻞھﺬهاﻻﺳﺘﺜﻨﺎءاتﻋﻠﻰإﻧﮭﺎءاﻟﺒﺮﻧﺎﻣﺞ وذﻟﻚﻓﻲﺣﺎﻟﺔﻋﺪمﻣﻌﺎﻟﺠﺘﮭﺎ
-ﺧﻄﺄﻓﻲﺗﺼﻤﯿﻢاﻟﺒﺮﻧﺎﻣﺞ
-ﺧﻄﺄﻓﻲﻛﺘﺎﺑﺔاﻷﻛﻮاد
ﻣﻼﺣﻈﺔ:
اﻷﺟﺰاء اﻟﻤﺎدﯾﺔ ﻟﺠﮭﺎز اﻟﺤﺎﺳﺐ.
ﯾﻤﻜﻦ أن ﺗﻈﮭﺮ اﻻﺳﺘﺜﻨﺎءات Exceptionsﻧﺘﯿﺠﺔ ﻟﺘﻠﻒ ﺑﻌﺾ
وﯾﻌﺘﺒﺮ اﻟﻨﻮع اﻷول ) اﻷﻧﻮاع اﻟﻀﻤﻨﯿﺔ (Implicitlyھﻮ أﺣﺪ 20اﺳﺘﺜﻨﺎءاً ﻣﻦ اﻻﺳﺘﺜﻨﺎءات اﻟﺘﻲ ﻏﺎﻟﺒﺎً ﻣﺎ ﺗﺤﺪث ﻓﻲ
أﻛﻮاد اﻟﻠﻐﺔ PL/SQLوھﺬا اﻟﻨﻮع ﻣﻦ اﻻﺳﺘﺜﻨﺎءات ﻻ ﯾﺤﺘﺎج إﻟﻰ ﺗﻌﺮﯾﻒ ﻣﺴﺒﻖ أو ﻋﻤﻞ أﻃﻼق Raiseﻟﮫ داﺧﻞ
اﻟﻜﻮد وﻟﻜﻦ ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ Oracle serverﺑﺘﻌﺮﯾﻔﮭﺎ وإﻃﻼﻗﮭﺎ ﺗﻠﻘﺎﺋﯿﺎً.
ﯾﻤﻜﻦ اﻛﺘﺸﺎف اﻻﺳﺘﺜﻨﺎءات ﻋﻦ ﻃﺮﯾﻖ ﻛﺘﺎﺑﺔ ﺑﻌﺾ اﻻﻛﻮاد اﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ اﻛﺘﺸﺎف ھﺬه اﻻﺳﺘﺜﻨﺎءات وﻣﻌﺎﻟﺠﺘﮭﺎ
BLOCKS ﻓﻲ اﻟﻘﺎﻟﺐException Section وﯾﺘﻢ ﻛﺘﺎﺑﺔ ھﺬه اﻻﻛﻮاد ﻓﻲ اﻟﻘﺴﻢ اﻟﺨﺎص ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات
:واﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﮭﺬه اﻻﻛﻮاد ھﻲ ﻛﺎﻟﺘﺎﻟﻲ
Exception
When Exception 1 [OR Exception 2……….] then
Statement 1;
Statement 2;
……..
[When Exception 3 [OR Exception 4……….] then
Statement 1;
Statement 2;
……..
]
[When Others then
Statement 1;
Statement 2;
……..
]
Alsaeedi999@hotmail.com ٨ ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي/ أﻋﺪاد
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻻﺳﺘﺜﻨﺎءات ﺳﺎﺑﻘﺔ اﻟﺘﻌﺮﯾﻒ Predefinedوﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ
ﻗﺒﻞ إن ھﺬه اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻻﺳﺘﺜﻨﺎءات ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ Oracle serverﺑﺈﻃﻼﻗﮫ ﺗﻠﻘﺎﺋﯿﺎ Oracle
. serverوﻋﻦ ﻃﺮﯾﻖ ﻛﺘﺎﺑﺔ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﻤﻌﺎﻟﺠﺔ ھﺬه اﻻﺳﺘﺜﻨﺎءات ﻓﻲ اﻟﻘﺴﻢ Exception Sectionﯾﻤﻜﻨﻨﺎ
ﺑﺮﻣﺠﺔ ھﺬا اﻟﺠﺰء ﻹﺻﺪار رﺳﺎﺋﻞ ﻣﻌﺒﺮة إﻟﻰ اﻟﻤﺴﺘﺨﺪم ﻋﻨﺪ ﺣﺪوث ھﺬه اﻻﺳﺘﺜﻨﺎءات وﻟﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات ﻣﻦ
اﻟﻨﻮع Predefined Exceptionsﻧﻘﻮم ﺑﺈﺿﺎﻓﺔ اﺳﻢ اﻻﺳﺘﺜﻨﺎء اﻟﺬي ﻧﺮﯾﺪ ﻣﻌﺎﻟﺠﺘﮫ ﻓﻲ اﻟﻌﺒﺎرة Whenﻛﻤﺎ ﯾﻠﻲ:
Exception
WHEN NO_DATA_FOUND THEN
;Statement 1
;Statement 2
WHEN TOO_MANY_ROWS THEN
;Statement 1
WHEN OTHERS THEN
;Statement 1
;Statement 2
;Statement 3
;END
Alsaeedi999@hotmail.com ٩ أﻋﺪاد /ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي
DECLARE
; V_emp_id NUMBER :=&employee_id
;)V_name VARCHAR2(30
BEGIN
)Select RTRIM(first_name) | | ' ' | | RTRIM (last_name
INTO v_name
From employees
; Where emp_no = V_emp_id
; )DBMS_OUTPUT.PUT_LINE ('employee name is' | | v_name
Exception
WHEN NO_DATA_FOUND THEN
;)'DBMS_OUTPUT.PUT_LINE ('there is no such employee
;END
/
:ﺣﯿﺚ ﯾﻌﻤﻞ ھﺬا اﻟﻜﻮد ﻋﻠﻰ إﻇﮭﺎر رﺳﺎﻟﺔ ﻟﻠﻤﺴﺘﺨﺪم ﻹدﺧﺎل رﻗﻢ اﻟﻤﻮﻇﻒ ﺛﻢ اﺳﺘﺨﻼص ﺗﻮﺿﯿﺢ
اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻟﻤﻮﻇﻒ ﻣﻦ اﻟﺠﺪول Employeesﻟﻌﺮض اﻻﺳﻢ اﻷول واﻻﺳﻢ اﻷﺧﯿﺮ
ﻟــﮫ ﺑﺪﻻﻟﺔ رﻗﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﺗﻢ إدﺧﺎﻟﮫ وﻓﻲ ﺣﺎﻟﺔ وﺟﻮد ھﺬا اﻟﺮﻗﻢ ﻓﻲ اﻟﺠﺪول ﯾﺘﻢ ﻋﺮض اﺳﻢ اﻟﻤﻮﻇﻒ اﻟﻤﺮﺗﺒﻂ
ﺑﮭﺬا اﻟﺮﻗﻢ ،أﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﻋﺪم وﺟﻮد اﻟﺮﻗﻢ اﻟﺬي ﺗﻢ إدﺧﺎﻟﮫ ﻓﻲ اﻟﺠﺪول ﯾﻘﻮم اﻟﺒﺮﻧﺎﻣﺞ ﺑﺎﻻﻧﺘﻘﺎل ﻟﺘﻨﻔﯿﺬ اﻟﺠﺰء
Exceptionوﻓﻲ ھﺬا اﻟﺠﺰء ﻗﻤﻨﺎ ﺑﺒﺮﻣﺠﺔ اﻻﺳﺘﺜﻨﺎء NO_DATA_FOUNDﺑﺤﯿﺚ ﯾﺘﻢ ﻋﺮض ھﺬه اﻟﺮﺳﺎﻟﺔ
ﻓﻲ ﺣﺎﻟﺔ ﻋﺪم اﺳﺘﺮﺟﺎع أي ﺑﯿﺎﻧﺎت ﻣﻦ اﻟﺠﺪول ' 'there is no such employeeﺣﯿﺚ ﻗﻤﻨﺎ ﺑﻜﺘﺎﺑﺔ اﺳﻢ
اﻻﺳﺘﺜﻨﺎء NO_DATA_FOUNDﺑﯿﻦ اﻟﻜﻠﻤـــــــﺔ WHENواﻟﻜﻠﻤـــﺔ THENﺛﻢ اﻟﺠﻤﻠﺔ أو ﻣﺠﻤﻮﻋﺔ ﻣﻦ
اﻟﺠﻤﻞ اﻟﺘﻲ ﻧﺮﯾﺪ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ إﻃﻼق ھﺬا اﻻﺳﺘﺜﻨﺎء وھﻲ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﻋﺒﺎرة ﻋﻦ ﻋﺮض ﺟﻤﻠﺔ 'there is no
' such employeeﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ اﻻﺳﺘﺜﻨﺎ ء NO_DATA_FOUNDﺣﯿﺚ ﯾﻮﺟﺪ اﻟﻌﺪﯾﺪ ﻣﻦ اﻻﺳﺘﺜﻨﺎءات
اﻟﺘﻲ ﺗﺴﺘﺨﺪم ﻋﺎدةً ﻓﻲ اﻟﺒﺮاﻣﺞ PL/SQLﻛﻤﺎ ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ:
PL/SQL
وﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ Oracle serverﺑﺈﻃﻼق أو ﻋﻤﻞ Raiseﻟﮭﺬا اﻻﺳﺘﺜﻨﺎء ﺗﻠﻘﺎﺋﯿﺎً وﻟﻠﺘﻌﺎﻣﻞ ﻣﻊ
ھﺬا اﻟﻨﻮع ﻣﻦ اﻻﺳﺘﺜﻨﺎء ﻻﺑﺪ ﻣﻦ ﻣﺮور ﺑﺜﻼث ﻣﺮاﺣﻞ:
اﻷوﻟﻰ :ﺗﻌﺮﯾﻒ اﻻﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ Declarative sectionوذﻟﻚ ﺑﺎﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ:
Declarative section ; Exception_name Exception
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻻﺳﻢ اﻟﺬي ﻧﺮﯾﺪ ﺗﺤﺪﯾﺪه ﻟﮭﺬا اﻻﺳﺘﺜﻨﺎء Exception_nameﯾﻠﯿﮫ اﻟﻜﻠﻤﺔ Exception
اﻟﺜﺎﻧﯿﺔ :ﯾﺘﻢ رﺑﻂ اﻻﺳﻢ اﻟﺬي ﻗﻤﻨﺎ ﺑﺘﻌﯿﯿﻨﮫ ﻟﮭﺬا اﻻﺳﺘﺜﻨﺎء ﺑﺎﻟﺮﺑﻂ اﻟﺨﺎص ﺑﺎﻻﺳﺘﺜﻨﺎء وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ
Pragma Exception-initوﺗﻌﻤﻞ ھﺬه اﻟﺠﻤﻠﺔ ﻋﻠﻰ أﺧﺒﺎر اﻟﻤﺘﺮﺟﻢ Complierﺑﻌﻤﻞ رﺑﻂ ﺑﯿﻦ اﺳﻢ اﻟﺬي ﺗﻢ
ﺗﻌﯿﯿﻨﮫ ﻟﻼﺳﺘﺜﻨﺎء ﻣﻊ اﻟﺮﻗﻢ اﻟﺨﺎص ﻟﮭﺬا اﻻﺳﺘﺜﻨﺎء .
Compiler
Exception_name Error_Number
ﺗﻮﺿﯿﺢ
ﺣﯿﺚ ﯾﻌﻤﻞ ھﺬا اﻟﻜﻮد ﻋﻠﻰ إﻇﮭﺎر رﺳﺎﻟﺔ ﺧﻄﺄ ﻋﻨﺪ ﻣﺤﺎوﻟﺔ ﺣﺬف اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺄي ﻗﺴﻢ Departmentﻣﻦ
اﻟﺠﺪول Departmentﻣﻊ وﺟﻮد ﻣﻮﻇﻔﯿﻦ ﻣﻮﺟﻮدﯾﻦ ﻓﻲ ھﺬا اﻟﻘﺴﻢ.
ﻓﻔﻲ اﻟﺠﺰء Declareﻗﻤﻨﺎ ﺑﺘﻌﯿﯿﻦ اﺳﻢ ﻟﻼﺳﺘﺜﻨﺎء ﺑﻜﺘﺎﺑﺔ اﺳﻤﮫ e_emps_remainingﯾﻠﯿﮫ اﻟﻜﻠﻤﺔ
Exceptionﺛﻢ ﻗﻤﻨﺎ ﺑﺮﺑﻂ اﻻﺳﺘﺜﻨﺎء ﻣﻊ اﻟﺮﻗﻢ اﻟﺨﺎص ﺑﮫ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ:
;)Pragma Exception-init (e_emps_remaining ,-2292
ﺛﻢ ﻗﻤﻨﺎ ﺑﺒﺮﻣﺠﺔ ھﺬا اﻻﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ Exception
When e_emps_remaining then
Dbms_output.put_line('cannot remove dept'| | to_char(&p_deptno) | | '.employees
;)'exist.
ﺗﺘﯿﺢ ﻟﻨﺎ اﻟﻠﻐﺔ PL/SQLﻋﺪد ﻣﻦ اﻟﺪوال اﻟﺘﻲ ﺗﺴﺎﻋﺪﻧﺎ ﻋﻠﻰ ﻣﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات واﻟﺘﻌﺮف ﻋﻠﯿﮭﺎ وھﻲ اﻟﺪوال:
-SQL CODE
- SQL ERRM (SQL Error message).
SQL CODE error number * وﺗﻌﻤﻞ اﻟﺪاﻟﺔ SQL CODEﻋﻠﻰ اﺳﺘﺮﺟﺎع رﻗﻢ اﻻﺳﺘﺜﻨﺎء
* أﻣﺎ اﻟﺪاﻟﺔ SQL ERRMﺗﻌﻤﻞ ﻋﻠﻰ إرﺟﺎع اﻟﺮﺳﺎﻟﺔ اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻻﺳﺘﺜﻨﺎء
SQL ERRM Error message
ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ:
ﺗﻮﺿﯿﺢ
ﻧﻼﺣﻆ إن ﺟﻤﻠﺔ SELECTاﻟﺘﻲ ﺗﻈﮭﺮ ﺑﻌﺪ BEGINﺗﺴﺘﺨﺪم ﻟﻌﻤﻞ اﺳﺘﺮﺟﺎع ﻟﻼﺳﻢ اﻷﺧﯿﺮ ﻟﺠﻤﯿﻊ اﻟﻤﻮﻇﻔﯿﻦ
اﻟﻤﻮﺟﻮدﯾﻦ ﻓﻲ اﻟﺠﺪول Employeesووﺿﻊ ﻧﺎﺗﺞ ھﺬه اﻟﺠﻤﻠﺔ ﻓﻲ اﻟﻤﺘﻐﯿﺮ V_enameوﺑﺎﻟﻄﺒﻊ ﺳﻮف ﺗﻌﻤﻞ ھﺬه
اﻟﺠﻤﻠﺔ ﻋﻠﻰ إﻇﮭﺎر اﺳﺘﺜﻨﺎء ﻣﻌﯿﻦ ﻟﻠﺘﻌﺒﯿﺮ ﻋﻦ ھﺬا اﻟﺨﻄﺄ وذﻟﻚ ﻻن اﻟﻤﺘﻐﯿﺮ V_enameﯾﺴﺘﺨﺪم ﻟﺤﻔﻆ ﻗﯿﻤﺔ واﺣﺪة
ﺑﯿﻨﻤﺎ ﻧﺎﺗﺞ اﻟﺠﻤﻠﺔ SELECTﻋﺒﺎرة ﻋﻦ ﻋﺪة ﻗﯿﻢ واﻵن ﻧﺮﯾﺪ ﻋﺮض اﺳﻢ اﻻﺳﺘﺜﻨﺎء واﻟﺮﺳﺎﻟﺔ اﻟﺨﺎﺻﺔ ﺑﮫ ﻛﻤﺎ
ﻧﻼﺣﻆ ﻓﻲ اﻟﺠﺰء Exceptionﺣﯿﺚ ﻗﻤﻨﺎ ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎء NO_DATA_FOUNDوﻟﻤﻌﺎﻟﺠﺔ ﺑﺎﻗﻲ
اﻻﺳﺘﺜﻨﺎءات ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ OTHERSداﺧﻞ اﻟﻌﺒﺎرة WHENﺣﯿﺚ ﺗﻘﻮم ﺑﺎﺳﺘﻌﺎدة اﻟﻮﺿﻊ اﻟﺴﺎﺑﻖ
ﻟﻘﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻋﻦ ﻃﺮﯾﻖ اﻟﺠﻤﻠﺔ Rollbackﺛﻢ ﻧﻘﻮم ﺑﻌﺮض اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻻﺳﺘﺜﻨﺎء ﺑﺎﺳﺘﺨﺪام اﻟﺪوال
SQL CODEو SQL ERRMﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻤﺜﺎل وﻋﻨﺪ ﺗﺸﻐﯿﻞ ھﺬا اﻟﻜﻮد ﺗﻈﮭﺮ ھﺬه اﻟﺒﯿﺎﻧﺎت:
User-defined Exceptions
ﻣﻦ أﺣﺪى اﻟﻤﻤﯿﺰات اﻟﺘﻲ ﺗﻤﺘﺎز اﻟﻠﻐﺔ PL/SQLھﻲ إﻣﻜﺎﻧﯿﺔ اﻟﺴﻤﺎح ﻟﻠﻤﺴﺘﺨﺪﻣﯿﻦ ﺑﻌﻤﻞ اﻻﺳﺘﺜﻨﺎءات Exception
اﻟﺨﺎﺻﺔ ﺑﮭﻢ وﻣﻌﺎﻟﺠﺘﮭﺎ وﯾﺴﻤﻰ ھﺬا اﻟﻨﻮع ﻣﻦ اﻻﺳﺘﺜﻨﺎءات ﺑﺎﻻﺳﻢ :
User-defined Exceptions
وﯾﺘﻢ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ھﺬا اﻟﻨﻮع ﻣﻦ اﻻﺳﺘﺜﻨﺎءات ﻣﻦ ﺧﻼل ﺛﻼث ﻣﺮاﺣﻞ:
اﻟﻤﺮﺣﻠﺔ اﻷوﻟﻰ :وﺗﺴﺘﺨﺪم ﻟﺘﻌﺮﯾﻒ اﻻﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ Declarative Sectionﺑﺎﺳﺘﺨﺪام اﻟﺼﯿﻐﺔ :
; Exception_name Exception
ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﺳﻢ اﻻﺳﺘﺜﻨﺎء Exception_nameﯾﻠﯿﮭﺎ اﻟﻜﻠﻤﺔ . Exception
اﻟﻤﺮﺣﻠﺔ اﻟﺜﺎﻧﯿﺔ :ﯾﺘﻢ إﻃﻼق أو ﻋﻤﻞ Raiseﻟﻼﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ ) Executable Section ( Beginوذﻟﻚ
ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ﻛﻤﺎ ﻓﻲ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ:
;Raise Exception_name
ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﺠﻤﻠﺔ Raiseﯾﻠﯿﮭﺎ اﻻﺳﻢ اﻟﺬي ﻗﻤﻨﺎ ﺑﺘﻌﯿﯿﻨﮫ ﻟﻼﺳﺘﺜﻨﺎء ﻓﻲ اﻟﻘﺴﻢ .Declarative
اﻟﻤﺮﺣﻠﺔ اﻟﺜﺎﻟﺜﺔ :ﯾﺘﻢ ﻓﯿﮭﺎ ﻣﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎء وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ WHENﻛﻤﺎ ﻓﻲ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ:
Exception
WHEN Exception_name THEN
;Statement 1
;Statement 1
…………
ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل إﺟﺒﺎر اﻟﻤﺴﺘﺨﺪم ﻋﻠﻰ إدﺧﺎل اﺳﻢ ﯾﺒﺪأ ﺑﺎﻟﺤﺮف Xﻓﻘﻂ ﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد :
ﺑﻤﻌﺎﻟﺠﺔ ھﺬه اﻻﺳﺘﺜﻨﺎءات ﺣﯿﺚ ﺗﻘﻮم ﻛﻞ ﺑﯿﺌﺔ ﻣﻦ ﺑﯿﺌﺎت اﻟﺘﺸﻐﯿﻞ ﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎءات ﺑﻄﺮﯾﻘﺔ ﻣﺨﺘﻠﻔﺔ ﻓﻌﻨﺪ ﻗﯿﺎم
اﻟﻘﺎﻟﺐ اﻟﻔﺮﻋﻲ Sub Blockﺑﻤﻌﺎﻟﺠﺔ اﻻﺳﺘﺜﻨﺎء ﯾﺘﻢ إﻧﮭﺎء اﻟﻘﺎﻟﺐ اﻟﻔﺮﻋﻲ ﺑﺼﻮرة ﻃﺒﯿﻌﯿﺔ وﯾﺘﻢ اﻧﺘﻘﺎل اﻟﺘﻨﻔﯿﺬ إﻟﻰ
اﻟﻘﺎﻟﺐ اﻟﻔﺮﻋﻲ اﻷﺑﻮي ﻟﻠﻘﺎﻟﺐ اﻟﺤﺎﻟﻲ ﺑﻌﺪ اﻟﺠﻤﻠﺔ ENDاﻟﺨﺎﺻﺔ ﺑﺎﻟﻘﺎﻟﺐ اﻟﻔﺮﻋﻲ اﻟﺤﺎﻟﻲ ﻣﺒﺎﺷﺮة ً .أﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﻗﯿﺎم
اﻟﻠﻐﺔ PL/SQLﺑﺈﻃﻼق اﻻﺳﺘﺜﻨﺎء وﻋﺪم اﺣﺘﻮاء اﻟﻘﺎﻟﺐ اﻟﺤﺎﻟﻲ ﻋﻠﻰ اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﻤﻌﺎﻟﺠﺔ ھﺬا اﻻﺳﺘﺜﻨﺎء ﻓﯿﺘﻢ
اﻧﺘﻘﺎل اﻻﺳﺘﺜﻨﺎء إﻟﻰ اﻟﻘﺎﻟﺐ اﻷﺑﻮي ﻟﻠﻘﺎﻟﺐ اﻟﺤﺎﻟﻲ ﻓﺈذا ﻟﻢ ﯾﺘﻢ إﯾﺠﺎد اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﻤﻌﺎﻟﺠﺔ ھﺬا اﻻﺳﺘﺜﻨﺎء ﯾﺘﻢ اﻻﻧﺘﻘﺎل
إﻟﻰ اﻟﻘﺎﻟﺐ اﻷﺑﻮي اﻟﺘﺎﻟﻲ وھﻜﺬا ﺣﺘﻰ ﺗﺼﻞ إﻟﻰ اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﮭﺬا اﻻﺳﺘﺜﻨﺎء .وﻓﻲ ﺣﺎﻟﺔ ﻋﺪم اﺣﺘﻮاء أي ﻣﻦ ھﺬه
اﻟﻘﻮاﻟﺐ ﻋﻠﻰ اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﻤﻌﺎﻟﺠﺔ ھﺬا اﻻﺳﺘﺜﻨﺎء ﻓﯿﻨﺘﺞ ﻣﺎﯾﺴﻤﻰ Unhandled Exceptionﻓﻲ ﺑﯿﺌﺔ
اﻟﺘﺸﻐﯿﻞ ﺣﯿﺚ ﺗﻈﮭﺮ رﺳﺎﻟﺔ ﺧﻄﺄ وﯾﺘﻢ اﻟﺨﺮوج ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ ﺑﺼﻮرة ﻏﯿﺮ ﻃﺒﯿﻌﯿﺔ .وﯾﺠﺐ ﻣﻼﺣﻈﺔ أﻧﮫ ﻋﻨﺪ اﻧﺘﻘﺎل
اﻻﺳﺘﺜﻨﺎء إﻟﻰ اﻟﻘﺎﻟﺐ اﻷﺑﻮي ﻓﺈﻧﮫ ﯾﺘﻢ إھﻤﺎﻟﮫ ﻓﻲ ﺑﺎﻗﻲ اﻟﻜﻮد اﻟﻘﺴﻢ Executable Sectionاﻟﺨﺎص ﺑﮭﺬا اﻟﻘﺎﻟﺐ
وﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء :
Raise_Application_Error
Alsaeedi999@hotmail.com ١٥ أﻋﺪاد /ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي
ﯾﺘﻢ إﻇﮭﺎر رﺳﺎﻟﺔ ﺧﻄﺄ ﻓﻲ ﺣﺎﻟﺔ ﻋﺪم اﺳﺘﺮﺟﺎع أي ﺑﯿﺎﻧﺎت ﻣﻦ اﻟﺠﻤﻠﺔ SELECTوذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ اﻻﺳﺘﺜﻨﺎء
NO_DATA_FOUNDﺑﺮﺳﺎﻟﺔ اﻟﺨﻄﺄ اﻟﺘﻲ ﺗﻢ إﻧﺸﺎﺋﮭﺎ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء:
Raise_Application_Error
ﻓﻌﻨﺪ ﺗﺸﻐﯿﻞ اﻟﺒﺮﻧﺎﻣﺞ أو ﺗﻨﻔﯿﺬه ﺗﻈﮭﺮ اﻟﻌﺒﺎرة اﻟﺘﺎﻟﯿﺔ:
Enter Value for Sv_employee_id : 85
وذﻟﻚ ﻋﻨﺪ إدﺧﺎل رﻗﻢ ﻏﯿﺮ ﻣﻮﺟﻮد ﻟﻠﻤﻮﻇﻒ ﻓﻲ اﻟﺠﺪول وﻟﯿﻜﻦ 85ﺛﻢ اﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح Enterﻧﻼﺣﻆ ﻇﮭﻮر رﻗﻢ
ورﺳﺎﻟﺔ اﻟﺨﻄﺄ اﻟﺘﻲ ﺗﻢ ﺗﻌﯿﯿﻨﮭﺎ ﻛﻤﻌﻄﯿﺎت ﻟﻺﺟﺮاء .Raise_Application_Error
Sub-programs
اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ :ﻋﺒﺎرة ﻋﻦ ﻗﺎﻟﺐ PL/SQLﻟﮭﺎ أﺳﻢ ﻣﺤﺪد وﺗﺴﻤﺢ ﺑﺘﻤﺮﯾﺮ اﻟﻤﻌﻄﯿﺎت Parametersﻟﮭﺎ وﺗﻮﺟﺪ
ﻧﻮﻋﺎن ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ھﻤــــﺎ:
-اﻹﺟﺮاءات Procedure
-اﻟﺪوال Function
وﯾﺘﻢ اﺳﺘﺪﻋﺎء اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻣﻦ أي ﺑﯿﺌﺔ ﺗﺸﻐﯿﻞ واﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻟﮭﺎ ﻧﻔﺲ اﻟﮭﯿﻜﻞ اﻟﺒﻨﺎﺋﻲ ﻟﻘﻮاﻟﺐ اﻟﻠﻐﺔ PL/SQL
ﺣﯿﺚ ﺗﺘﻜﻮن ﻣﻦ ﺛﻼﺛﺔ أﻗﺴﺎم وھﻲ:
-Declarative section
-Executable section
-Exception section
وﺗﺘﻤﯿﺰ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺑﺎﻟﻌﺪﯾﺪ ﻣﻦ اﻟﺨﺼﺎﺋﺺ واﻹﻣﻜﺎﻧﺎت ﻣﺜﻞ إﻣﻜﺎﻧﯿﺔ ﺗﻘﺴﯿﻢ اﻟﺒﺮﻧﺎﻣﺞ إﻟﻰ ﻗﻄﻊ ﺑﺮﻣﺠﯿﺔ ﺻﻐﯿﺮة
Modularizationواﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ إﻛﺴﺎب اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻣﯿﺰة أﺧﺮى وھﻲ إﻋﺎدة اﺳﺘﺨﺪام أي ﻗﻄﻌﺔ ﺑﺮﻣﺠﯿﺔ
ﺳﻮاءً ﻓﻲ ﻧﻔﺲ اﻟﺒﺮﻧﺎﻣﺞ أو ﻓﻲ ﺑﺮاﻣﺞ أﺧﺮى Reusabilityﻛﻤﺎ ﺗﺘﯿﺢ أﯾﻀﺎ ﺳﮭﻮﻟﺔ اﻟﺼﯿﺎﻧﺔ وﺗﺤﺪﯾﺚ اﻟﺒﺮاﻣﺞ
Maintainوﺗﺘﺒﻊ اﻷﺧﻄﺎء Debugﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ ذﻟﻚ ﻓﺈﻧﮭﺎ ﺗﺘﯿﺢ أﻣﻜﺎﻧﯿﺔ اﻛﺘﺴﺎب ﺑﻌﺾ اﻟﺼﻔﺎت اﻟﺨﺎﺻﺔ ﺑﺒﺮاﻣﺞ
أﺧﺮى وھﻮ ﻣﺎﯾﺴﻤﻰ Extensibilityاﻟﻰ آﺧﺮه ﻣﻦ ﻣﺰاﯾﺎ اﻟﻠﻐﺎت اﻟﺒﺮﻣﺠﺔ اﻹﺟﺮاﺋﯿﺔ وﯾﻜﻤﻦ اﻟﻔﺮق ﺑﯿﻦ اﻟﺒﺮاﻣﺞ
اﻟﻔﺮﻋﯿﺔ Sub-programواﻟﻘﺎﻟﺐ PL/SQL Blockﻓﻲ أن اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻻﺑﺪ أن ﯾﻜﻮن ﻟﮭﺎ أﺳﻢ ﻣﺤﺪد.
وﯾﻨﻘﺴﻢ اﻟﺘﻜﻮﯾﻦ اﻷﺳﺎﺳﻲ ﻟﻠﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﻰ ﻗﺴﻤﯿﻦ أﺳﺎﺳﯿﻦ ﻛﻤﺎ ﻓﻲ اﻟﺸﻜﻞ اﻟﺘﺎﻟﻲ:
><header
Sub-program Specification ][1
IS / AS
Declaration section
Begin
Executable section ]Sub-program Body [2
Exception )(optional
Exception section
;End
ﺗﻌﺘﺒﺮ اﻷداة iSQL * plusأﺣﺪى إﺻﺪارات اﻷداة SQL * plusواﻟﺘﻲ ﺗﻢ ﺑﻨﺎﺋﮭﺎ ﻟﻠﻌﻤﻞ ﻣﻦ ﺧﻼل ﻣﺘﺼﻔﺤﺎت
اﻹﻧﺘﺮﻧﺖ ﺣﯿﺚ ﺗﻤﻜﻨﻨﺎ ﻣﻦ اﻻﺗﺼﺎل ﺑﺨﺎدم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت Oracle Database serverﻛﻤﺎ ﺗﺴﻤﺢ ﻟﻨﺎ ﺑﺎﻟﻘﯿﺎم
ﺑﺠﻤﯿﻊ إﺟﺮاءات اﻟﺘﻲ ﯾﻤﻜﻦ ﻋﻤﻠﮭﺎ ﻣﻦ ﺧﻼل اﻷداة iSQL * plusﻧﻘﻮم اوﻷً ﺑﺎﺳﺘﺨﺪام أي ﺑﺮﻧﺎﻣﺞ ﻟﻜﺘﺎﺑﺔ اﻟﻤﻠﻒ
Scriptوﻟﯿﻜﻦ اﻟﺒﺮﻧﺎﻣﺞ Notepadﺛﻢ ﻧﻘﻮم ﺑﺘﻌﺮﯾﻒ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ اﻟﻤﺮاد ﺗﻨﻔﯿﺬه وﻧﻘﻮم ﺑﺈﻧﺸﺎء إﺟﺮاء ﯾﻌﻤﻞ
ﻋﻠﻰ إﺿﺎﻓﺔ ﺳﺠﻞ ﻣﻜﻮن ﻣﻦ أﺳﻢ اﻟﻤﺴﺘﺨﺪم وﺗﺎرﯾﺦ اﻟﯿﻮم ﺣﺴﺐ ﺗﺎرﯾﺦ اﻟﺠﮭﺎز ﻓﻲ اﻟﺠﺪول ﻟﮫ اﺳﻢ Log_tableﺛﻢ
ﻧﻘﻮم ﺑﺤﻔﻆ اﻟﻤﻠﻒ .
ﻛﻮد ﻹﻧﺸﺎء إﺟﺮاء :
ﺛﻢ ﻧﻘﻮم ﺑﻔﺘﺢ اﻷداة ) iSQL * plusأوراﻛﻞ . ( 10gﺛﻢ ﻧﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح Load Scriptﻓﯿﺘﻢ ﻋﺮض
اﻟﺼﻔﺤﺔ Load Scriptوﺑﺎﺳﺘﺨﺪام اﻟﻤﻔﺘﺎح Browseﻧﻘﻮم ﺑﺘﺤﺪﯾﺪ اﻟﻤﻠﻒ Scriptوھﻮ
Log_execution.txtاﻟﺬي ﺗﻢ ﺣﻔﻈﮫ ﻣﺴﺒﻘﺎ ﺑـــ Notepadﺛﻢ ﻧﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح Loadﻓﻨﻼﺣﻆ إﻧﮫ ﺗﻢ
Alsaeedi999@hotmail.com ١٩ أﻋﺪاد /ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي
Procedures
ﻋﺒﺎرة ﻋﻦ ﻧﻮع ﻣﻦ أﻧﻮاع اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺗﻌﻤﻞ ﻋﻠﻰ أداء إﺟﺮاء ﻣﻌﯿﻦ ﺣﯿﺚ ﯾﺘﻢ ﺗﺮﺟﻤﺘﮭﺎ وﺗﺨﺰﯾﻨﮭﺎ ﻓﻲ ﺧﺎدم ﻗﻮاﻋﺪ
اﻟﺒﯿﺎﻧﺎت Oracle Serverﻛﻤﺎ أﻧﮭﺎ ﺗﺴﻤﺢ ﺑﺎﺳﺘﻘﺒﺎل اﻟﻤﻌﻄﯿﺎت Parametersﺣﯿﺚ ﯾﻤﻜﻦ اﺳﺘﺪﻋﺎﺋﮭﺎ ﻣﻦ أي ﺑﯿﺌﺔ
ﺗﺸﻐﯿﻠﯿﺔ .وﻣﻦ أھﻢ ﻣﺰاﯾﺎ اﻹﺟﺮاءات- :
-١أﻋﺎدة اﻻﺳﺘﺨﺪام . Reusability
-٢ﺳﮭﻮﻟﺔ اﻟﺼﯿﺎﻧﺔ . Maintainability
وﺗﺄﺧﺬ اﻹﺟﺮاءات ﻧﻔﺲ اﻟﺒﻨﺎء اﻟﮭﯿﻜﻠﻲ ﻟﻠﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺣﯿﺚ ﺗﻨﻘﺴﻢ إﻟﻰ ﻗﺴﻤﯿﻦ:
-١اﻟﻘﺴﻢ Procedure Specificationواﻟﺬي ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﺠﺰء > <headerﯾﻠﯿﮫ اﻟﻜﻠﻤﺔ . IS/AS
-٢اﻟﻘﺴﻢ Procedure Bodyواﻟﻤﻜﻮﻧﺔ ﻣﻦ اﻷﻗﺴﺎم :
-Declarative section
-Executable section
-Exception section
ﻛﻤﺎ ﻓﻲ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ :
><header
Sub-program Specification ][1
IS / AS
Declaration section
Begin
Executable section ]Sub-program Body [2
Exception )(optional
Exception section
;End
Expression ﺗﻌﺒﯿﺮ
Actual parameter
Constant ﺛﺎﺑﺖ
ﯾﻠﯿﮫ اﺳﻢ اﻹﺟﺮاء ﺛﻢ ﺗﻤﺮﯾﺮ رﻗﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﻧﺮﯾﺪ اﻟﺘﻌﺪﯾﻞ راﺗﺒﮫ ﻛﻤﻌﻄﻰ ﻟﮭﺬا اﻹﺟﺮاء.وﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح
Enterﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻷﺟﺮاء ﻓﺘﻈﮭﺮ اﻟﺮﺳﺎﻟﺔ PL/SQL Procedure successfully Completed:
واﻟﺘﻲ ﺗﺪل ﻋﻠﻰ اﻧﮫ ﺗﻢ ﺗﻨﻔﯿﺬ اﻷﺟﺮاء .وﻟﻼﺳﺘﺪﻋﺎء اﻷﺟﺮاء ﻣﻦ ﺧﻼل إﺟﺮاء آﺧﺮ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﺳﻢ اﻷﺟﺮاء ﯾﻠﯿﮫ
;)Raise_salary(100 اﻟﻤﻌﻄﯿﺎت ﻣﺒﺎﺷﺮةً ﺑﺪون اﺳﺘﺨﺪام EXECUTEھﻜﺬا :
اﻷﺳﻠﻮب : OUTﯾﺘﻢ ﺗﺤﺪﯾﺪه ﻋﻨﺪ إﻧﺸﺎء اﻹﺟﺮاء وﯾﺴﺘﺨﺪم ﻟﻨﻘﻞ اﻟﻘﯿﻢ ﻣﻦ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ إﻟﻰ ﺑﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ
Sub SQL
program iSQL
وﯾﻌﻤﻞ اﻟﻤﻌﻄﻰ اﻟﺮﺳﻤﻲ Formal Parameterﻟﮭﺬا اﻷﺳﻠﻮب ﻛﻤﺘﻐﯿﺮ ﻷﯾﺘﻢ ﺗﺤﺪﯾﺪ اﻟﻘﯿﻤﺔ اﻻﺑﺘﺪاﺋﯿﺔ ﻟﮫ
. Uninitialized Variableأﻣﺎ اﻟﻤﻌﻄﻰ اﻟﻔﻌﻠﻲ Actual Parameterﻓﻼﺑﺪ وأن ﯾﻜﻮن ﻣﺘﻐﯿﺮ وﯾﺠﺐ ﻣﻼﺣﻈﺔ
أﻧﮫ ﻻﯾﻤﻜﻦ ﺗﻌﯿﯿﻦ ﻗﯿﻤﺔ اﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﻌﻄﯿﺎت Parametersﻓﻲ ھﺬا اﻷﺳﻠﻮب ﻓﻤﺜﻼ ﻓﻲ اﻟﻜﻮد اﻟﺘﺎﻟﻲ:
ﻓﻔﻲ اﻟﻤﺜﺎل ﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻷﺳﻠﻮب ﻓﻲ اﻟﻤﻌﻄﻰ P_phone_noوذﻟﻚ ﻹﻧﺸﺎء إﺟﺮاء ﯾﺴﺘﺨﺪم ﻟﺘﺤﻮﯾﻞ رﻗﻢ ﻣﻜﻮن ﻣﻦ
(999)999-9999 ﻋﺸﺮة أرﻗﺎم إﻟﻰ رﻗﻢ ھﺎﺗﻒ ﺑﺎﻟﺘﻨﺴﯿﻖ اﻟﺘﺎﻟﻲ :
وﻹﻧﺸﺎء ھﺬا اﻹﺟﺮاء ﻧﻘﻮم ﺑﺘﺸﻐﯿﻞ ھﺬا اﻹﺟﺮاء ﺑﺎﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح Enterﻓﯿﺘﻢ إﻧﺸﺎء اﻹﺟﺮاء ﻓﺘﻈﮭﺮ اﻟﺮﺳﺎﻟﺔ :
Procedure Created
وﻟﻼﺳﺘﺪﻋﺎء ھﺬا اﻹﺟﺮاء ﻧﻘﻮم ﺑﺈﻧﺸﺎء ﻣﺘﻐﯿﺮ ﻣﻦ اﻟﻨﻮع -: Host Variable
;)Variable g_phone_no Varchar2(15
وﻟﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ ﻟﻠﻤﺘﻐﯿﺮ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺠﻤﻠﺔ :
Begin
;':g_phone_no:='3567057920
End; /
وﻻﺳﺘﻌﺮاض ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ g_phone_noﻧﻘﻮم ﺑﻄﺒﺎﻋﺔ ﻗﯿﻤﺔ ھﺬا اﻟﻤﺘﻐﯿﺮ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ : Print
; Print g_phone_no
ﻓﯿﺘﻢ ﻋﺮض اﻟﻘﯿﻤﺔ :
G_phone_no
3567057920
واﻵن ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻷﺟﺮاء Formal_phoneﻟﺘﺤﻮﯾﻞ ﺗﻨﺴﯿﻖ ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ g_phone_noإﻟﻰ اﻟﺘﻨﺴﯿﻖ اﻟﺬي
ﻗﻤﻨﺎ ﺑﺘﺤﺪﯾﺪه ﻟﻸﺟﺮاء :
;)EXECUTE formal_phone (:g_phone_no
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ اﻟﻄﺮق اﻟﻤﺴﺘﺨﺪﻣﺔ ﻟﺘﻤﺮﯾﺮ اﻟﻤﻌﻄﯿﺎت إﻟﻰ اﻹﺟﺮاءات ﻛﻤﺎ ﺳﻨﺘﻌﺮف أﯾﻀﺎ ﻋﻠﻰ
ﻛﯿﻔﯿﺔ اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ DEFAULTﺣﯿﺚ ﺗﺴﺘﺨﺪم ھﺬه اﻟﺨﺎﺻﯿﺔ ﻟﺘﻌﯿﯿﻦ ﻗﯿﻢ اﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﻌﻄﯿﺎت اﻟﺘﻲ ﯾﺘﻢ ﺗﻌﯿﯿﻨﮭﺎ
ﻟﻸﺳﻠﻮب INﻟﮭﺎ ﺣﯿﺚ ﯾﻤﻜﻦ ﻗﺒﻮل ھﺬه اﻟﻘﯿﻢ اﻻﻓﺘﺮاﺿﯿﺔ أو اﺳﺘﺒﺪاﻟﮭﺎ ﺑﻘﯿﻢ أﺧﺮى أﺛﻨﺎء اﺳﺘﺪﻋﺎء اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ
ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ :
ﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻟﻘﯿﻢ unknownو NEW
Yorkﻛﻘﯿﻢ اﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﻌﻄﯿﺎت
P_nameو P_locوذﻟﻚ ﺑﺎﺳﺘﺨﺪام
اﻟﻜﻠﻤﺔ Defaultﻓﻌﻨﺪ ﺗﺸﻐﯿﻞ ھﺬا اﻷﺟﺮاء
ﺑﺪون ﺗﻤﺮﯾﺮ ﻗﯿﻢ أﺧﺮى ﻟﮭﺬه اﻟﻤﻌﻄﯿﺎت
ﺳﻮف ﯾﺘﻢ إﺿﺎﻓﺔ اﻟﻘﯿﻢ اﻻﻓﺘﺮاﺿﯿﺔ اﻟﺬي ﺗﻢ
ﺗﻌﯿﯿﻨﮭﺎ ﻟﻤﻌﻄﯿﺎت ھﺬا اﻻﺟﺮاء ﻓﻲ اﻟﺠﺪول
Deptﺗﻠﻘﺎﺋﯿﺎً ﺣﯿﺚ ﯾﺘﻢ إﺿﺎﻓﺔ اﻟﻘﯿﻤﺔ
unknownﻓﻲ اﻟﻌﻤﻮد Dname
واﻟﻘﯿﻤﺔ NEW Yorkﻓﻲ اﻟﻌﻤﻮد Loc
وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ أﻧﮫ ﻻ ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ Defaultﻟﺘﻌﯿﯿﻦ ﻗﯿﻢ اﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﻌﻄﯿﺎت اﻟﺘﻲ ﺗﺴﺘﺨﺪم
اﻷﺳﺎﻟﯿﺐ ]. [Out , IN OUT
ﺗﺘﯿﺢ ﻟﻨﺎ اﻟﻠﻐﺔ PL/SQLإﻣﻜﺎﻧﯿﺔ ﺗﻌﺮﯾﻒ اﻹﺟﺮاءات داﺧﻞ اﻟﻘﺎﻟﺐ اﻟﻠﻐﺔ PL/SQLﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺗﺴﻤﻰ ﺑﺎﻹﺟﺮاءات
اﻹﻗﻠﯿﻤﯿﺔ وﺗﻌﻤﻞ اﻹﺟﺮاءات اﻹﻗﻠﯿﻤﯿﺔ ﻋﻠﻰ ﺗﺒﺴﯿﻂ اﻷﻛﻮاد ووﺿﻮﺣﮭﺎ ﺣﯿﺚ ﺗﻜﺘﺴﺐ ﻧﻔﺲ وﻇﺎﺋﻒ وﺧﺼﺎﺋﺺ اﻟﺒ ﺮاﻣﺞ
اﻟﻔﺮﻋﯿﺔ ﺑﺪﻻً ﻣﻦ إﻧﺸﺎءھﺎ ﺑﻄﺮﯾﻘﺔ ﻣﺴﺘﻘﻠﺔ وﯾﺘﻢ اﺳﺘﺨﺪام ھﺬا اﻟﻨﻮع ﻣ ﻦ اﻟﺒ ﺮاﻣﺞ اﻟﻔﺮﻋﯿ ﺔ ﻓ ﻲ ﻧﻔ ﺲ اﻟﻘﺎﻟ ﺐ وﻻﯾﻤﻜ ﻦ
اﺳﺘﺪﻋﺎءه ﻓﻲ أي ﻗﺎﻟﺐ آﺧﺮ ﺣﯿﺚ ﯾﺘﻢ ﺗﻌﺮﯾﻒ اﻹﺟﺮاءات اﻹﻗﻠﯿﻤﯿﺔ داﺧﻞ اﻟﻘﺴﻢ Declarative Sectionوھﻮ ﻗﺎﻟﺐ
اﻟﻠﻐﺔ PL/SQLوﯾﺠﺐ أن ﯾﺮاﻋﻰ ﻋﻨﺪ ﺗﻌﺮﯾﻒ اﻹﺟﺮاءات اﻹﻗﻠﯿﻤﯿﺔ أن ﺗﻜﻮن آﺧﺮ ﻋﻨ ﺼﺮ ﻣ ﻦ ﻋﻨﺎﺻ ﺮ اﻟﻤﻌﺮﻓ ﺔ ﻓ ﻲ
ھﺬا اﻟﻘﺴﻢ ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ :
ﻓﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﯾﻘﻮم ﺑﻄﺒﺎﻋﺔ اﺳﻢ اﻟﻤﻮﻇﻒ وﺗﺨﺰﯾﻦ رﻗﻢ اﻟﻤﻮﻇﻒ وﺗﺎرﯾﺦ اﻟﯿﻮم وﺳﺎﻋﺔ اﻻﻧﺼﺮاف ﺣﯿﺚ ﯾﺘﻢ
ﺗﻌﺮﯾﻒ اﻹﺟﺮاء Log_execاﻟﺬي ﯾﻌﻤﻞ ﻋﻠﻰ ﺗﺨﺰﯾﻦ رﻗﻢ اﻟﻤﻮﻇﻒ User_idاﻟﺬي ﯾﺘﻢ ﺗﻤﺮﯾﺮه ﻟﻺﺟﺮاء
leave_emp2ﺑﺎﻹﺿﺎﻓﺔ ﻟﻠﺘﺎرﯾﺦ اﻟﻮﻗﺖ اﻟﺤﺎﻟﻲ ﻟﻠﺠﺪول Log_tableوذﻟﻚ ﻓﻲ ﻧﮭﺎﯾﺔ اﻟﻘﺴﻢ Declarative
sectionاﻟﺨﺎﺻﺔ ﺑﺎﻹﺟﺮاء . leave_emp2
أﻣﺎ اﻹﺟﺮاء leave_emp2ﻓﯿﻌﻤﻞ ﻋﻠﻰ ﻃﺒﺎﻋﺔ اﺳﻢ اﻟﻤﻮﻇﻒ ﺛﻢ ﺗﻨﻔﯿﺬ اﻹﺟﺮاء . Log_exec
ﺳﻮف ﻧﺘﻌﻠﻢ ﻓﻲ ھﺬا اﻟﺪرس ﻋﻞ ﻛﯿﻔﯿﺔ ﺣﺬف اﻹﺟﺮاءات ﻣﻦ اﻟﺨﺎدم أوراﻛﻞ Oracle serverوﻟﺤﺬف اﻹﺟﺮاء ﻧﻘﻮم
ﺣﯿﺚ ﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ Drop procedureﯾﻠﯿﮭﺎ اﺳﻢ اﻹﺟﺮاء procedure_nameاﻟﺬي ﻧﺮﯾﺪ ﺣﺬﻓﮫ ﻓﺈذا أردﻧﺎ
وﺑﺘﻨﻔﯿﺬ ھﺬا اﻟﻜﻮد ﺗﻈﮭﺮ اﻟﺮﺳﺎﻟﺔ اﻟﺘﻲ ﺗﺨﺒﺮﻧﺎ ﺑﺄﻧﮫ ﺗﻢ ﺣﺬف اﻹﺟﺮاء
Procedure dropped
Functions
اﻟﻮﻇﺎﺋﻒ :ھﻲ أﺣﺪ أﻧﻮاع اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ Sub-programواﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ اﺳﺘﺮﺟﺎع ﻗﯿﻤﺔ Compute Value
ﻛﻨﺎﺗﺞ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ وھﻲ ﻣﻦ اﻟﻘﺎﻟﺐ اﻟﺘﻲ ﯾﺘﻢ ﺗﻌﯿﯿﻦ أﺳﻤﺎء ﻟﮭﺎ Named Blockواﻟﺘﻲ ﺗﺴﻤﺢ ﻟﮭﺎ ﺑﺘﻤﺮﯾﺮ ﻣﻌﻄﯿﺎت
Parametersوﻋﺎدةً ﻣﺎ ﯾﺘﻢ ﺗﺨﺰﯾﻦ اﻟﻮﻇﺎﺋﻒ ﻓﻲ ﺧﺎدم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت Oracle serverﻟﺬﻟﻚ ﺗﺴﻤﻰ ﺑﺎﻟﻮﻇﺎﺋﻒ
اﻟﻤﺨﺰﻧﺔ Stored functionsﻣﻤﺎ ﯾﺘﯿﺢ ﻟﻨﺎ إﻣﻜﺎﻧﯿﺔ اﺳﺘﺨﺪام ﺑﺼﻮرة ﻣﺘﻜﺮرة ﺣﯿﺚ ﯾﻤﻜﻦ اﺳﺘﺪﻋﺎءھﺎ ﻓﻲ أي ﺑﺮﻧﺎﻣﺞ
آﺧﺮ ﻛﻤﺎ ﯾﻤﻜﻦ ﺗﺤﺪﯾﺜﮭﺎ وﺻﯿﺎﻧﺔ اﻟﺒﺮاﻣﺞ ﺑﺴﮭﻮﻟﺔ واﻟﮭﯿﻜﻞ اﻟﺒﻨﺎﺋﻲ ﻟﻠﻮﻇﺎﺋﻒ ﯾﺸﺒﮫ اﻟﮭﯿﻜﻞ اﻟﺒﻨﺎﺋﻲ ﻟﻺﺟﺮاءات ﺗﻤﺎﻣﺎ ً ﻓﯿﻤﺎ
ﻋﺪا أن اﻟﻮﻇﺎﺋﻒ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻌﺒﺎرة Returnﺣﯿﺚ ﯾﺘﻜﻮن ﺑﻨﺎء اﻟﻮﻇﯿﻔﺔ ﻋﻠﻰ ﻗﺴﻤﯿﻦ رﺋﯿﺴﯿﯿﻦ -:
Specification Part Header – ١اﻟﻘﺴــــــــــــــــــــــــــــﻢ
واﻟﺬي ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮫ ﻟﺘﺤﺪﯾﺪ اﺳﻢ اﻟﻮﻇﯿﻔﺔ Function Nameوﻗﺎﺋﻤﺔ اﻟﻤﻌﻄﯿﺎت Parametersﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ
اﻟﻌﺒﺎرة . Return
– ٢اﻟﻘﺴـــــــــــــــــــــــــــــﻢ Function Body
وﯾﻨﻘﺴﻢ إﻟﻰ ﺛﻼﺛﺔ أﻗﺴﺎم :
1] Declarative Section
2] Executable Section
3] Exception Section
واﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻹﻧﺸﺎء اﻟﻮﻇﺎﺋﻒ Functionsﻓﻲ اﻟﻠﻐﺔ PL/SQLھﻲ ﻛﺎﻟﺘﺎﻟﻲ:
ﻓﻲ اﻟﻤﺜﺎل اﻟﺴﺎﺑﻖ ﯾﺴﺘﺨﺪم اﻟﻜﻮد ﻹﻧﺸﺎء وﻇﯿﻔﺔ ﻟﮭﺎ أﺳﻢ ger_first_nameﺣﯿﺚ ﺗﻌﻤﻞ ﻋﻠﻰ اﺳﺘﺮﺟﺎع اﺳﻢ
اﻟﻤﻮﻇﻒ ﺑﺪﻻﻟﺔ رﻗﻢ اﻟﻤﻮﻇﻒ P_idواﻟﺬي ﯾﺘﻢ ﺗﻤﺮﯾﺮه ﻛﻤﻌﻄﻰ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ وﻧﻼﺣﻆ ھﺬا إن اﻟﻜﻠﻤﺔ Returnﺗﻈﮭﺮ
ﻣﺮﺗﯿﻦ داﺧﻞ اﻟﻜﻮد ﻣﺮة ﻓﻲ اﻟﻘﺴﻢ Headerﺣﯿﺚ ﯾﺘﻢ ﺗﻌﯿﯿﻦ ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﺘﻘﻮم ھﺬه اﻟﻮﻇﯿﻔﺔ ﺑﺎﺳﺘﺮﺟﺎﻋﮫ
واﻟﻤﺮة اﻟﺜﺎﻧﯿﺔ ﺑﻌﺪ اﻻﺳﺘﻌﻼم ﻋﻦ اﻟﻘﺴﻢ Function Bodyوذﻟﻚ ﻟﺘﻤﺮﯾﺮ اﻟﻘﯿﻤﺔ اﻟﻨﺎﺗﺠﺔ ﻣﻦ اﻟﻮﻇﯿﻔﺔ
V_first_nameإﻟﻰ اﻟﻤﺴﺘﺨﺪم وھﻲ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﻋﺒﺎرة ﻋﻦ أﺳﻢ اﻟﻤﻮﻇﻒ وﻟﺘﻨﻔﯿﺬ ھﺬا اﻟﻜﻮد ﻧﻀﻐﻂ ﻋﻠﻰ
واﻟﺘﻲ ﺗﺪل ﻋﻠﻰ أﻧﮫ ﺗﻢ إﻧﺸﺎء اﻟﻮﻇﯿﻔﺔ اﻟﻤﻔﺘﺎح Enterﻓﺘﻈﮭﺮ ﻟﻨﺎ اﻟﺮﺳﺎﻟﺔ Function Created :
واﻵن ﻧﻘﻮم ﺑﺘﻌﺮﯾﻒ ﻣﺘﻐﯿﺮ ﻟﺘﺨﺰﯾﻦ اﻟﻘﯿﻤﺔ اﻟﻨﺎﺗﺠﺔ ﻣﻦ اﻟﻮﻇﯿﻔﺔ ﺑﮫ .وذﻟﻚ ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺠﻤﻠـــــــــــﺔ:
;)Variable get_name varchar2(10
وﻟﻼﺳﺘﺪﻋﺎء اﻟﻮﻇﯿﻔﺔ اﻟﺬي ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎدھﺎ داﺧﻞ اﻟﻜﻮد ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﺘﻌﺒﯿــــــــﺮ :
;)EXECUTE :get_name :=get_first_name(100
ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻷﻣﺮ EXECUTEﯾﻠﯿﮭﺎ أﺳﻢ اﻟﻤﺘﻐﯿﺮ get_nameاﻟﺬي ﻧﺮﯾﺪ ﺗﺨﺰﯾﻦ ﻧﺎﺗﺞ اﻟﻮﻇﯿﻔﺔ ﺛﻢ اﻟﻌﻼﻣﺔ
ﯾﺴﺎوي = ﯾﻠﯿﮭﺎ أﺳﻢ اﻟﻮﻇﯿﻔﺔ اﻟﺬي ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ get_first_nameﯾﻠﯿﮭﺎ رﻗﻢ اﻟﻤﻮﻇﻒ ) (100اﻟﺬي ﻧﺮﯾﺪ ﺗﻤﺮﯾﺮه
ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ﺛﻢ ﻧﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح Enterﻓﯿﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻜﻮد وﺗﻈﮭﺮ ھﺬه اﻟﺮﺳﺎﻟﺔ :
PL/SQL procedure successfully completed
واﻟﺘﻲ ﺗﺪل ﻋﻠﻰ أﻧﮫ ﺗﻢ ﺗﻨﻔﯿﺬ اﻟﻮﻇﯿﻔﺔ ﺑﻨﺠﺎح .
وﻟﻌﺮض اﻟﻘﯿﻤﺔ اﻟﻨﺎﺗﺠﺔ ﻣﻦ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ Printﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ:
;Print get_name
ﯾﻘﻮم ﺑﺈﻧﺸﺎء وﻇﯿﻔﺔ ﻟﮭﺎ اﻻﺳﻢ Taxوﯾﺘﻢ ﺗﻤﺮﯾﺮ ﻣﻌﻄﻰ واﺣﺪ P_valueﻓﻘﻂ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت
Numberوﺗﻌﻤﻞ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻋﻠﻰ ﺿﺮب ﻣﻘﺪار اﻟﻀﺮﯾﺒﺔ ﻓﻲ اﻟﻘﯿﻤﺔ اﻟﺘﻲ ﯾﺘﻢ ﺗﻤﺮﯾﺮھﺎ ] [P_valueﻟﮭﺬه
اﻟﻮﻇﯿﻔﺔ وﻛﻤﺎ ﻧﺮى ﻓﻲ اﻟﻜﻮد أﻧﮫ ﯾﻤﻜﻦ اﺳﺘﺪﻋﺎء اﻟﻮﻇﯿﻔﺔ taxداﺧﻞ اﻟﺠﻤﻠﺔ Selectﺣﯿﺚ ﯾﺘﻢ ﺗﻤﺮﯾﺮ ﻗﯿﻤﺔ اﻟﺤﻘﻞ
Salaryﻛﻤﻌﻄﻰ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ Taxوذﻟﻚ ﻟﺤﺴﺎب ﻣﻘﺪار اﻟﻀﺮﯾﺒﺔ اﻟﺨﺎﺻﺔ ﺑﺮواﺗﺐ اﻟﻤﻮﻇﻔﯿﻦ وﯾﻤﻜﻦ اﺳﺘﺨﺪام
اﻟﻮﻇﺎﺋﻒ Functionﻓﻲ ﻛﻼ ﻣﻦ اﻟﻌﺒﺎرات -:
- Where
-Having
- Connect By
- Start with
- Order By
- Group By
ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ اﺳﺘﺨﺪاﻣﮭﺎ ﻣﻊ اﻟﺠﻤﻠﺔ Insertﻓﻲ اﻟﻌﺒﺎرة ، Valuesواﻟﺠﻤﻠﺔ Updateﻣﻊ اﻟﻌﺒﺎرة Setﻓﻔﻲ اﻟﻜﻮد
اﻟﺘﺎﻟﻲ-:
SQL
ﻋﻨﺪ اﺳﺘﺪﻋﺎء اﻟﻮﻇﺎﺋﻒ ﻓﻲ أي ﺗﻌﺒﯿﺮ SQLﯾﺠﺐ اﺳﺘﺨﺪام اﻟﻄﺮﯾﻘﺔ Position Notationﻟﺘﻤﺮﯾﺮ ﻗﯿﻢ ﻣﻌﻄﯿﺎت
. Parameters
Position Notation Parameters Data type SQL
وﻛﺬﻟﻚ ﻻﺑﺪ أن ﯾﻜﻮن ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﻤﺴﺘﺨﺪم ﻟﺘﻌﺮﯾﻒ اﻟﻤﻌﻄﯿﺎت ھﻮ ﻧﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻠﻐﺔ SQL
ﻛﻤﺎ ﯾﺠﺐ ﻋﺪم اﺳﺘﺨﺪام أي ﻣﻦ أﺳﺎﻟﯿﺐ اﻟﺘﻤﺮﯾﺮ OUT Or INOUTﻣﻊ أي ﻣﻦ ﻣﻌﻄﯿﺎت اﻟﻮﻇﺎﺋﻒ اﻟﺘﻲ ﯾﺠﺐ
اﺳﺘﺨﺪاﻣﮭﺎ ﻓﻲ ﺗﻌﺒﯿﺮات اﻟﻠﻐﺔ PL/SQLﻛﻤﺎ ﻻﯾﻤﻜﻦ اﺳﺘﺪﻋﺎء اﻟﻮﻇﺎﺋﻒ ﻣﻊ اﻟﻘﯿﺪ Checkاﻟﺨﺎﺻﺔ ﺑﺎﻟﺠﻤﻞ :
-Create table
-Alter table
وﻟﻜﻲ ﯾﺘﻢ اﻟﺴﻤﺎح ﻟﻠﻤﺴﺘﺨﺪم ﺑﺎﺳﺘﺨﺪام اﻟﻮﻇﺎﺋﻒ ﻓﻲ ﺗﻌﺒﯿﺮات اﻟﻠﻐﺔ SQLﯾﺠﺐ أن ﯾﻜﻮن ﻟﮫ ﺣﻖ اﻻﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ
EXECUTEوﻋﻨﺪ اﺳﺘﺪﻋﺎء اﻟﻮﻇﺎﺋﻒ ﻓﻲ ﺗﻌﺒﯿﺮات اﻟﻠﻐﺔ SQLﻻﺑﺪ ﻣﻦ ﻗﯿﺎم ﺧﺎدم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت Oracle
serverﻣﻦ اﻟﺘﺄﻛﺪ ﻣﻦ ﻋﺪم اﺣﺘﻮاء ھﺬه اﻟﻮﻇﺎﺋﻒ ﻋﻠﻰ أي أﺿﺮار ﺟﺎﻧﺒﯿﺔ Side Effectsﺑﻤﻌﻨﻰ أﻧﮫ ﻻ ﯾﺘﻢ اﻟﺴﻤﺎح
ﻟﻠﻮﻇﺎﺋﻒ ﺑﺈﺟﺮاء أي ﺗﻌﺒﯿﺮات ﻋﻠﻰ ﺟﺪاول ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﺣﯿﺚ ﻻﯾﻤﻜﻦ ﻟﻠﻮﻇﺎﺋﻒ ﺑﺎﻟﻘﯿﺎم ﺑﺘﻌﺪﯾﻞ ﻋﻠﻰ ﺟﺪاول ﻗﻮاﻋﺪ
اﻟﺒﯿﺎﻧﺎت ﻋﻨﺪ اﺳﺘﺪﻋﺎءھﺎ ﻓﻲ اﻟﺠﻤﻞ-:
Select، Update ، Delete
وﻋﻨﺪ اﺳﺘﺨﺪام اﻟﻮﻇﺎﺋﻒ ﻣﻊ اﻟﺠﻤﻞ Updateأو Deleteﻻﯾﻤﻜﻦ إﺟﺮاء اﺳﺘﻌﻼم أو ﺗﻌﺪﯾﻞ ﻋﻠﻰ ﺟﺪاول ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت
اﻟﺘﻲ ﯾﺘﻢ ﻣﻌﺎﻟﺠﺘﮭﺎ ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺠﻤﻞ ﻛﻤﺎ ﻻﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﻮﻇﺎﺋﻒ ﻓﻲ ﺗﻨﻔﯿﺬ أي ﺟﻤﻠﺔ ﻣﻦ اﻟﻘﻮاﻋﺪ اﻟﺘﺎﻟﯿﺔ-:
• اﻟﺘﺤﻜﻢ ﻓﻲ اﻹﺟﺮاءات Transaction Control
• اﻟﺘﺤﻜﻢ ﻓﻲ اﻟﻔﺘﺮة اﻟﺰﻣﻨﯿﺔSession Control
• اﻟﺘﺤﻜﻢ ﻓﻲ اﻟﻨﻈﺎم System Control
• وأﯾﻀﺎ ﻻﯾﻤﻜﻦ ﺗﻨﻔﯿﺬ أي ﺟﻤﻠﺔ ﻣﻦ ﺟﻤﻞ اﻟﺘﻌﺮﯾﻒ Data Definition Language
Data Definition Language Commit
وذﻟﻚ ﻷﻧﮭﺎ ﺗﻌﻤﻞ ﻋﻠﻰ ﺗﺜﺒﯿﺖ اﻹﺟﺮاءات ﺗﻠﻘﺎﺋﯿﺎً ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ Commitﻛﻤﺎ ﻻ ﯾﻤﻜﻦ أﯾﻀﺎ اﺳﺘﺨﺪام أي وﻇﯿﻔﺔ
ﺗﺤﺘﻮي ﻋﻠﻰ وﻇﯿﻔﺔ أﺧﺮى ﺗﻘﻮم ﺑﻜﺴﺮ ھﺬه اﻟﻘﻮاﻋﺪ.
Function Procedure
ﻟﺤﺬف اﻟﻮﻇﺎﺋﻒ ﻣﻦ ﺧﺎدم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت Oracle serverﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ :
;Drop Function function_name
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑــ Drop Functionﯾﻠﯿﮭﺎ أﺳﻢ اﻟﻮﻇﯿﻔﺔ اﻟﻤﺮاد ﺣﺬﻓﮭﺎ function_nameﺣﯿﺚ ﯾﺠﺐ ﻣﻌﺮﻓﺔ
أن اﻟﺠﻤﻠﺔ Drop Functionﺗﻌﻤﻞ أﯾﻀﺎ ﻋﻠﻰ إﻟﻐﺎء ﺟﻤﯿﻊ اﻻﻣﺘﯿﺎزات اﻟﻤﺘﻌﻠﻘﺔ ﺑﮭﺬه اﻟﻮﻇﯿﻔﺔ ﻓﺈذا أردﻧﺎ ﺣﺬف
اﻟﻮﻇﯿﻔﺔ taxﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد -:
;Drop Function tax
Create OR Replace ﻛﻤﺎ ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ -:
ﻛﻮﺳﯿﻠﺔ ﻣﻜﺎﻓﺌﺔ ﻟﻌﻤﻠﯿﺔ اﻟﺤﺬف ﺣﯿﺚ ﺗﻌﻤﻞ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻋﻠﻰ ﺣﺬف اﻟﻮﻇﯿﻔﺔ وإﻋﺎدة إﻧﺸﺎءھﺎ ﻣﺮة أﺧﺮى وﺗﻌﻤﻞ ﺟﻤﻠﺔ
Replaceﻋﻠﻰ ﻧﻘﻞ ﺟﻤﯿﻊ اﻻﻣﺘﯿﺎزات اﻟﻤﺘﻌﻠﻘﺔ ﺑﮭﺬه اﻟﻮﻇﯿﻔﺔ إﻟﻰ ﻣﺴﺘﺨﺪﻣﯿﻦ آﺧﺮﯾﻦ ﺑﺪون أي ﺗﻐﯿﯿﺮ.
اﻟﻔﺮق ﺑﯿﻦ اﻹﺟﺮاءات واﻟﻮﻇﺎﺋﻒ؟
اﻹﺟﺮاءات : Proceduresﺗﺴﺘﺨﺪم ﻟﺘﺨﺰﯾﻦ ﺳﻠﺴﻠﺔ ﻣﻦ اﻷﻋﻤﺎل اﻟﺘﻲ ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻓﯿﻤﺎ ﺑﻌﺪ وﯾﻤﻜﻦ أن ﺗﺤﺘﻮي
اﻹﺟﺮاءات ﻋﻠﻰ اﻟﻌﺪﯾﺪ ﻣﻤﻦ اﻟﻤﻌﻄﯿﺎت Parametersاﻟﺘﻲ ﺗﺴﻤﺢ ﺑﻨﻘﻞ اﻟﻘﯿﻢ ﻣﻦ واﻟﻰ ﺑﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ ﻛﻤﺎ أن
اﻹﺟﺮاءات ﻻ ﺗﻘﻮم ﺑﺎﺳﺘﺮﺟﺎع ﻗﯿﻢ ﻟﺒﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ.
اﻟﻮﻇﺎﺋﻒ : Functionsﺗﺴﺘﺨﺪم ﻟﺤﺴﺎب ﻗﯿﻢ ﻣﻌﯿﻨﺔ Compute Valueواﻟﺘﻲ ﻻﺑﺪ ﻣﻦ إﻋﺎدﺗﮭﺎ ﻟﺒﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ
وﯾﻤﻜﻦ أن ﺗﺤﺘﻮي اﻟﻮﻇﺎﺋﻒ ﻋﻠﻰ اﻟﻤﻌﻄﯿﺎت أو ﻻ ﺗﺤﺘﻮي ﻋﻠﻰ أي ﻣﻌﻄﻰ Parameterﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ ﺗﻠﻚ اﻟﻔﺮوق
ﯾﻮﺟﺪ اﻟﻌﺪﯾﺪ ﻣﻦ اﻻﺧﺘﻼﻓﺎت اﻷﺧﺮى ﻛﻤﺎ ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ :
Privileges
ﺗﻨﻘﺴﻢ اﻻﻣﺘﯿﺎزات إﻟﻰ ﻗﺴﻤﯿﻦ :
-١اﻣﺘﯿﺎزات اﻟﻨﻈﺎم System Privileges
-٢اﻣﺘﯿﺎزات اﻟﻌﻨﺎﺻﺮ Object Privileges
وﺗﻌﺘﺒﺮ اﻣﺘﯿﺎزات اﻟﻨﻈﺎم ھﻲ اﻻﻣﺘﯿﺎزات اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺴﺘﺨﺪﻣﯿﻦ واﻟﺘﻲ ﯾﺘﻢ ﻣﻨﺤﮭﺎ ﻟﮭﻢ ﺑﻮاﺳﻄﺔ أي ﻣﻦ اﻟﻤﺴﺘﺨﺪﻣﯿﻦ
Systemأو Sysﻓﻘﻂ وھﻲ أﻛﺜﺮ ﻣﻦ 80اﻣﺘﯿﺎز وﺑﺼﻔﺔ ﻋﺎﻣﺔ ﻓﺈن أي اﻣﺘﯿﺎز ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﻜﻠﻤﺔ Createأو
Anyھﻮ ﻋﺒﺎرة ﻋﻦ اﻣﺘﯿﺎزات اﻟﻨﻈﺎم ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل اﻟﻜﻮد اﻟﺘﺎﻟﻲ:
; Grant Alter any Table to Alsaeedi
ھﻮ ﻋﺒﺎرة ﻋﻦ اﻣﺘﯿﺎز اﻟﻨﻈﺎم ﯾﺘﻢ ﻣﻨﺤﮫ ﺑﻮاﺳﻄﺔ أي ﻣﻦ اﻟﻤﺴﺘﺨﺪﻣﯿﻦ Systemأو Sysﺣﯿﺚ ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ
Anyﺑﻌﺪ اﺳﻢ اﻻﻣﺘﯿﺎز . Alter
أﻣﺎ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻼﻣﺘﯿﺎزات اﻟﻌﻨﺎﺻﺮ ﻓﮭﻲ ﺧﺎﺻﺔ ﺑﻌﻨﺎﺻﺮ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت Schemaﻣﺜﻞ :
] [Sequences,view,index,Tableوداﺋﻤﺎ ﻣﺎ ﺗﺘﻀﻤﻦ اﺳﻢ اﻟﻌﻨﺼﺮ وﯾﺘﻢ ﻣﻨﺢ ھﺬه اﻻﻣﺘﯿﺎزات ﻣﻦ ﻗﺒﻞ ﻣﺎﻟﻚ ھﺬه
اﻟﻌﻨﺎﺻﺮ Ownerﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻟﻤﻨﺢ اﻣﺘﯿﺎز اﻟﺘﻌﺪﯾﻞ ﻟﻠﻤﺴﺘﺨﺪم Alsaeediﻋﻠﻰ ﺟﺪول اﻟﻤﻮﻇﻔﯿﻦ ﻓﻲ ﻗﺎﻋﺪة
اﻟﺒﯿﺎﻧﺎت وﻟﺘﻜﻦ Companyﯾﺘﻢ ﻣﻨﺢ ھﺬه اﻻﻣﺘﯿﺎزات ﻣﻦ ﺧﻼل اﻟﻤﺴﺘﺨﺪم ﻛﻤﺎ ﻓﻲ اﻟﻜﻮد:
;Grant Alter On employees to Alsaeedi
وھﻨﺎ ﯾﺠﺐ أن ﻧﺬﻛﺮ ﻹﻧﺸﺎء اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻻﺑﺪ ﻣﻦ اﻣﺘﻼك اﻻﻣﺘﯿﺎز Create procedureوذﻟﻚ ﻟﺴﻤﺎح ﻟﻠﻤﺴﺘﺨﺪم
ﺑﺘﻌﺪﯾﻞ وﺣﺬف اﻟﺒﺮاﻣﺞ PL/SQLﺑﺪون اﻟﺤﺎﺟﺔ ﻷي اﻣﺘﯿﺎزات إﺿﺎﻓﯿﺔ.
وﻓﻲ ﺣﺎﻟﺔ اﺣﺘﻮاء ھﺬه اﻟﺒﺮاﻣﺞ ﻋﻠﻰ ﻋﻨﺎﺻﺮ ﻣﻦ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أﺧﺮى ﻓﻼﺑﺪ أن ﯾﻜﻮن ﻟﻚ اﻣﺘﯿﺎز اﻟﻮﺻﻮل اﻟﻰ ھﺬه
اﻟﻌﻨﺎﺻﺮ ﺑﻄﺮﯾﻘﺔ ﻣﺒﺎﺷﺮة وﻟﯿﺲ ﻣﻦ ﺧﻼل ﻣﺠﻤﻮﻋﺔ ﻋﻨﺎﺻﺮ اﻣﺘﯿﺎزات Rollوﯾﺠﺐ ﻣﻼﺣﻈﺔ اﻧﮫ ﻋﻨﺪ اﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ
Anyﻋﻨﺪ ﻣﻨﺢ اﻻﻣﺘﯿﺎز ﻓﺄﻧﮫ ﯾﻤﻜﻨﻚ -:
Create إﻧﺸﺎء
Alter أو ﺗﻌﺪﯾﻞ
أو ﺣﺬف
Delete
أو ﺗﺸﻐﯿﻞ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ
EXECUTE
اﻟﺘﻲ ﺗﻤﺘﻠﻜﮭﺎ أو اﻟﻤﻮﺟﻮدة ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أﺧﺮى ﻛﻤﺎ ﯾﺠﺐ اﻟﻤﻼﺣﻈﺔ أﻧﮫ ﺑﺘﻨﻔﯿﺬ أي ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ PL/SQL
Sub-programﻻﺗﻤﺘﻠﻜﮫ ﻓﯿﺠﺐ أن ﯾﻜﻮن ﻟﺪﯾﻚ اﻻﻣﺘﯿﺎز EXECUTEﻋﻠﻰ ھﺬه اﻟﻌﻨﺎﺻﺮ وذﻟﻚ ﻓﻲ ﺣﺎﻟﺔ ﻋﺪم
اﻣﺘﻼك . EXECUTE Any
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ إدارة اﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ ﻓﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت PL/SQLأو Procedure
أو اﻟﺘﻄﺒﯿﻘﺎت .وﻹدارة ھﺬه اﻟﻌﻨﺎﺻﺮ ﻻﺑﺪ ﻣﻦ ﻣﻌﺮﻓﺔ ﺑﻌﺾ اﻟﻤﻌﻠﻮﻣﺎت ﻋﻨﮭﺎ وھﺬه اﻟﻤﻌﻠﻮﻣﺎت ﻋﺒﺎرة ﻋﻦ :
• ﻣﻌﻠﻮﻣﺎت ﻋﺎﻣﺔ ﻋﻦ اﻟﻌﻨﺎﺻﺮ General Information
• ﻣﻌﻠﻮﻣﺎت ﻋﻦ اﻻﻛﻮاد اﻷﺳﺎﺳﯿﺔ ﻟﮭﺬه اﻟﻌﻨﺎﺻﺮ Source Code
• ﻣﻌﻠﻮﻣﺎت ﻋﻦ اﻟﻤﻌﻄﯿﺎت Parameters
• ﻣﻌﻠﻮﻣﺎت ﻋﻦ اﻷﺧﻄﺎء اﻟﺘﻲ ﺗﻤﺖ ﺧﻼل ﻋﻤﻠﯿﺔ اﻟﺘﻨﻔﯿﺬ Compilation Error
• ﻣﻌﻠﻮﻣﺎت ﺧﺎﺻﺔ ﺑﻜﯿﻔﯿﺔ ﺗﺘﺒﻊ اﻷﺧﻄﺎء أﺛﻨﺎء ﻣﺮﺣﻠﺔ اﻟﺘﻨﻔﯿﺬ
وﻹﯾﺠﺎد ﻣﺜﻞ ھﺬه اﻟﻤﻌﻠﻮﻣﺎت ﯾﺘﻢ اﺳﺘﺨﺪام ﺑﻌﺾ اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ Viewاﻟﻤﻮﺟﻮدة ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻋﻠﻰ ﺳﺒﯿﻞ
اﻟﻤﺜﺎل ﻟﻠﻮﺻﻮل إﻟﻰ اﻟﻤﻌﻠﻮﻣﺎت اﻟﻌﺎﻣﺔ اﻟﺨﺎﺻﺔ ﺑﺎﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ ﻓﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﺠﺪول
اﻟﺘﺨﯿﻠﻲ USER_Objectsﻓﺎﻟﻌﺮض اﻷرﻗﺎم اﻟﺘﺴﻠﺴﻠﯿﺔ واﻷﺳﻤﺎء اﻟﺨﺎﺻﺔ ﺑﺠﻤﯿﻊ اﻹﺟﺮاءات واﻟﺪوال اﻟﻤﺨﺰﻧﺔ ﻓﻲ
ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت Scottﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد -:
Select Object_id , Object_name
From User_Objects
;)'Where Object_type IN('PROCEDURE','FUNCTION
ﺣﯿﺚ ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﺠﺪول User_Objectsﻟﻼﺳﺘﺮﺟﺎع ﻛﻼ ﻣﻦ اﻷﻋﻤﺪة Object_idو Object_name
وﺗﺴﺘﺨﺪم اﻟﺠﻤﻠﺔ Whereﻟﻌﻤﻞ ﺗﺼﻔﯿﺔ ﻟﻠﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻹﺟﺮاءات واﻟﻮﻇﺎﺋﻒ ﻓﻘﻂ وذﻟﻚ ﺑﻤﻌﻠﻮﻣﯿﺔ ﻧﻮع اﻟﻌﻨﺼﺮ
Object_typeﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ اﻟﺤﺼﻮل ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت إﺿﺎﻓﯿﺔ ﻋﻦ ھﺬه اﻟﻌﻨﺎﺻﺮ ﻣﻦ ﺧﻼل اﻟﺠﺪول User_Objects
وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺤﻘﻮل اﻟﻤﺨﺘﻠﻔﺔ ﻓﻲ ھﺬا اﻟﺠﺪول وﻟﻌﺮض ﺗﻔﺎﺻﯿﻞ اﻟﺤﻘﻮل اﻟﻤﻮﺟﻮدة ﺑﮭﺬا اﻟﺠﺪول ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام
اﻷﻣﺮ . Desc User_Objects :أﻣﺎ اﻟﺠﺪول User_Sourceﻓﯿﻘﻮم ﺑﺘﺨﺰﯾﻦ اﻟﻤﻌﻠﻮﻣﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻷﻛﻮاد
اﻷﺳﺎﺳﯿﺔ ب Source Codeﻟﻠﻌﻨﺎﺻﺮ وﯾﺤﺘﻮي ھﺬا اﻟﺠﺪول ﻋﻠﻰ اﻷﻋﻤﺪة Nameو Textو Typeو
Lineواﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت ﻋﻦ أﺳﻢ وﻧﻮع اﻟﻌﻨﺼﺮ واﻟﻜﺘﺎﺑﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻻ ﻛﻮاد اﻷﺳﺎﺳﯿﺔ ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ ﻋﺪد
أﺳﻄﺮ ھﺬه اﻟﻜﺘﺎﺑﺎت ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻋﺮض اﻟﻜﻮد اﻷﺳﺎﺳﻲ ﻟﻺﺟﺮاء LOG_EXECUTIONاﻟﺬي
ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ ﻣﻦ ﻗﺒﻞ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد -:
Alsaeedi999@hotmail.com ٣٧ أﻋﺪاد /ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي
ﻓﻲ ﺑﻌﺾ اﻷﺣﯿﺎن ﻗﺪ ﻧﺤﺘﺎج إﻟﻰ ﻋﺮض اﻷﺧﻄﺎء اﻟﺘﻲ ﺣﺪﺛﺖ أﺛﻨﺎء ﻋﻤﻠﯿﺔ ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ وﻟﻌﻤﻞ ذﻟﻚ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام
اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ User_Errorsواﻟﺬي ﯾﻌﻤﻞ ﻋﻠﻰ ﺗﺨﺰﯾﻦ اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﺒﯿﺎﻧﺎت ﻛﻤﺎ ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ -:
وﻟﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﺳﺘﻌﺮاض اﻟﻤﻌﻠﻮﻣﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻷﺧﻄﺎء اﻟﺘﻲ ﻗﺪ ﺗﺤﺪث أﺛﻨﺎء ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ ﻧﻘﻮم ﺑﺘﺸﻐﯿﻞ ھﺬا
اﻟﻜﻮد -:
ﻓﻌﻨﺪ اﻟﻀﻐﻂ ﻋﻠﻰ اﻟﻤﻔﺘﺎح Enterﺗﻈﮭﺮ ﻟﻨﺎ ﻋﺪة أﺧﻄﺎء ﻧﺘﯿﺠﺔ ﺗﺸﻐﯿﻞ ھﺬا اﻟﻜﻮد وﻟﻌﺮض اﻟﺘﻔﺎﺻﯿﻞ اﻟﺨﺎﺻﺔ ﺑﮭﺬه
اﻷﺧﻄﺎء واﻟﺴﻄﺮ اﻟﻤﺴﺒﺐ ﻓﻲ ﻇﮭﻮر ھﺬا اﻟﺨﻄﺄ وﻣﻮﺿﻊ اﻟﺨﻄﺄ داﺧﻞ ھﺬا اﻟﺴﻄﺮ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد-:
وﻟﻌﺮض ﺗﻔﺎﺻﯿﻞ أي ﻣﻌﻄﯿﺎت ﺧﺎﺻﺔ ﻣﻦ اﻟﻌﻨﺎﺻﺮ اﻟﻤﺨﺰﻧﺔ ﺑﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻷﻣﺮ :
Desc Object_name
ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻋﺮض ﺗﻔﺎﺻﯿﻞ اﻟﻤﻌﻄﯿﺎت اﻟﺘﻲ ﯾﺘﻢ ﺗﻤﺮﯾﺮھﺎ ﻟﻺﺟﺮاء LOG_EXECUTIONﻧﻘﻮم
Desc LOG_EXECUTION ﺑﻜﺘﺎﺑﺔ اﻟﻜﻠﻤﺔ -:
وﺑﺘﺸﻐﯿﻞ ھﺬا اﻟﻜﻮد ﻧﻼﺣﻆ اﻧﮫ ﺗﻢ ﻋﺮض ﺛﻼﺛﺔ أﻋﻤﺪة :
]1
]2
]3
]4
]5
]6
]7
]8
]9
]1
]10
]11
ھﺬا اﻟﻜﻮد ﯾﺴﺘﺨﺪم ﻹﯾﺠﺎد اﻟﻤﻀﺮوب Factorialﻟﻠﺮﻗﻢ اﻟﺬي ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺈدﺧﺎﻟﮫ ﻋﻨﺪ ﺗﺸﻐﯿﻞ اﻟﺒﺮﻧﺎﻣﺞ
وﻣﻀﺮوب أي رﻗﻢ ھﻮ ﻋﺒﺎرة ﻋﻦ ﺣﺎﺻﻞ ھﺬا اﻟﺮﻗﻢ ﻓﻲ ﻣﻀﺮوب اﻟﺮﻗﻢ اﻟﺬي ﯾﺴﺒﻘﮫ :
ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء ﺣﻠﻘﺔ ﺗﻜﺮارﯾﺔ ﻓﻲ اﻟﺴﻄﺮ 5ﻹﯾﺠﺎد ﻣﻀﺮوب اﻟﺮﻗﻢ اﻟﺬي ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺈدﺧﺎﻟﮫ ،وﺗﺴﺘﺨﺪم ھﺬه اﻟﻤﻌﺎدﻟﺔ ﻓﻲ اﻟﺴﻄﺮ 6
داﺧﻞ اﻟﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﻟﺤﺴﺎب ﻣﻀﺮوب اﻟﺮﻗﻢ iداﺧﻞ اﻟﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﻓﻔﻲ اﻟﺪورة اﻷوﻟﻰ ﻟﻠﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﺗﻜﻮن ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ i=1
وﺑﺎﻟﺘﺎﻟﻲ ﯾﺘﻢ ﺣﺴﺎب ﻣﻀﺮوب 1وھﻮ 1ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺣﯿﺚ أن اﻟﻘﯿﻤﺔ اﻻﻓﺘﺮاﺿﯿﺔ ﻟﻠﻤﺘﻐﯿﺮ Factorial = 1وﻓﻲ اﻟﺪورة اﻟﺜﺎﻧﯿﺔ
ﻟﻠﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﺗﺼﺒﺢ ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ i=2وﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺳﻮف ﯾﺘﻢ ﺣﺴﺎب اﻟﻤﻀﺮو ب 2وھﻮ ﻋﺒﺎرة ﻋﻦ ﺿﺮب ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ
i=2*1وﯾﺘﻢ ﺗﻜﺮار ﺗﻨﻔﯿﺬ اﻟﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﺑﻨﻔﺲ اﻟﻄﺮﯾﻘﺔ إﻟﻰ أن ﺗﺼﻞ ﻗﯿﻤﺔ اﻟﻤﺘﻐﯿﺮ iإﻟﻰ اﻟﻘﯿﻤﺔ اﻟﺘﻲ ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺈدﺧﺎﻟﮭﺎ ﻛﻤﺎ ﻓﻲ
اﻟﺴﻄﺮ 7ﻓﯿﺘﻢ اﻟﺨﺮوج ﻣﻦ اﻟﺤﻠﻘﺔ اﻟﺘﻜﺮارﯾﺔ ﻓﻲ اﻟﺴﻄﺮ 9وﻟﺘﺘﺒﻊ ﺧﻄﻮات اﻟﻘﯿﻤﺔ اﻟﺘﻜﺮارﯾﺔ ﺑﺤﯿﺚ ﺗﻈﮭﺮ رﺳﺎﻟﺔ ﺗﺸﯿﺮ إﻟﻰ رﻗﻢ اﻟﺬي ﯾﺘﻢ
إﯾﺠﺎد اﻟﻤﻀﺮوب ﻟﮫ ﻓﻲ ھﺬه اﻟﺨﻄﻮة وﻗﯿﻤﺔ ﻣﻀﺮوب ھﺬا اﻟﺮﻗﻢ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ . 8
Bodiless Body
ھﻲ ﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺎت ﺑﺮﻣﺠﯿﺔ ﻻ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻘﺴﻢ Bodyﻓﮭﻲ ﺗﻌﺘﻤﺪ ﻋﻠﻰ اﻟﻘﺴﻢ Specificationﻓﻘﻂ ﻓﻲ
ﺗﻌﺮﯾﻒ اﻟﻤﺘﻐﯿﺮات واﻟﺜﻮاﺑﺖ واﻻﺳﺘﺜﻨﺎ ءات :
Variable
Constants
Exceptions
وﻻ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻘﺴﻢ Bodyوذﻟﻚ ﻟﻌﺪم اﺣﺘﻮاﺋﮭﺎ ﻋﻠﻰ ﺑﺮاﻣﺞ ﻓﺮﻋﯿﺔ وﯾﺴﺘﺨﺪم ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﺠﻤﻮﻋﺎت
اﻟﺒﺮﻣﺠﯿﺔ ﻋﺎدة ً ﻓﻲ ﺗﻌﺮﯾﻒ ﺑﻌﺾ اﻟﻤﺘﻐﯿﺮات واﻟﺜﻮاﺑﺖ اﻟﻌﺎﻣﺔ-:
Public Constants and variable
اﻟﺘﻲ ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮭﺎ ﺑﻄﺮﯾﻘﺔ ﻣﺘﻜﺮرة ﻣﻦ ﻗﺒﻞ أﻛﺜﺮ ﻣﻦ ﻣﺴﺘﺨﺪم ﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ-:
ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻒ ﻣﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ ﻟﮭﺎ اﻻﺳﻢ global_constsوﻗﺪ ﻗﻤﻨﺎ ﻓﻲ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ ﺑﺘﻌﺮﯾﻒ ﻋﺪة ﺛﻮاﺑﺖ
ﻟﺘﺨﺰﯾﻦ ﻗﯿﻢ اﻟﻨﺴﺐ اﻟﺘﺤﻮﯾﻠﯿﺔ ﺑﯿﻦ وﺣﺪات اﻟﻘﯿﺎس اﻟﻤﺨﺘﻠﻔﺔ ﻟﻠﻤﺴﺎﻓﺎت :
Mile_2_kilo
Kilo_2_mile
Yard_2_meter
Meter_2_yard
ﻛﻤﺎ ﻧﻼﺣﻆ أن ھﺬه اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﻻ ﺗﺘﻄﻠﺐ ﺗﻌﺮﯾﻒ اﻟﻘﺴﻢ Bodyوذﻟﻚ ﻻن ﺟﻤﯿﻊ اﻟﻌﻨﺎﺻﺮ اﻟﻤﻮﺟﻮدة ﻓﻲ
اﻟﻘﺴﻢ ﻋﺒﺎرة ﻋﻦ ﺛﻮاﺑﺖ وﯾﻤﻜﻨﻨﺎ اﺳﺘﺪﻋﺎء إي ﻣﻦ اﻟﺜﻮاﺑﺖ اﻟﻌﺎﻣﺔ اﻟﺘﻲ ﺗﻢ ﺗﻌﺮﯾﻔﮭﺎ ﻓﻲ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ اﻟﺴﺎﺑﻘﺔ
ﻓﻲ ﺑﺮاﻣﺞ ﻓﺮﻋﯿﺔ ﻣﺴﺘﻘﻠﺔ ﻓﻔﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ -:
ﺣﯿﺚ ﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ Createوھﻲ اﻟﺠﻤﻠﺔ اﻟﺘﻲ ﺗﺴﺘﺨﺪم ﻹﻧﺸﺎء اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﯾﻠﯿﮭﺎ اﻟﻜﻠﻤﺎت
] [OR REPLACEوﺗﻌﻤﻞ ھﺬه اﻟﻜﻠﻤﺎت ﻋﻠﻰ ﻋﻤﻞ اﺳﺘﺒﺪال ﻟﺘﻌﺮﯾﻒ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﺑﺎﻟﺘﻌﺮﯾﻔﺎت اﻟﺠﺪﯾﺪة
وذﻟﻚ ﻓﻲ ﺣﺎﻟﺔ وﺟﻮد ﻣﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ ﻟﮭﺎ ﻧﻔﺲ اﻻﺳﻢ وھﺬه اﻟﻜﻠﻤﺎت ھﻲ ﻛﻠﻤﺎت اﺧﺘﯿﺎرﯾﺔ Optionalﺛﻢ اﻟﻜﻠﻤﺔ
Packageﯾﻠﯿﮭﺎ أﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ Package_nameﺛﻢ اﻟﻜﻠﻤﺔ IS / ASﯾﻠﯿﮭﺎ اﻟﺘﻌﺮﯾﻔﺎت اﻟﺨﺎﺻﺔ
ﺑﻤﻜﻮﻧﺎت اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﻣﻦ ﺑﺮاﻣﺞ ﻓﺮﻋﯿﺔ وﻣﺘﻐﯿﺮات وﻏﯿﺮھﺎ ﻣﻦ اﻟﻌﻨﺎﺻﺮ اﻷﺧﺮى ﺛﻢ اﻟﻜﻠﻤﺔ ENDﯾﻠﯿﮭﺎ
. Package_name أﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﻧﺸﺎء اﻟﻘﺴﻢ اﻟﺜﺎﻧﻲ ﻣﻦ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ وھﻮ اﻟﻘﺴﻢ Bodyﺣﯿﺚ ﯾﺘﻢ
ﺗﺨﺰﯾﻦ ﻛﻼ ً ﻣﻦ Specification ، Bodyﺑﺼﻮرة ﻣﻨﻔﺼﻠﺔ ﻋﻠﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻟﺬﻟﻚ ﻓﻘﺪ ﻗﻤﻨﺎ ﺑﺘﻨﺎول ھﺬه اﻷﻗﺴﺎم
ﺑﺼﻮرة ﻣﻨﻔﺼﻠﺔ ﻟﻤﺰﯾﺪ ﻣﻦ اﻟﺘﻮﺿﯿﺢ وﻧﺬﻛﺮه ھﻨﺎ أﻧﮫ ﻻﺑﺪ ﻣﻦ إﻧﺸﺎء ھﺬه اﻷﻗﺴﺎم ﺑﻄﺮﯾﻘﺔ ﻣﻨﻔﺼﻠﺔ ﻓﻲ ﺑﺮﻧﺎﻣﺞ
SQL*PLUSأو iSQL*PLUSوﯾﺤﺘﻮي اﻟﻘﺴﻢ Bodyﻋﻠﻰ اﻟﻜﻮد اﻟﺘﻨﻔﯿﺬي اﻟﺨﺎص ﺑﺎﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﺘﻲ ﺗﻢ
ﺗﻌﺮﯾﻔﮭﺎ ﻓﻲ اﻟﻘﺴﻢ Specificationﻛﻤﺎ ﯾﻤﻜﻦ أن ﺗﺤﺘﻮي أﯾﻀﺎ ﻋﻠﻰ ﻋﻨﺎﺻﺮ أﺧﺮى ﻟﻢ ﯾﺘﻢ ﺗﻌﺮﯾﻔﮭﺎ ﻓﻲ اﻟﻘﺴﻢ
Specificationوﺑﺎﻟﺘﺎﻟﻲ ﺗﻜﻮن ھﺬه اﻟﻌﻨﺎﺻﺮ ﻣﻦ اﻟﻌﻨﺎﺻﺮ اﻟﺨﺎﺻﺔ Privateأي ﻻﯾﻤﻜﻦ اﺳﺘﺪﻋﺎءھﺎ إﻻ ً داﺧﻞ
ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻓﻘﻂ وﯾﺘﻢ إﻧﺸﺎء اﻟﻘﺴﻢ Bodyﺑﺎﺳﺘﺨﺪام اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ:
ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﻜﺘﺎﺑﺔ اﻟﺠﺰء اﻟﺘﻨﻔﯿﺬي ﻟﻺﺟﺮاء Find_nameواﻟﺬي ﯾﻘﻮم ﺑﺎﺳﺘﺮﺟﺎع أﺳﻢ اﻟﻤﻮﻇﻒ وراﺗﺒﮫ ﺑﻤﻌﻠﻮﻣﯿﺔ رﻗﻢ
ھﺬا اﻟﻤﻮﻇﻒ ﺛﻢ ﯾﻘﻮم ﺑﻜﺘﺎﺑﺔ اﻟﻜﻮد اﻟﺘﺎﻟﻲ-:
ﺣﯿﺚ ﯾﺘﻢ ﻛﺘﺎﺑﺔ أﺳﻢ اﻟﻮﻇﯿﻔﺔ Validate_commﺑﺪون اﻟﺘﻘﯿّﺪ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ اﻟﺨﺎﺻﺔ ﺑﮭﺎ أﻣﺎ إذا أردﻧﺎ
اﺳﺘﺪﻋﺎء أي ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ ﻟﻤﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ ﻓﻲ ﺑﯿﺌﺔ اﻟﺘﺸﻐﯿﻞ SQL*PLUSﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ-:
EXECUTE Package_name.subprogram_name
ﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻷﻣﺮ EXECUTEﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ Package_nameﺛﻢ اﻟﺮﻣﺰ دوت ] [.ﯾﻠﯿﮫ
اﺳﻢ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ Subprogram_nameاﻟﺬي ﻧﺮﯾﺪ اﺳﺘﺪﻋﺎءه .ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل أذا أردﻧﺎ اﺳﺘﺪﻋﺎء
اﻹﺟﺮاء reset_commﺧﺎرج اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ Comm_pcakageﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد -:
Forward declarationOverloading
ﺗﻌﺘﺒﺮ ھﺬه اﻟﺨﺎﺻﯿﺔ Overloadingﻣﻦ أھﻢ اﻟﺨﺼﺎﺋﺺ اﻟﺘﻲ ﺗﻮﻓﺮھﺎ ﻟﻨﺎ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ Packageﺣﯿﺚ
ﺗﻤﻜﻨﻨﺎ ھﺬه اﻟﺨﺎﺻﯿﺔ ﻣﻦ إﻧﺸﺎء اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺑﻨﻔﺲ اﻻﺳﻢ ﻓﻔﻲ ﺑﻌﺾ اﻷﺣﯿﺎن ﯾﻮﺟﺪ ﻋﺪد ﻣﻦ اﻹﺟﺮاءات
ﻟﮭﺎ ﻧﻔﺲ اﻟﻮﻇﯿﻔﺔ وﻟﻜﻦ ﺑﻌﺪد ﻣﺨﺘﻠﻒ ﻣﻦ اﻟﻤﻌﻄﯿﺎت وﻣﻦ اﻟﻤﻨﻄﻘﻲ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ أن ﺗﺄﺧﺬ ﺟﻤﯿﻊ ھﺬه اﻹﺟﺮاءات ﻧﻔﺲ
اﻻﺳﻢ ﺣﯿﺚ ﺗﻘﻮم اﻟﻠﻐﺔ PL/SQLﺑﺎﻟﺘﻌﺮف ﻋﻠﻰ اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ اﻟﺬي ﺳﻮف ﯾﺘﻢ ﺗﻨﻔﯿﺬه ﻃﺒﻘﺎً ﻟﻠﻤﻌﻄﯿﺎت اﻟﺘﻲ ﯾﺘﻢ
ﺗﻤﺮﯾﺮھﺎ ﻟﻠﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ وﯾﺠﺐ ﻣﻼﺣﻈﺔ أن ھﺬه اﻟﺨﺎﺻﯿﺔ ﯾﻤﻜﻦ أن ﺗﻌﻤﻞ ﻋﻠﻰ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ Sub-program
اﻟﺨﺎﺻﺔ ﺑﻤﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ Packageأو اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻹﻗﻠﯿﻤﯿﺔ Local_Sub_Programأي اﻟﻤﻮﺟﻮدة
داﺧﻞ اﻟﻘﺎﻟﺐ PL/SQL Blockأو ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ آﺧﺮ وﻟﻜﻦ ﻻ ﺗﻌﻤﻞ ھﺬه اﻟﺨﺎﺻﯿﺔ ﻋﻠﻰ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﻤﺴﺘﻘﻠﺔ
Stand-alone Subprogramﻛﻤﺎ ﻻ ﺗﻌﻤﻞ أﯾﻀﺎ ﻋﻠﻰ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﺘﻲ ﺗﻤﺘﻠﻚ ﻣﻌﻄﯿﺎت ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت
اﻟﻤﺨﺘﻠﻔﺔ وﻟﻜﻦ ﻣﻦ ﻧﻔﺲ اﻟﻔﺌﺔ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل إذا ﻛﺎن ﻟﺪﯾﻨﺎ إﺟﺮاءﯾﻦ :
اﻷول ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﻤﻌﻄﻰ Aوﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت Numberواﻟﺜﺎﻧﻲ ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﻤﻌﻄﻰ Bوﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت
Decimalﻓﻼ ﯾﻤﻜﻦ اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ Overloadingﻣﻊ ھﺬﯾﻦ اﻻﺟﺮاﺋﯿﻦ وذﻟﻚ ﻷن ﻧﻮع اﻟﺒﯿﺎﻧﺎت Numberو
Decimalﻣﻦ ﻧﻮع اﻟﻔﺌﺔ ﻛﻤﺎ ﻻ ﯾﻤﻜﻦ اﺳﺘﺨﺪام ھﺬه اﻟﺨﺎﺻﯿﺔ ﻣﻊ اﻟﻮﻇﺎﺋﻒ اﻟﺘﻲ ﺗﺨﺘﻠﻒ ﻓﻘﻂ ﻓﻲ ﻧﻮع اﻟﺒﯿﺎﻧﺎت
اﻟﺨﺎﺻﺔ ﺑﺎﻟﻘﯿﻢ اﻟﻤﺴﺘﺮﺟﻌﺔ ﻣﻨﮭﺎ .
ﺣﯿﺚ ﯾﺘﻢ ﺗﻌﺮﯾﻒ ﺛﻼﺛﺔ ﺑﺮاﻣﺞ ﻓﺮﻋﯿﺔ ﺑﻨﻔﺲ اﻻﺳﻢ ھﻮ Value_Okوﻛﻤﺎ ﻧﻼﺣﻆ أن اﻟﻮﻇﯿﻔﺔ اﻷوﻟﻰ ﺗﺄﺧﺬ اﻟﻤﻌﻄﻰ
Date_inواﻟﺬي ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت Dateواﻟﻮﻇﯿﻔﺔ اﻟﺜﺎﻧﯿﺔ ﺗﺄﺧﺬ اﻟﻤﻌﻄﻰ Number_inواﻟﺬي ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت
Numberأﻣﺎ اﻹﺟﺮاء اﻟﺜﺎﻟﺚ ﯾﺄﺧﺬ اﻟﻤﻌﻄﻰ Number_inواﻟﺬي ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت . Number
ﻛﻤﺎ ﺗﺘﯿﺢ ﻟﻨﺎ اﻟﻠﻐﺔ PL/SQLأﯾﻀﺎ إﻣﻜﺎﻧﯿﺔ اﺳﺘﺨﺪام اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ Sub-programﻗﺒﻞ ﺗﻮﺻﯿﻔﮭﺎ وذﻟﻚ ﻣﻦ
ﺧﻼل اﻟﺨﺎﺻﯿﺔ Forward Declarationﺣﯿﺚ ﺗﺘﯿﺢ ﻟﻨﺎ ھﺬه اﻟﺨﺎﺻﯿﺔ ﺑﺎﻟﻌﺪﯾﺪ ﻣﻦ اﻷﻣﻮر ﻣﺜﻞ :
• ﺗﻌﺮﯾﻒ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺑﻄﺮﯾﻘﺔ ﻣﻨﻄﻘﯿﺔ أو ﻣﺮﺗﺒﺔ ﺗﺮﺗﯿﺐ ھﺠﺎﺋﻲ
• ﺗﻌﺮﯾﻒ اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﻤﺘﺪاﺧﻠﺔ
• ﺗﺠﻤﯿﻊ اﻟﻌﺪﯾﺪ ﻣﻦ اﻟﺒﺮاﻣﺞ ﻓﻲ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ
وﺗﻌﺘﻤﺪ ھﺬه اﻟﺨﺎﺻﯿﺔ ﻋﻠﻰ اﻟﺘﻌﺮﯾﻒ اﻟﻤﺴﺒﻖ ﻗﺒﻞ اﺳﺘﺨﺪام اﻟﺒﺮﻧﺎﻣﺞ اﻟﻔﺮﻋﻲ ﻓﻲ ﺑﺮﻧﺎﻣﺞ آﺧﺮ ﺛﻢ ﯾﺘﻢ إﺿﺎﻓﺔ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ
ﺑﻌﺪ ذﻟﻚ وﻛﻤﺎ ﻧﺮى ﻓﻲ ھﺬا اﻟﻜﻮد:
ﯾﺘﻢ ﺗﻌﺮﯾﻒ اﻹﺟﺮاء Calc_ratingﻓﻲ ﺑﺪاﯾﺔ
اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ ﺛﻢ ﯾﺘﻢ اﺳﺘﺨﺪاﻣﮫ ﻓﻲ
اﻹﺟﺮاء award_bonusﺛﻢ ﯾﺘﻢ ﻋﻤﻞ
ﺗﻮﺻﯿﻒ ﻟﮫ ﺑﻌﺪ ذﻟﻚ
DML
ــــــــــــــــــــــــ
ــــــــــــــــــــــــــ
ــــــــــــــــــــــــــ
Transaction
Queries
ــــــــــــــــــ
ـــــــــــــــــــ
وﻣﺎ إﻟﻰ ذﻟﻚ ﻣﻦ ھﺬه اﻟﺠﻤﻞ .
ــــــــــــــــــــــــ
ــــــــــــــــــــــــــ
• ﻛﻤﺎ ﯾﺠﺐ ﻋﺪم ﺗﻨﻔﯿﺬ أي ﺟﻤﻠﺔ DMLأو أي ﺟﻤﻞ أﺧﺮى ﺗﻌﻤﻞ ﻋﻠﻰ اﻟﺘﻌﺪﯾﻞ ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻛﻤﺎ ﻻ ﯾﺠﺐ
ﻟﻠﻮﻇﺎﺋﻒ اﻟﺘﻲ ﯾﺘﻢ اﺳﺘﺪﻋﺎءھﺎ ﻣﻦ ﻗﺒﻞ اﻟﺠﻤﻞ DMLأن ﺗﻘﻮم ﺑﻘﺮاءة أو ﺗﻌﺪﯾﻞ ﺟﺪول ﻣﻦ ﺟﺪاول ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت
ﯾﺘﻢ ﺗﻌﺪﯾﻠﮫ ﻣﻦ ﻗﺒﻞ ﺟﻤﻠﺔ DMLأﺧﺮى ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل اﻟﻜﻮد اﻟﺘﺎﻟﻲ:
Specification
ﻗﺴﻢ
Body
ﻗﺴﻢ
ﯾﺴﺘﺨﺪم ﻹﻧﺸﺎء ﻣﺠﻤﻮﻋﺔ ﺑﺮﻣﺠﯿﺔ ﻟﮭﺎ اﻻﺳﻢ taxes_packواﻟﺘﻲ ﺗﺤﺘﻮي ﻋﻠﻰ اﻟﻮﻇﯿﻔﺔ taxﻛﻤﺎ ﻧﺮى ﻓﻲ اﻟﻘﺴﻢ
Specificationﻟﮭﺬه اﻟﻤﺠﻤﻮﻋﺔ .وﻓﻲ اﻟﻘﺴﻢ Bodyﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﻜﻮد اﻟﺘﻨﻔﯿﺬي ﻟﻠﻮﻇﯿﻔﺔ وھﻮ ﻋﺒﺎرة ﻋﻦ ﺣﺎﺻﻞ
) (P_value * V_rateوھﻲ ﻋﺒﺎرة ﻋﻦ ﺿﺮب اﻟﻘﯿﻤﺔ اﻟﺘﻲ ﯾﺘﻢ ﺗﻤﺮﯾﺮھﺎ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ﻓﻲ اﻟﻘﯿﻤﺔ )(V_rate
ﻗﯿﻤﺔ ﺛﺎﺑﺘﺔ وھﻲ 0.08وﻻﺳﺘﺨﺪام ھﺬه اﻟﻮﻇﯿﻔﺔ ﻓﻲ اﻟﻠﻐﺔ SQLﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد-:
وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻜﻮد أﻧﮫ ﻻﺳﺘﺪﻋﺎء اﻟﻮﻇﯿﻔﺔ taxاﻟﻤﻮﺟﻮدة ﻓﻲ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ taxes_packداﺧﻞ اﻟﺠﻤﻠﺔ
Selectﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ اﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ taxes_packﯾﻠﯿﮭﺎ اﻟﺮﻣﺰ دوت] [.ﺛﻢ اﺳﻢ اﻟﻮﻇﯿﻔﺔ .. tax
ﻧﻼﺣﻆ ﻓﻲ اﻟﻜﻮد ﯾﺘﻢ ﺟﻤﻊ اﻟﻘﯿﻤﺔ اﻟﺘﻲ ﯾﺘﻢ ﺗﻤﺮﯾﺮھﺎ ﻣﻦ ﺧﻼل اﻟﻤﻌﻄﻰ raise_inﻋﻠﻰ ﻗﯿﻤﺔ اﻟﺮاﺗﺐ
Salﻓﻲ اﻟﺠﻤﻠﺔ اﻟﺘﺎﻟﯿﺔ Sal = Sal + raise_in :وﯾﺘﻢ ﺗﺤﺪﯾﺪ اﺳﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﯾﺘﻢ ﻣﻨﺤﮫ ھﺬه اﻟﻤﻜﺎﻓﺄة ﻣﻦ
ﺧﻼل اﻟﻤﻌﻄﻰ Emp_nameﻛﻤﺎ ﻓﻲ اﻟﺠﻤﻠﺔ Where ename = emp_name :ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ Where
أﻣﺎ ﺑﺎﺳﺘﺨﺪام اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﻓﻼﺑﺪ ﻣﻦ ﻋﻤﻞ اﻟﺨﻄﻮات اﻵﺗﯿﺔ - :
أوﻻ ً :ﻧﻘﻮم ﺑﺤﺠﺰ ﻣﻜﺎن ﻓﻲ اﻟﺬاﻛﺮة Memoryوذﻟﻚ ﻟﺘﺨﺰﯾﻦ اﻟﺠﻤﻞ SQLاﻟﻤﺮاد ﺗﻨﻔﯿﺬھﺎ وذﻟﻚ ﻣﻦ ﺧﻼل أو ﺗﻌﯿﯿﻦ
أو ﻓﺘﺢ اﻟﻤﺆﺷﺮات وﯾﺘﻢ ذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻮﻇﯿﻔﺔ Open_Cursorﺣﯿﺚ ﺗﻘﻮم ﺑﺎﺳﺘﺮﺟﺎع اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ID
Numberاﻟﺨﺎص ﺑﮭﺬا اﻟﻤﺆﺷﺮ:
Open_Cursor ID Number
ﺛﺎﻧﯿﺎً :ﻧﻘﻮم ﺑﺈﺟﺮاء ﻋﻤﻠﯿﺔ ﻓﺤﺺ ﻟﻠﺠﻤﻞ وﻓﻲ ھﺬه اﻟﺨﻄﻮة ﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ Oracle serverﺑﺈﺟﺮاء اﻟﻔﺤﺺ
ﻟﻸﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﺎﻟﺠﻤﻞ SQLﻟﻠﺘﺄﻛﺪ ﻣﻦ ﺻﺤﺘﮭﺎ وﯾﺘﻢ ذﻟﻚ ﻣﻦ ﺧﻼل اﻹﺟﺮاء Parseوذﻟﻚ ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ -:
وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت اﻟﻤﻌﻄﻰ اﻷول ﻋﺒﺎرة ﻋﻦ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ﻟﻠﻤﺆﺷﺮ اﻟﺤﺎﻟﻲ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة
ﻋﻦ اﻟﺠﻤﻠﺔ SQLاﻟﻤﺮاد ﻓﺤﺼﮭﺎ ﻗﺒﻞ اﻟﺘﻨﻔﯿﺬ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ﻋﺒﺎرة ﻋﻦ اﻟﻨﻤﻂ اﻟﻤﺴﺘﺨﺪم ﻓﻲ ﻣﻌﺎﻟﺠﺔ اﻟﺠﻤﻞ SQL
وھﻨﺎك ﺛﻼﺛﺔ أﻧﻤﺎط -:
-V6 ﺧﺎص ﺑﺎﻹﺻﺪار اﻟﺴﺎدس ﻣﻦ أوراﻛﻞ
-V7 ﺧﺎص ﺑﺎﻹﺻﺪار اﻟﺴﺎﺑﻊ ﻣﻦ أوراﻛﻞ
DML
وﻣﺎ إﻟﻰ ﻏﯿﺮ ذﻟﻚ
UPDATE
EXECUTE Immediate
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ Execute Immediateﻓﻲ ﻛﺘﺎﺑﺔ اﻟﻜﻮد Native
Dynamic SQLداﺧﻞ اﻟﻜﻮد PL/SQL
Native Dynamic SQL PL/SQL
وﺗﺄﺧﺬ ھﺬه اﻟﺠﻤﻠﺔ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ -:
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ Execute Immediateﯾﻠﯿﮭﺎ اﻟﺠﻤﻠﺔ SQLاﻟﻤﺮاد ﺗﻨﻔﯿﺬھﺎ ﺛﻢ اﻟﺠﻤﻠﺔ INTOﯾﻠﯿﮭﺎ
ﻣﺠﻤﻮﻋﺔ ﻣﺘﻐﯿﺮات Define_Variableأو Recordsاﻟﺘﻲ ﺳﻮف ﯾﺘﻢ ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻨﺎﺗﺠﺔ ﻣﻦ ﺗﻨﻔﯿﺬ اﻟﺠﻤﻠﺔ
SQLﺑﮭﺎ ﺛﻢ اﻟﻜﻠﻤﺔ Usingﯾﻠﯿﮭﺎ اﻟﻤﺘﻐﯿﺮات Bind_argumentواﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ إرﺳﺎل اﻟﺒﯿﺎﻧﺎت اﻟﻤﺪﺧﻠﺔ ﻣﻦ
اﻟﻤﺴﺘﺨﺪم إﻟﻰ اﻟﺠﻤﻠﺔ SQLﺳﻮاءً ﻛﺎﻧﺖ اﻟﺒﯿﺎﻧﺎت ﻣﺪﺧﻠﺔ ﻣﻦ ﺧﻼل اﻟﻤﻌﻄﯿﺎت Parametersأو ﻣﻌﺮﻓﺔ ﻓﻲ اﻟﻘﺴﻢ
Declarative Sectionوﯾﺠﺐ ﻣﻼﺣﻈﺔ أن ھﺬه اﻟﺠﻤﻠﺔ ﺗﺴﺘﺨﺪم ﻓﻲ اﻻﺳﺘﻌﻼﻣﺎت Single_Row Queryﻓﻘﻂ
ﯾﻌﻤﻞ ھﺬا اﻹﺟﺮاء ﻋﻠﻰ ﻋﺮض اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻮﻇﻒ اﻟﺬي ﯾﺘﻢ ﺗﻤﺮﯾﺮ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ Emp_IDاﻟﺨﺎص ﺑﮫ
ﻟﮭﺬا اﻹﺟﺮاء ﻛﻤﺎ ﻧﺸﺎھﺪ ﻓﻲ اﻟﻜﻮد ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﺠﻤﻠﺔ Execute Immediateﺛﻢ اﻟﺠﻤﻠﺔ اﻟﺨﺎﺻﺔ ﺑﺎﻻﺳﺘﻌﻼم
Select * from emp Where empno = :idﯾﻠﯿﮭﺎ اﻟﺠﻤﻠﺔ INTOﺛﻢ اﻟﻤﺘﻐﯿﺮ Emp_recواﻟﺬي ﺗﻢ
ﺗﻌﺮﯾﻔﮫ ﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﻘﺴﻢ Declarative Sectionﺛﻢ اﻟﻜﻠﻤﺔ Usingﯾﻠﯿﮭﺎ اﻟﻤﺘﻐﯿﺮ emp_idواﻟﺬي ﯾﻘﻮم
ﺑﺘﻤﺮﯾﺮ اﻟﻘﯿﻤﺔ اﻟﻤﺪﺧﻠﺔ ﻣﻦ اﻟﻤﻌﻄﻰ emp_idإﻟﻰ اﻟﻤﺘﻐﯿﺮ ] [:idأﻣﺎ اﻟﺠﻤﻠﺔ اﻟﻠﻲ ﻓﻲ اﻟﻤﺴﺘﻄﯿﻞ اﻷﺣﻤﺮ ﻓﻲ اﻟﻜﻮد
ﻓﺘﺴﺘﺨﺪم ﻟﻌﺮض اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﻢ اﺳﺘﺨﻼﺻﮭﺎ وﺗﺨﺰﯾﻨﮭﺎ ﻓﻲ اﻟﻤﺘﻐﯿﺮ . emp_rec
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ DBMS_DDLﯾﻠﯿﮭﺎ اﻟﻌﻼﻣﺔ دوت ] [.ﺛﻢ اﺳﻢ اﻹﺟﺮاء
Analyze_Objectوﯾﺄﺧﺬ ھﺬا ﻹﺟﺮاء ﻋﺪداً ﻣﻦ اﻟﻤﻌﻄﯿﺎت اﻟﻤﻌﻄﻰ اﻷول Type Varchar2ﻋﺒﺎرة ﻋﻦ ﻧﻮع
اﻟﻌﻨﺎﺻﺮ اﻟﻤﺮاد ﺣﺴﺎب إﺣﺼﺎﺋﯿﺎﺗﮫ ﺛﻢ اﺳﻢ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮد ﺑﮭﺎ ھﺬا اﻟﻌﻨﺼﺮ Schemaﺛﻢ اﺳﻢ ھﺬا اﻟﻌﻨﺼﺮ
Nameوﯾﺠﺐ ﻣﻼﺣﻈﺔ ﺣﺎﻟﺔ أﻷﺣﺮف ﻋﻨﺪ إدﺧﺎل اﺳﻢ اﻟﻌﻨﺼﺮ ﺣﯿﺚ أﻧﮭﺎ ﺣﺴﺎﺳﺔ ﻟﺤﺎﻟﺔ اﻷﺣﺮف Case_Sensitive
أﻣﺎ اﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ ﻟﮭﺬا اﻷﺟﺮاء ﻓﯿﺴﺘﺨﺪم ﻟﺘﺤﺪﯾﺪ اﻟﻄﺮﯾﻘﺔ اﻟﺘﻲ ﯾﺘﻢ ﺣﺴﺎب اﻹﺣﺼﺎﺋﯿﺎت ﺑﮭﺎ وھﻰ أﺣﺪى ﺛﻼث ﻃﺮق :
: Compute -١وﺗﺴﺘﺨﺪم ﻟﺤﺴﺎب اﻹﺣﺼﺎﺋﯿﺎت اﻟﻔﻌﻠﯿﺔ ﻟﻠﻌﻨﺼﺮ .
: Delete -٢وﺗﺴﺘﺨﺪم ﻟﺤﺬف اﻹﺣﺼﺎﺋﯿﺎت .
: Estimate -٣وﺗﺴﺘﺨﺪم ﻟﻌﻤﻞ ﺗﺨﻤﯿﻦ ﻟﻺﺣﺼﺎﺋﯿﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻌﻨﺼﺮ وﻓﻲ ﺣﺎﻟﺔ اﺳﺘﺨﺪام ھﺬه اﻟﻄﺮﯾﻘﺔ ﻻﺑﺪ ﻣﻦ
إﺿﺎﻓﺔ اﻟﻤﻌﻄﻰ Estimate_Rowsأو Estimate_Precentوﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ :
ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء Analyze_Objectﻟﻌﻤﻞ إﺣﺼﺎﺋﯿﺔ ﻟﻠﺠﺪول Empﺑﺎﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ Computeوذﻟﻚ ﻋﻦ
ﻃﺮﯾﻖ اﺳﻢ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت Scottوﻧﻮع اﺳﻢ اﻟﻌﻨﺼﺮ .Table
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ DBMS_JOBﯾﻠﯿﮭﺎ اﻟﻌﻼﻣﺔ دوت ] [.ﺛﻢ اﺳﻢ اﻹﺟﺮاء Submit
وﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﻋﺪدا ﻣﻦ اﻟﻤﻌﻄﯿﺎت اﻟﻤﻌﻄﻰ اﻷول JOBوﯾﻌﻤﻞ ﻋﻠﻰ إﻋﺎدة اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ ﻟﮭﺬا اﻹﺟﺮاء ﻓﻲ
ﻗﺎﺋﻤﺔ اﻟﻮﻇﺎﺋﻒ وﯾﺄﺧﺬ اﻷﺳﻠﻮب OUTواﻟﻤﻌﻄــــﻰ Whatھﻮ ﻋﺒﺎرة ﻋﻦ اﻹﺟﺮاء اﻟﺬي ﺳﯿﺘﻢ إرﺳﺎﻟﮫ إﻟﻰ ﻗﺎﺋﻤﺔ
اﻟﻮﻇﺎﺋﻒ واﻟﻤﻌﻄﻰ Next_dateﻋﺒﺎرة ﻋﻦ اﻟﺘﻮﻗﯿﺖ اﻟﺬي ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬ ھﺬا اﻹﺟﺮاء ﺑﮫ ﻓﻲ اﻟﻤﺮة اﻟﻘﺎدﻣﺔ واﻟﻤﻌﻄــــﻰ
intervalوھﻮ ﻋﺒﺎرة ﻋﻦ وﻇﯿﻔﺔ ﺗﺴﺘﺨﺪم ﻟﺤﺴﺎب اﻟﺘﻮﻗﯿﺖ اﻟﺘﺎﻟﻲ اﻟﺬي ﺳﻮف ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﺒﺮﻧﺎﻣﺞ ﺑﮫ أﻣﺎ اﻟﻤﻌﻄـــــﻰ
no_parseﻓﮭﻮ ﺧﺎص ﺑﻌﻤﻠﯿﺔ ﻓﺤﺺ ﻛﻮد اﻹﺟﺮاء واﻟﻘﯿﻤﺔ اﻻﻓﺘﺮاﺿﯿﺔ ﻟﮭﺬا اﻟﻤﻌﻄﻰ ھﻮ Falseأي أن اﻟﺨﺎدم
أوراﻛﻞ Oracle serverﺳﯿﻘﻮم ﺑﻔﺤﺺ اﻟﻜﻮد اﻟﺨﺎص ﺑﺎﻹﺟﺮاء أﻣﺎ إذا ﻛﺎﻧﺖ ﻗﯿﻤﺔ اﻟﻤﻌﻄﻰ Trueﻓﺴﯿﻘﻮم ﺧﺎدم
أوراﻛﻞ ﺑﻌﺪم ﻓﺤﺺ اﻷﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻹﺟﺮاء وﺗﺴﺘﺨﺪم ھﺬا اﻹﺟﺮاء إذا أردﻧﺎ أن ﻧﻀﯿﻒ إﺟﺮاء إﻟﻰ ﻗﺎﺋﻤﺔ
اﻟﻮﻇﺎﺋﻒ ﻗﺒﻞ إﻧﺸﺎءه .وﻷدراك وﻓﮭﻢ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ ﺳﻨﻘﻮم ﺑﺎﻟﺘﺪرج ﻓﻲ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ ﻟﻠﺘﻄﺒﯿﻖ
ﺟﻤﯿﻊ اﻹﺟﺮاءات ھﺬه اﻟﻤﺠﻤﻮﻋﺎت ﻋﻠﯿﮫ -:
وﯾﺴﺘﺨﺪم اﻹﺟﺮاء Changeﻟﺘﻐﯿﯿﺮ ﺟﻤﯿﻊ اﻟﻤﻌﻄﯿﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻹﺟﺮاء ﻣﺜﻞ اﻟﻤﻌﻄﻰ Whatأو Next_dateأو
intervalوﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ -:
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ DBMS_JOBﯾﻠﯿﮭﺎ اﺳﻢ اﻹﺟﺮاء Changeوﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء
أرﺑﻌﺔ ﻣﻌﻄﯿﺎت اﻟﻤﻌﻄﻰ اﻷول JOBﻋﺒﺎرة ﻋﻦ اﻟﺮﻗﻢ اﻟﺘﺴﻠﺴﻠﻲ اﻟﺨﺎص ﺑﮭﺬا اﻹﺟﺮاء ﻓﻲ ﻗﺎﺋﻤﺔ اﻟﻮﻇﺎﺋﻒ واﻟﻤﻌﻄﻰ
اﻟﺜﺎﻧﻲ Whatﻋﺒﺎرة ﻋﻦ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﺎﻹﺟﺮاء واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ Next_dateﻋﺒﺎرة ﻋﻦ اﻟﻮﻗﺖ اﻟﺘﺎﻟﻲ ﻟﺘﻨﻔﯿﺬ
اﻹﺟﺮاء أﻣﺎ اﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ intervalﻓﮭﻮ اﻟﺨﺎص ﺑﺘﺤﺪﯾﺪ اﻟﻔﺘﺮة اﻟﺰﻣﻨﯿﺔ ﺑﯿﻦ أوﻗﺎت ﺗﻨﻔﯿﺬ اﻹﺟﺮاء ﻋﻠﻰ ﺳﺒﯿﻞ
اﻟﻤﺜﺎل إذا أردﻧﺎ ﺗﻌﺪﯾﻞ وﻗﺖ ﺗﻨﻔﯿﺬ اﻹﺟﺮاء Add_deptﻣﻦ اﻟﺴﺎﻋﺔ 12:00Amﺻﺒﺎﺣﺎ اﻟﻰ اﻟﺴﺎﻋﺔ 6:00Am
ﺻﺒﺎﺣﺎ وﺗﻌﺪﯾﻞ ﻓﺘﺮة ﺗﻜﺮار اﻟﺘﻨﻔﯿﺬ اﻟﻰ 4ﺳﺎﻋﺎت ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد :
ﺣﯿﺚ ﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﺳﻢ اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ Package_nameﺛﻢ اﻟﺮﻣﺰ دوت] [.ﯾﻠﯿﮭﺎ أﺳﻢ اﻹﺟﺮاء
Procedure_nameﺛﻢ اﻟﻤﻌﻄﯿﺎت Parametersاﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻹﺟﺮاء ) (Job_idوھﻮ ﻋﺒﺎرة ﻋﻦ اﻟﺮﻗﻢ
اﻟﺨﺎص ﺑﺎﻟﻮﻇﯿﻔﺔ اﻟﻤﺮاد ﺣﺬﻓﮭﺎ أو ﺗﻨﻔﯿﺬھﺎ ﻓﺈذا أردﻧﺎ ﺗﺸﻐﯿﻞ وﻇﯿﻔﺔ ﻣﻌﯿﻨﺔ ﺑﺼﺮف اﻟﻨﻈﺮ ﻋﻦ اﻟﻤﯿﻌﺎد اﻟﻤﺤﺪد ﻟﺘﺸﻐﯿﻠﮭﺎ
ﻋﻨﺪ إﻧﺸﺎﺋﮭﺎ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء Runﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ:
;)DBMS_JOB.RUN(121
اﻟﻤﻌﻄﻰ اﻷول Jobﻋﺒﺎرة ﻋﻦ رﻗﻢ اﻟﻮﻇﯿﻔﺔ أﻣﺎ اﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ Brokenﻋﺒﺎرة ﻋﻦ ﻗﯿﻤﺔ ﻣﻨﻄﻘﯿﺔ Booleanﻓﺈذا
ﻛﺎﻧﺖ ﻗﯿﻤﺔ ھﺬا اﻟﻤﻌﻄﻰ Falseﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ Oracle serverﺑﺘﻨﻔﯿﺬ اﻟﻮﻇﯿﻔﺔ وأذا ﻛﺎﻧﺖ ﻗﯿﻤﺔ ھﺬا اﻟﻤﻌﻄﻰ
Trueﯾﻘﻮم اﻟﺨﺎدم أوراﻛﻞ Oracle serverﺑﺘﻌﻄﯿﻞ ھﺬه اﻟﻮﻇﯿﻔﺔ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ Next_dateﻋﺒﺎرة ﻋﻦ
اﻟﺘﺎرﯾﺦ اﻟﻤﺤﺪد ﺑﺎﺳﺘﺌﻨﺎف ﺗﻨﻔﯿﺬ اﻟﻮﻇﯿﻔﺔ ﻓﺈذا أردﻧﺎ ﺗﻌﻄﯿﻞ ﺗﻨﻔﯿﺬ اﻟﻮﻇﯿﻔﺔ رﻗﻢ ) (121ﺛﻢ إﻋﺎدة ﺗﻨﻔﯿﺬھﺎ ﺑﻌﺪ ﯾﻮﻣﯿﻦ ﻧﻘﻮم
ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد:
ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ ﻋﺮض ﺑﻌﺾ اﻟﻤﻌﻠﻮﻣﺎت ﻋﻦ اﻟﻮﻇﺎﺋﻒ وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ DBA_JOBSﺑﺸﺮط أن ﯾﻜﻮن
اﻟﻤﺴﺘﺨﺪم ﻟﮫ ﺣﻘﯿﺔ اﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ Selectﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻋﺮض ﺑﯿﺎﻧﺎت اﻟﻮﻇﯿﻔﺔ رﻗﻢ 27ﻧﻘﻮم
ﺑﺎﺳﺘﺨﺪام ھﺬا اﻟﻜﻮد:
ﻋﻨﺪ ﺗﺸﻐﯿﻞ ﺑﺎﻟﻤﻔﺘﺎح Enterھﺬا اﻻﺳﺘﻌﻼم ﯾﺘﻢ ﻋﺮض ﺑﯿﺎﻧﺎت اﻟﻮﻇﯿﻔﺔ رﻗﻢ 27ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ أﯾﻀﺎ اﺳﺘﺨﺪام اﻟﺠﺪول
DBA_Jobs_Runningﻟﻌﺮض ﺑﯿﺎﻧﺎت ﻋﻦ اﻟﻮﻇﺎﺋﻒ اﻟﻤﻨﻔﺬّة ﺣﺎﻟﯿﺎً . اﻟﺘﺨﯿﻠﻲ
ﺗﻮﺿﯿـــﺢ
ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻒ ﺛﻼﺛﺔ ﻣﺘﻐﯿﺮات اﻷول ﻣﻦ اﻟﻨﻮع Numberواﻟﺜﺎﻧﻲ ﻣﻦ اﻟﻨﻮع Varchar2واﻟﺜﺎﻟﺚ ﻣﻦ اﻟﻨﻮع
Dateﺛﻢ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء DBMS_OUTPUT.PUTﻹدﺧﺎل ﻗﯿﻢ ھﺬه اﻟﻤﺘﻐﯿﺮات ﻓﻲ اﻟﺬاﻛﺮة Bufferﺛﻢ
ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء DBMS_OUTPUT.NEW_LINEﻹﻧﮭﺎء ﻋﻤﻠﯿﺔ اﻹدﺧﺎل ﺛﻢ ﻋﺮض ھﺬه اﻟﺒﯿﺎﻧﺎت
وﺑﺘﺸﻐﯿﻞ ھﺬا اﻟﻘﺎﻟﺐ PL/SQLﻧﻼﺣﻆ أﻧﮫ ﺗﻢ ﻋﺮض اﻟﺒﯿﺎﻧﺎت ﻋﻠﻰ ﺳﻄﺮ واﺣﺪ ﻓﻘﻂ :
ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء DBMS_OUTPUT.PUT_LINEﻟﻌﺮض ﻗﯿﻢ اﻟﻤﺘﻐﯿﺮات idو Nameو _Hire
dateأﻣﺎ اﻹﺟﺮاءات :
- Get_line
- Get_lines
ﻓﺘﻌﻤﻞ ﻋﻠﻰ اﺳﺘﺮﺟﺎع اﻟﺼﻔﻮف ﻣﻦ اﻟﺬاﻛﺮة Bufferﺣﯿﺚ ﯾﻘﻮم اﻹﺟﺮاء Get_lineﺑﺎﺳﺘﺮﺟﺎع ﺻﻒ واﺣﺪ ﻣﻦ
One lineوﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﻣﻌﻄﯿﺎن اﻟﻤﻌﻄﻰ اﻷول ﺻﻔﻮف اﻟﺬاﻛﺮة Buffer
ﻋﺒﺎرة ﻋﻦ اﻟﺴﻄﺮ اﻟﺬي ﻗﺎم اﻹﺟﺮاء ﺑﺎﺳﺘﺮﺟﺎﻋﮫ Lineوھﻮ ﻣﻦ ﻧﻮع اﻟﺒﯿﺎﻧﺎت Varchar2وﻟﮫ اﻟﻘﺪرة ﻋﻠﻰ ﺗﺨﺰﯾﻦ
255ﺑﺎﯾﺖ .واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ ﻗﯿﻤﺔ رﻗﻤﯿﺔ ﻣﻦ ﻧﻮع Integerوھﻮ Statusﻓﺈذا ﻛﺎﻧﺖ ھﺬه اﻟﻘﯿﻤﺔ ﺻﻔﺮ
] [0دل ذﻟﻚ ﻋﻠﻰ أن ﻋﻤﻠﯿﺔ اﺳﺘﺮﺟﺎع اﻟﺒﯿﺎﻧﺎت ﺗﻤﺖ ﺑﻨﺠﺎح وإذا ﻛﺎﻧﺖ اﻟﻘﯿﻤﺔ واﺣﺪ ] [1دل ذﻟﻚ ﻋﻠﻰ أﻧﮫ ﻟﻢ ﯾﺘﻢ
اﺳﺘﺮﺟﺎع أي ﺑﯿﺎﻧﺎت ﻣﻦ اﻟﺬاﻛﺮة .
أﻣﺎ اﻹﺟﺮاء Get_Linesﻓﯿﻌﻤﻞ ﻋﻠﻰ اﺳﺘﺮﺟﺎع ﻋﺪد ﻣﻦ اﻷﺳﻄﺮ اﻟﺬاﻛﺮة Many Lines Bufferوﻧﻼﺣﻆ ان
ھﺬا اﻹﺟﺮاء ﯾﺄﺧﺬ ﻣﻌﻄﯿﺎن:
اﻟﻤﻌﻄﻰ اﻷول ﻋﺒﺎرة ﻋﻦ ﻣﺼﻔﻮﻓﺔ PL/SQL Arrayﺗﺴﺘﺨﺪم ﻟﺘﺨﺰﯾﻦ اﻷﺳﻄﺮ اﻟﻤﺴﺘﺮﺟﻌﺔ ﻣﻦ اﻟﺬاﻛﺮة وھﺬه
اﻟﻤﺼﻔﻮﻓﺔ ﻟﮭﺎ ﻧﻮع اﻟﺒﯿﺎﻧﺎت . CHARARR
واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ ﻗﯿﻤﺔ رﻗﻤﯿﺔ ﺗﺴﺘﺨﺪم ﻟﺘﺨﺰﯾﻦ ﻋﺪد اﻷﺳﻄﺮ اﻟﺘﻲ ﺗﻢ اﺳﺘﺮﺟﺎﻋﮭﺎ ﻛﻤﺎ ﯾﻤﻜﻦ ﺗﺤﺪﯾﺪ ﻋﺪد ﻣﻦ
اﻷﺳﻄﺮ اﻟﺘﻲ ﺳﯿﺘﻢ اﺳﺘﺮﺟﺎﻋﮭﺎ ﻣﻦ ھﺬا اﻹﺟﺮاء وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ ﻧﻔﺲ اﻟﻤﻌﻄﻰ وذﻟﻚ ﻷﻧﮫ ﻣﻌﻄﻰ ﻣﻦ اﻟﻨﻮع
ﺗﺘﯿﺢ ﻣﻌﻈﻢ ﻟﻐﺎت اﻟﺒﺮﻣﺠﺔ إﻣﻜﺎﻧﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ ﺑﺎﻟﻨﻈﺎم External Fileﻛﻤﺪﺧﻼت وﻣﺨﺮﺟﺎت i/o
ﻟﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻛﻤﺎ ﺗﺘﯿﺢ اﻟﻠﻐﺔ PL/SQLإﻣﻜﺎﻧﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ ﻟﻠﻨﻈﺎم وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻤﺠﻤﻮﻋﺔ
اﻟﺒﺮﻣﺠﯿﺔ UTL_Fileﻓﻤﻦ ﺧﻼل ھﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ ﯾﻤﻜﻦ ﻟﺒﺮاﻣﺞ اﻟﻠﻐﺔ PL/SQLاﻟﺘﻔﺎﻋﻞ ﻣﻊ ﻣﻠﻔﺎت اﻟﻨﻈﺎم
اﻟﻨﺼﯿـــﺔ Operating system textوذﻟﻚ ﻣﻦ ﺧﻼل ﻋﺪدا ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ اﻟﺘﻲ ﺗﺪﻋﻤﮭﺎ ھﺬه اﻟﻤﺠﻤﻮﻋﺔ
وﻗﺒﻞ اﺳﺘﻌﺮاض ھﺬه اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻻﺑﺪ ﻣﻦ ﺗﮭﯿﺌﺔ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻟﺘﻔﺎﻋﻞ ﻣﻊ ھﺬا اﻟﻤﻠﻒ وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺨﻄﻮات
اﻟﺘﺎﻟﯿﺔ:
أوﻻ :ﻧﻘﻮم ﺑﺈﻧﺸﺎء ﻣﺠﻠﺪ اﻟﺬي ﺳﯿﺘﻢ إﻧﺸﺎء اﻟﻤﻠﻔﺎت ﺑﮫ.
ﺛﺎﻧﯿﺎً :إﻧﺸﺎء ﺳﺠﻞ ﺧﺎص ﻟﮭﺬا اﻟﻤﺠﻠﺪ ﻓﻲ اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ All_Directoriesﻷﻋﻼم ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻋﻦ اﺳﻢ
وﻣﻮﻗﻊ ھﺬا اﻟﻤﻠﻒ وذﻟﻚ ﻣﻦ ﻋﻨﺪ ﻗﯿﺎم أﺣﺪ ﻣﺪﯾﺮي ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت DBAﺑﺎﺳﺘﺨﺪام اﻷﻣﺮCreate Directory
وﯾﺄﺧﺬ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ:
; 'Create Directory director_name AS 'director_location
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻷﻣﺮ Create Directoryﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﺠﻠﺪ اﻟﺬي ﺗﻢ إﻧﺸﺎءه ﺳﺎﺑﻘﺎً ﺛﻢ اﻟﻜﻠﻤﺔ ASﯾﻠﯿﮭﺎ اﻟﻤﻮﻗﻊ
اﻟﻤﻮﺟﻮد ﻓﯿﮭﺎ ھﺬا اﻟﻤﺠﻠﺪ ﻛﻤﺎ ﯾﺠﺐ ﻋﻠﻰ ﻣﺪﯾﺮي ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أن ﯾﻘﻮم ﺑﺈﺗﺎﺣﺔ ھﺬا اﻟﻤﻠﻒ ﻟﻼﺳﺘﺨﺪام وذﻟﻚ
ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ :
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﻜﻠﻤﺔ Grantﯾﻠﯿﮭﺎ اﻟﺨﺎﺻﯿﺔ اﻟﺘﻲ ﻧﺮﯾﺪ ﻣﻨﺤﮭﺎ ﻟﮭﺬا اﻟﻤﺴﺘﺨﺪم وھﻲ أﻣﺎ Readأو Writeأو
ﻛﻼھﻤﺎ ﻣﻌﺎً ALLوﯾﻠﯿﮭﺎ اﻟﻜﻠﻤﺔ On Directoryﺛﻢ اﺳﻢ ھﺬا اﻟﻤﺠﻠﺪ Director_nameﺛﻢ اﻟﻜﻠﻤﺔ Toﯾﻠﯿﮭﺎ اﺳﻢ
اﻟﻤﺴﺘﺨﺪم User_nameﻛﻤﺎ ﯾﻤﻜﻦ ﻣﻨﺢ ھﺬه اﻟﺨﺎﺻﯿﺔ ﻟﺠﻤﯿﻊ اﻟﻤﺴﺘﺨﺪﻣﯿﻦ ﺑﺎﺳﺘﺨﺪام اﻟﻜﻠﻤﺔ Publicوﺑﺬﻟﻚ ﻗﺪ ﻗﻤﻨﺎ
ﺑﺘﮭﯿﺌﺔ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻟﻠﺘﻔﺎﻋﻞ ﻣﻊ ھﺬا اﻟﻤﻠﻒ ﻓﺈذا أردﻧﺎ ﻋﻤﻞ ﺑﺮﻧﺎﻣﺞ ﻓﺮﻋﻲ Sub-programﯾﻘﻮم ﺑﻌﻤﻞ ﺗﻘﺮﯾﺮاً
Reportsﻋﻦ ﺑﯿﺎﻧﺎت اﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﻮﺟﻮدﯾﻦ ﻓﻲ ﺟﺪول اﻟﻤﻮﻇﻔﯿﻦ Employeesﻓﻲ ﻣﻠﻒ ﺧﺎرﺟﻲ ﻧﻘﻮم أو ﻻً ﺑﺈﻧﺸﺎء
اﻟﻤﺠﻠﺪ اﻟﺬي ﺳﻮف ﺗﻘﻮم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺑﺎﻟﺘﻔﺎﻋﻞ ﻣﻌﮫ وﻟﯿﻜﻦ اﻟﻤﺠﻠﺪ ORALoadﻋﻠﻰ اﻟﻘﺮص اﻟﺼﻠﺐ Cأو D
Alsaeedi999@hotmail.com ٦٣ أﻋﺪاد /ﻋﺒﺪاﻟﺮﺣﻤﻦ ﺟﻤﺎل ﻣﺤﺴﻦ اﻟﺴﻌﯿﺪي
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﺳﺘﺨﺪام اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ Sub-programاﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﺠﻤﻮﻋﺎت
اﻟﺒﺮﻣﺠﯿﺔ UTL_Fileﻟﻠﺘﻔﺎﻋﻞ ﻣﻊ ﻣﻠﻔﺎت اﻟﻨﻈﺎم اﻟﺨﺎرﺟﯿﺔ وﯾﻘﺼﺪ ﺑﺎﻟﺘﻔﺎﻋﻞ ھﻨﺎ ھﻲ إﻣﻜﺎﻧﯿﺔ اﻟﻘﺮاءة واﻟﻜﺘﺎﺑﺔ
Read And Writeﻣﻦ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ ﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ إﻣﻜﺎﻧﯿﺔ ﻧﺴﺦ اﻟﺒﯿﺎﻧﺎت Copying Dataوإزاﻟﺘﮭﺎ
Deleting Dataوﻣﺎ إﻟﻰ ذﻟﻚ ﻣﻦ ﻋﻤﻠﯿﺎت ﻣﻌﺎﻟﺠﺔ أﺧﺮى اﻟﺘﻲ ﺗﺘﻢ ﻋﻠﻰ اﻟﻤﻠﻔﺎت وﺗﺘﻢ ھﺬه اﻟﻌﻤﻠﯿﺎت ﻋﻦ ﻃﺮﯾﻖ
إﺟﺮاء ﺑﻌﺾ اﻟﺨﻄﻮات اﻷﺳﺎﺳﯿﺔ :
-١ﻋﻤﻠﯿﺔ ﻓﺘﺢ اﻟﻤﻠﻔﺎت ﻟﻠﺘﻌﺎﻣﻞ ﻣﻌﮭﺎ Open Fileوﺗﺘﻢ ھﺬه اﻟﻌﻤﻠﯿﺔ ﻣﻦ ﺧﻼل اﻟﻮﻇﯿﻔﺔ Fopen Function
Open File Fopen Function
وﺗﻌﻤﻞ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻋﻠﻰ ﻓﺘﺢ اﻟﻤﻠﻔﺎت ﻹﺟﺮاء ﺟﻤﯿﻊ اﻟﻌﻤﻠﯿﺎت اﻟﻤﺘﺎﺣﺔ ﻋﻠﯿﮭﺎ ﻛﻤﺎ ﺗﻘﻮم ھﺬه اﻟﻮﻇﯿﻔﺔ ﻹﻋﺎدة اﻟﻤﻌﺎﻟﺞ
ﻟﮭﺬا اﻟﻤﻠﻒ File Handlerوھﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺘﻐﯿﺮ ﯾﺴﺘﺨﺪم ﻓﻲ ﺟﻤﯿﻊ اﻟﻌﻤﻠﯿﺎت اﻟﻼﺣﻘﺔ اﻟﺘﻲ ﺗﺘﻢ ﻋﻠﻰ اﻟﻤﻠﻒ ﻓﯿﻤﺎ
ﺑﻌﺪ وﺗﺄﺧﺬ اﻟﻮﻇﯿﻔﺔ Fopenأرﺑﻊ ﻣﻌﻄﯿﺎت ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ :
وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﺠﺪول اﻷﺳﺎﻟﯿﺐ اﻟﻤﺘﺎﺣﺔ ﻟﮭﺬا اﻟﻤﻌﻄﻰ وﻓﻲ ﺣﺎﻟﺔ ﺗﻌﯿﯿﻦ اﻷﺳﻠﻮب aأو abﻟﮭﺬا اﻟﻤﻌﻄﻰ ﻣﻊ ﻋﺪم
إﻧﺸﺎء اﻟﻤﻠﻒ ﺗﻘﻮم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ ﺑﺈﻧﺸﺎء اﻟﻤﻠﻒ ﺗﻠﻘﺎﺋﯿﺎً وﺗﻌﯿﯿﻦ اﻷﺳﻠﻮب W Write textﻟﮭﺬا اﻟﻤﻠﻒ
وھﻮ . Open_modeأﻣﺎ اﻟﻤﻌﻄﻰ اﻷﺧﯿﺮ ﻓﯿﻘﻮم ﺑﺘﺤﺪﯾﺪ ﻋﺪد اﻷﺣﺮف ﻓﻲ ﻛﻞ ﺳﻄﺮ واﻟﻘﯿﻤﺔ اﻟﺼﻐﺮىﻠﮭﺬا اﻟﻤﻌﻄﻰ
ھﻮ واﺣﺪ ] [1واﻟﻘﯿﻤﺔ اﻟﻜﺒﺮى ﻟﮫ ھﻮ 32767وﻓﻲ ﺣﺎﻟﺔ ﻋﺪم ﺗﻌﯿﯿﻦ ﻗﯿﻤﺔ ﻟﮭﺬا اﻟﻤﻌﻄﻰ ﺗﻘﻮم أوراﻛﻞ ﺑﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ
اﻓﺘﺮاﺿﯿﺔ ﻟﮭﺬا اﻟﻤﻌﻄﻰ وھﻲ 1024وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﯿﻞ أن ھﺬه اﻟﻮﻇﯿﻔﺔ ﺗﻘﻮم ﺑﺈﻋﺎدة اﻟﻤﻌﺎﻟﺞ ﻟﻠﻤﻠﻒ
File_handlerوھﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺘﻐﯿﺮ ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت File_typeوھﺬا اﻟﻤﺘﻐﯿﺮ ﺧﺎص ﺑﮭﺬه اﻟﻤﺠﻤﻮﻋﺔ
اﻟﺒﺮﻣﺠﯿﺔ ﻓﻘﻂ وﻟﮫ اﻟﺘﻌﺮﯾﻒ اﻟﺘﺎﻟﻲ:
اﻟﻤﻌﻄﻰ اﻷول ﻋﺒﺎرة ﻋﻦ اﻟﻤﻌﺎﻟﺞ اﻟﺨﺎص ﺑﺎﻟﻤﻠﻒ File_handlerوھﻮ Fileاﻟﺬي ﻧﺮﯾﺪ اﻟﻜﺘﺎﺑﺔ ﻋﻠﯿﮫ.
واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ ﺟﻤﻠﺔ ﻧﺼﯿﺔ اﻟﺘﻲ ﻧﺮﯾﺪ ﻛﺘﺎﺑﺘﮭﺎ ﻓﻲ اﻟﻤﻠﻒ وﯾﺘﻢ ﺗﻨﺴﯿﻖ ھﺬه اﻟﺠﻤﻠﺔ ﺑﺎﺳﺘﺨﺪام اﻟﺨﻮاص:
\n
%S
أﻣﺎ اﻟﻤﻌﻄﯿﺎت ﻣﻦ arg1إﻟﻰ arg5ﻓﮭﻲ ﻋﺒﺎرة ﻋﻦ اﻟﻘﯿﻢ اﻟﺘﻲ ﺗﺘﻢ ﺗﻌﻮﯾﺾ ﺑﮭﺎ ﺑﺪﻻ ﻣﻦ اﻟﺨﺎﺻﯿﺔ %Sﻓﻲ اﻟﺴﻠﺴﺔ
اﻟﻨﺼﯿﺔ وﻏﺎﻟﺒﺎ ﻣﺎ ﺗﻜﻮن ﻣﻦ اﻟﻨﻮع Varchar2وإذا ﻛﺎﻧﺖ ھﺬه اﻟﻘﯿﻢ ﻣﻦ أﻧﻮاع ﻏﯿﺮ ﻧﻮع اﻟﺒﯿﺎﻧﺎت Varchar2ﺗﻘﻮم
أوراﻛﻞ ﺑﺘﺤﻮﯾﻞ ھﺬه اﻟﻘﯿﻢ ﺗﻠﻘﺎﺋﯿﺎً إﻟﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت . Varchar2أﻣﺎ ﻋﻤﻠﯿﺎت اﻟﺤﺼﻮل ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت ﻣﻦ اﻟﻤﻠﻒ
ﻓﺘﺘﻢ ﻣﻦ ﺧﻼل اﻹﺟﺮاء Get_lineوﯾﻘﻮم ھﺬا اﻹﺟﺮاء ﺑﻘﺮاءة اﻷﺳﻄﺮ ﻣﻦ اﻟﻤﻠﻒ ﺛﻢ ﯾﻘﻮم ﺑﻮﺿﻌﮭﺎ ﻓﻲ اﻟﻤﻌﻄﻰ
Output Parameterوﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ:
وﺣﻔﻆ ﻧﺎﺗﺞ ھﺬا اﻟﺘﻘﺮﯾﺮ ﻓﻲ ﻣﻠﻒ ﺧﺎرﺟﻲ ﺛﻢ ﻋﺮض ھﺬا اﻟﺘﻘﺮﯾﺮ ﻋﻠﻰ اﻟﺸﺎﺷﺔ وﺳﻮف ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﻤﺠﻠﺪ اﻟﺬي
ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ ﻓﻲ اﻟﺴﺎﺑﻖ وھﻮ اﻟﻤﺠﻠﺪ OraLoadاﻟﻤﻮﺟﻮد ﻋﻠﻰ اﻟﻘﺮص اﻟﺼﻠﺐ Cﻛﻤﺎ ﻓﻲ اﻟﻜﻮد :
١
٢
٣
٤
٥
٦
٧
٨
٩
١٠
١١
١٢
١٣
١٤
١٥
١٦
١٧
١٨
١٩
٢٠
٢١
٢٢
٢٣
٢٤
٢٥
٢٦
ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء إﺟﺮاء ﻟﮫ اﻻﺳﻢ Sal_Statusﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [1وﻗﻤﻨﺎ ﺑﺘﻤﺮﯾﺮ ﻣﻌﻄﯿﯿﻦ ﻟﮭﺬا اﻹﺟﺮاء اﻟﻤﻌﻄﻰ
اﻷول ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺠﻠﺪ Director_nameوھﻮ P_filedirواﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﻠﻒ اﻟﺬي
ﺳﯿﺘﻢ ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت ﺑﮫ وھﻮ P_filenameوﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ ھﺬا اﻹﺟﺮاء ﯾﺘﻢ ﺗﻌﺮﯾﻒ ﻣﺘﻐﯿﺮات ﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت
File_typeوذﻟﻚ ﻻﺳﺘﺨﺪاﻣﮭﻢ ﻛﻤﻌﺎﻟﺠﺎت ﻟﻠﻤﻠﻒ File handlerﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮﯾﻦ ] [3,4ﺑﯿﻨﻤﺎ ﯾﺴﺘﺨﺪم اﻟﻤﺆﺷﺮ
emp_infoﻓﻲ اﻟﺴﻄﺮ ] [6ﻻﺳﺘﺨﻼص ﺑﯿﺎﻧﺎت اﻷﻗﺴﺎم رﻗﻢ ] [80,100ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [9ﻣﻦ اﻟﺠﺪول
employeesوﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺘﻢ ﺗﺮﺗﯿﺐ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﻢ اﺳﺘﺨﻼﺻﮭﺎ ﺣﺴﺐ رﻗﻢ اﻟﻘﺴﻢ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [10وﯾﺘﻢ
ﺗﻘﺴﯿﻢ اﻟﻮﻇﺎﺋﻒ داﺧﻞ ھﺬا اﻹﺟﺮاء إﻟﻰ ﺟﺰﺋﯿﯿﻦ رﺋﯿﺴﯿﯿﻦ:
اﻟﺠﺰء اﻷول :ﯾﺴﺘﺨﺪم ﻟﻜﺘﺎﺑﺔ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﯾﺘﻢ اﺳﺘﺨﻼﺻﮭﺎ ﻣﻦ اﻟﺠﺪول ﻓﻲ ﻣﻠﻒ ﺧﺎرﺟﻲ .
اﻟﺠﺰء اﻟﺜﺎﻧﻲ :ﯾﺴﺘﺨﺪم ﻟﻘﺮاءة اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﻢ ﻛﺘﺎﺑﺘﮭﺎ ﻓﻲ اﻟﻤﻠﻒ وﻃﺒﺎﻋﺘﮭﺎ .
ﻓﻔﻲ اﻟﺠﺰء اﻟﺨﺎص ﺑﻜﺘﺎﺑﺔ اﻟﺒﯿﺎﻧﺎت ﻟﻠﻤﻠﻒ ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ Fopenﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [14ﻟﻔﺘﺢ اﻟﻤﻠﻒ ﺣﯿﺚ ﯾﺘﻢ
ﺗﻤﺮﯾﺮ اﻟﻘﯿﻢ اﻟﻤﺪﺧﻠﺔ ﻟﻺﺟﺮاء إﻟﻰ ﻣﻌﻄﯿﺎت ھﺬه اﻟﻮﻇﯿﻔﺔ وھﻲ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺠﻠﺪ P_filedirواﺳﻢ اﻟﻤﻠﻒ
P_filenameأﻣﺎ اﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ﻓﮭﻮ ﻋﺒﺎرة ﻋﻦ اﻷﺳﻠﻮب اﻟﺨﺎص ﻟﻔﺘﺢ اﻟﻤﻠﻒ وھﻲ اﻟﻘﯿﻤﺔ ' 'Wﻓﻲ
ھﺬه اﻟﺤﺎﻟﺔ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [14واﻟﺘﻲ ﺗﻌﻨﻲ أﻧﮫ ﺳﯿﺘﻢ اﻟﻜﺘﺎﺑﺔ ﻋﻠﻰ اﻟﻤﻠﻒ وﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻟﻘﯿﻤﺔ اﻟﻤﺴﺘﺮﺟﻌﺔ ﻣﻦ ھﺬه
اﻟﻮﻇﯿﻔﺔ ﻟﻠﻤﺘﻐﯿﺮ V_filehandleواﻟﺬي ﯾﺴﺘﺨﺪم ﻛﻤﻌﺎﻟﺞ ﻟﻠﻤﻠﻒ ﻓﻲ اﻟﺴﻄﺮ ] [14وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ أﻧﮫ ﺳﯿﺘﻢ
اﻟﻜﺘﺎﺑﺔ ﻓﻲ اﻟﻤﻠﻒ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء PutFوﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺘﻢ اﺳﺘﺨﺪام ھﺬا اﻹﺟﺮاء ﻓﻲ أﻛﺜﺮ ﻣﻦ ﺟﺰء ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﻮر
] [15,20,22ﺣﯿﺚ ﯾﺴﺘﺨﺪم ﻓﻲ اﻟﺴﻄﺮ ] [15ﻟﻜﺘﺎﺑﺔ ﺗﺎرﯾﺦ اﻟﯿﻮم ﻋﻠﻰ اﻟﺘﻘﺮﯾﺮ وﯾﺴﺘﺨﺪم ﻓﻲ اﻟﺴﻄﺮ ] [20ﻟﻜﺘﺎﺑﺔ رﻗﻢ
اﻟﻘﺴﻢ اﻟﻤﻮﺟﻮد ﺑﮫ اﻟﻤﻮﻇﻔﯿﻦ اﻟﺬي ﺗﻢ اﺳﺘﺨﻼﺻﮭﻢ ﻣﻦ اﻟﺠﺪول ﺑﯿﻨﻤﺎ ﯾﺴﺘﺨﺪم ﻓﻲ اﻟﺴﻄﺮ ] [22ﻟﻜﺘﺎﺑﺔ أﺳﻤﺎء
اﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﻮﺟﻮدﯾﻦ ﺑﺎﻟﻘﺴﻢ اﻟﺬي ﺗﻢ ﻛﺘﺎﺑﺘﮫ ﻓﻲ اﻟﺠﻤﻠﺔ اﻟﺴﺎﺑﻘﺔ واﻟﺮواﺗﺐ اﻟﺨﺎﺻﺔ ﺑﮭﻢ وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ ﺟﻤﯿﻊ ھﺬه
اﻟﺠﻤﻞ أﻧﮫ ﯾﺘﻢ ﺗﻤﺮﯾﺮ اﻟﻤﺘﻐﯿﺮ V_filehandleﻛﻤﺎ ﻓﻲ اﻟﺴﻄﻮر ] [15,20,22ﻛﻤﻌﻄﻰ أول ﻟﺠﻤﯿﻊ ھﺬه اﻹﺟﺮاءات
%S \nﻟﺘﻨﺴﯿﻖ اﻟﻜﺘﺎﺑﺎت اﻟﺘﻲ ﯾﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ ﻓﻲ اﻟﻤﻠﻒ وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻹﺟﺮاء ﻛﻤﺎ ﯾﺘﻢ اﺳﺘﺨﺪام ھﺬه اﻟﺨﻮاص
ﺳﻄﺮ ] [22ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﻜﻠﻤﺔ Employeeﯾﻠﯿﮭﺎ اﻟﺨﺎﺻﯿﺔ %Sواﻟﺘﻲ ﯾﺘﻢ اﻟﺘﻌﻮﯾﺾ ﻋﻨﮭﺎ ﺑﻘﯿﻤﺔ اﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ وھﻮ
اﺳﻢ اﻟﻤﻮﻇﻒ v_emp_rec.last_nameﺛﻢ اﻟﻜﻠﻤﺔ earnsﯾﻠﯿﮭﺎ اﻟﺨﺎﺻﯿﺔ %Sواﻟﺬي ﯾﺘﻢ اﻟﺘﻌﻮﯾﺾ ﻋﻨﮭﺎ ﺑﻘﯿﻤﺔ
اﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ وھﻮ اﻟﺮاﺗﺐ اﻟﺨﺎص ﺑﮭﺬا اﻟﻤﻮﻇﻒ v_emp_rec.salaryأﻣﺎ اﻟﺨﺎﺻﯿﺔ \nﻓﺘﺴﺘﺨﺪم ﻟﻨﻘﻞ ﻣﺆﺷﺮ
اﻟﻜﺘﺎﺑﺔ داﺧﻞ اﻟﻤﻠﻒ إﻟﻰ ﺑﺪاﯾﺔ ﺳﻄﺮ ﺟﺪﯾﺪ.
أﻣﺎ اﻹﺟﺮاء Put_Lineﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [25ﻓﯿﺴﺘﺨﺪم ﻹﻇﮭﺎر اﻟﺠﻤﻠﺔ end of Reportﻓﻲ ﻧﮭﺎﯾﺔ اﻟﺘﻘﺮﯾﺮ.
أﻣﺎ اﻹﺟﺮاء Fcloseﻓﯿﺴﺘﺨﺪم ﻟﻺﻏﻼق اﻟﻤﻠﻒ وﻋﻨﺪ ھﺬه اﻟﻤﺮﺣﻠﺔ ﻗﺪ اﻧﮭﯿﻨﺎ اﻟﺒﺮﻧﺎﻣﺞ وھﻮ إﻧﺸﺎء ﻣﻠﻒ ﯾﻘﻮم ﺑﺤﻔﻆ
اﻟﺘﻘﺮﯾﺮ اﻟﺨﺎص ﺑﺎﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﻮﺟﻮدﯾﻦ ﺑﺎﻷﻗﺴﺎم 80و ..... 100
٢٧
٢٨
٢٩
٣٠
٣١
٣٢
٣٣
٣٤
٣٥
٣٦
٣٧
٣٨
٣٩
٤٠
٤١
٤٢
٤٣
٤٤
٤٥
٤٦
٤٧
اﻟﺸﺮح :
ﻓﻲ ﺑﺪاﯾﺔ ھﺬا اﻟﻜﻮد اﻟﺴﻄﺮ ] [27ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ is_openﻟﻠﺘﺄﻛﺪ ﻣﻦ ﺣﺎﻟﺔ اﻟﻤﻠﻒ ھﻞ ھﻮ ﻣﻔﺘﻮح أم ﻻ ﻓﺈذا ﻛﺎن
اﻟﻤﻠﻒ ﻣﻔﺘﻮح ﯾﻜﻮن ﻧﺎﺗﺞ ھﺬه اﻟﻮﻇﯿﻔﺔ Trueأﻣﺎ إذا ﻛﺎن اﻟﻤﻠﻒ ﻣﻐﻠﻖ ﯾﻜﻮن ﻧﺎﺗﺞ ھﺬه اﻟﻮﻇﯿﻔﺔ Falseوﯾﺘﻢ ذﻟﻚ ﻋﻦ
ﻃﺮﯾﻖ وﺿﻊ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻛﺸﺮط ﻟﻠﺠﻤﻠﺔ اﻟﺸﺮﻃﯿﺔ IFوﻓﻲ ﺣﺎﻟﺔ ﻋﺪم ﻓﺘﺢ اﻟﻤﻠﻒ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﺠﻤﻠﺔ Elseﻛﻤﺎ ﻓﻲ
اﻟﺴﻄﺮ ] [29وﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ Fopenﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [30ﻟﻔﺘﺢ اﻟﻤﻠﻒ وﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻷﺳﻠﻮب ) (rﻟﮭﺬه
اﻟﻮﻇﯿﻔﺔ وھﺬا اﻷﺳﻠﻮب ﯾﻌﻨﻲ أﻧﮫ ﺗﻢ ﻓﺘﺢ اﻟﻤﻠﻒ ﻟﻠﻘﺮاءة وﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺘﻢ ﺗﻌﯿﯿﻦ اﻟﻘﯿﻤﺔ اﻟﻤﺴﺘﺮﺟﻌﺔ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ
ﻟﻠﻤﺘﻐﯿﺮ V_filehandlerوﻟﻘﺮاءة اﻷﺳﻄﺮ اﻟﻤﻮﺟﻮدة ﺑﺎﻟﻤﻠﻒ اﻟﺨﺎرﺟﻲ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء Get_lineﻛﻤﺎ ﻓﻲ
اﻟﺴﻄﺮ ] [33وذﻟﻚ ﻻﺳﺘﺮﺟﺎع اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ ھﺬا اﻟﻤﻠﻒ وﺗﺨﺰﯾﻨﮭﺎ ﻓﻲ اﻟﻤﺘﻐﯿﺮ V_Outputtextاﻟﺬي ﻗﻤﻨﺎ
ﺑﺘﻌﺮﯾﻔﮭﺎ ﻣﺴﺒﻘﺎً ﻓﻲ اﻟﻘﺴﻢ Declarative Sectionوﻟﻌﺮض اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ ھﺬا اﻟﻤﺘﻐﯿﺮ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام
-ﺗﺘﯿﺢ ﻟﻨﺎ اﻷﻛﻮاد Dynamic SQLإﻣﻜﺎﻧﯿﺔ اﺳﺘﺨﺪام ﻛﻼ ﻣﻦ اﻟﺠﻤﻞ DDLأو اﻟﺠﻤﻞ Session Control
-ﺗﺴﺘﺨﺪم اﻟﺠﻤﻠﺔ Execute Immediateﻓﻲ ﻛﺘﺎﺑﺔ اﻟﻜﻮد Native Dynamic SQLداﺧﻞ اﻟﻜﻮد . SQL
-ﻓﻲ اﻟﻤﺠﻤﻮﻋﺎت اﻟﺒﺮﻣﺠﯿﺔ DBMS_JOBﯾﺘﻢ ﺗﺸﻐﯿﻞ وﺣﺬف اﻟﻮﻇﺎﺋﻒ ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاءات . Run_Remove
ﺣﯿﺚ ﺗﺼﻞ اﻟﻘﺪرة اﻟﺘﺨﺰﯾﻨﯿﺔ ﻟﮭﺬا اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﻣﻦ 128 Terabyteإﻟﻰ 8Gigabyteوﯾﻨﻘﺴﻢ ھﺬا
اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﻰ ﻋﺪد ﻣﻦ اﻷﻧﻮاع ﻣﻨﮭﺎ اﻟﻨﻮع :
- BLOB Binary Large Object
وھﻮ ﯾﺪﻋﻢ ﻋﻤﻠﯿﺔ ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﺜﻨﺎﺋﯿﺔ ﻛﺒﯿﺮة اﻟﺤﺠﻢ ﻣﺜﻞ ﻣﻠﻔﺎت اﻟﻔﯿﺪﯾﻮ . Video Files
- CLOB Character Large Object ﯾﺪﻋﻢ اﻟﺒﯿﺎﻧﺎت اﻟﺤﺮﻓﯿﺔ
-NCLOB Multibyte Character Large Object
ﯾﺪﻋﻢ اﻟﺒﯿﺎﻧﺎت اﻟﺤﺮﻓﯿﺔ اﻟﻤﺘﻌﺪدة .
- BFILE Binary FILE
ﯾﻤﺜﻞ ﻣﻠﻒ ﺛﻨﺎﺋﻲ ﯾﺘﻢ ﺗﺨﺰﯾﻨﮫ ﻓﻲ ﻣﻠﻒ ﻧﻈﺎم ﺗﺸﻐﯿﻞ ﺛﻨﺎﺋﻲ ﺧﺎرج ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت .
وﯾﺘﻜﻮن ﻧﻮع اﻟﺒﯿﺎﻧﺎت LOBﻣﻦ ﺟﺰﺋﯿﻦ :
اﻟﺠﺰء اﻷول LOB Value :ھﻮ ﻋﺒﺎرة ﻋﻦ اﻟﻘﯿﻤﺔ اﻟﻤﻜﻮﻧﺔ ﻟﻠﻌﻨﺼﺮ اﻟﺤﻘﯿﻘﻲ اﻟﺬي ﯾﺘﻢ ﺗﺨﺰﯾﻨﮫ .
اﻟﺠﺰء اﻟﺜﺎﻧﻲ LOB Locator :ﻋﺒﺎرة ﻋﻦ اﻟﻤﺆﺷﺮ اﻟﺬي ﯾﺸﯿﺮ إﻟﻰ ﻣﻮﻗﻊ اﻟﻘﯿﻤﺔ اﻟﻔﻌﻠﯿﺔ اﻟﻤﺨﺰﻧﺔ ﺳﻮاءً داﺧﻞ
ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أو ﺧﺎرﺟﮭﺎ ﺣﯿﺚ ﯾﻘﻮم اﻟﻌﻤﻮد اﻟﻤﻌﺮف ﺑﮭﺬا اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت LOBﺑﺘﺨﺰﯾﻦ ﻣﺎ ﯾﺴﻤﻰ
ﺑﺎﻟﻤﺆﺷﺮ واﻟﺬي ﯾﺸﯿﺮ إﻟﻰ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺨﺰﻧﺔ ﻓﻲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أو ﯾﺸﯿﺮ إﻟﻰ اﻟﻤﻠﻒ اﻟﻤﺨﺰن ﺧﺎرج ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت
ﻟﺬﻟﻚ ﻓﻘﺪ ﺗﻢ ﺗﻘﺴﯿﻢ ﻧﻮع اﻟﺒﯿﺎﻧﺎت LOBإﻟﻰ ﻓﺌﺘﯿﻦ ﻣﻦ ﺣﯿﺚ اﻟﻌﻤﻠﯿﺔ اﻟﺘﺨﺰﯾﻨﯿﺔ -:
• ﻓﺌﺔ ﺗﻘﻮم ﺑﺎﻟﺘﺨﺰﯾﻦ اﻟﺪاﺧﻠﻲ ﻟﻠﺒﯿﺎﻧﺎت Internal LOBواﻟﺘﻲ ﺗﻤﺜﻞ اﻷﻧﻮاع BLOB، NCLOB ، CLOB:
ﺣﯿﺚ ﺗﻘﻮم ھﺬه اﻷﻧﻮاع ﺑﺘﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت داﺧﻞ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت .
Internal LOB
ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ ﻋﻠﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت LOBوذﻛﺮﻧﺎ أﻧﮫ ﯾﺤﺘﻮي ﻋﻠﻰ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺗﻘﻮم ﺑﺘﺨﺰﯾﻦ
اﻟﺒﯿﺎﻧﺎت داﺧﻠﯿﺎً أي داﺧﻞ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻓﻲ ﻣﻨﺎﻃﻖ ﻣﻨﻔﺼﻠﺔ Separate Segmentsﻣﺜﻞ ﻧﻮع اﻟﺒﯿﺎﻧﺎت :
BLOB
CLOB
NCLOB
وﯾﻤﻜﻦ أن ﺗﻜﻮن ھﺬه اﻷﻧﻮاع ﺧﺎﺻﯿﺔ ﻣﻦ ﺧﺼﺎﺋﺺ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت اﻟﻤﻌﺮﻓﺔ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم أو ﻋﻤﻮد ﻓﻲ ﺟﺪول أو
ﻧﻮع ﻣﻦ أﻧﻮاع اﻟﻤﺘﻐﯿﺮات أو ﺣﺘﻰ ﻣﺘﻐﯿﺮات أو ﻣﻌﻄﯿﺎت أو ﻧﺘﯿﺠﺔ ﻓﻲ اﻟﻠﻐﺔ PL/SQLﻛﻤﺎﻓﻲ اﻟﻤﺨﻄﻂ اﻟﺘﺎﻟﻲ:
ﻛﻤﺎ ﯾﻮﻓﺮ ﺧﺎدم أوراﻛﻞ ﺑﻌﺾ اﻟﺪﻋﻢ ﻟﮭﺬه اﻷﻧﻮاع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﻋﺒﺮ اﻟﻠﻐﺔ SQLوﻹدارة ﻣﺜﻞ ھﺬه اﻷﻧﻮاع ﻣﻦ
اﻟﺒﯿﺎﻧﺎت ﻻﺑﺪ ﻣﻦ اﻟﻤﺮور ﺑﻌﺪة ﺧﻄﻮات :
اوﻻ :إﻧﺸﺎء وإﺿﺎﻓﺔ اﻟﺒﯿﺎﻧﺎت ﻟﻠﺠﺪول اﻟﺬي ﺳﯿﺤﺘﻮي ﻋﻠﻰ اﻟﺒﯿﺎﻧﺎت LOBﻣﻦ ﺗﻌﺮﯾﻒ اﻟﻤﺆﺷﺮ LOB Locator
Select For update وإﻋﻄﺎﺋﮫ اﻟﻘﯿﻤﺔ اﻻﺑﺘﺪاﺋﯿﺔ ﻟﻠﺒﺮﻧﺎﻣﺞ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ:
ﻹﻏﻼق اﻟﺼﻒ اﻟﻤﻮﺟﻮد ﺑﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت . LOB
ﺛﺎﻧﯿﺎ :ﻣﻌﺎﻟﺠﺔ ﻧﻮع اﻟﺒﯿﺎﻧﺎت LOBﻷي ﻣﻦ اﻟﻮاﺟﮭﺎت Interfacesاﻟﺴﺎﺑﻖ ذﻛﺮھﺎ .
وأﺧﯿﺮاً اﺳﺘﺨﺪام اﻟﺠﻤﻠـــــﺔ Commitﻹﻧﮭﺎء وﺗﺜﺒﯿﺖ اﻹﺟﺮاء ﻋﻠﻰ اﻟﻮﺿﻊ اﻟﺤﺎﻟﻲ.
****************************************************
BFILE
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت Bfileوﯾﻘﻮم ھﺬا اﻟﻨﻮع ﺑﺪﻋﻢ اﻟﺘﺨﺰﯾﻦ اﻟﺨﺎرﺟﻲ ﻟﻠﻌﻨﺎﺻﺮ اﻟﻜﺒﯿﺮة
ﻟﻠﺒﯿﺎﻧﺎت ﻓﻲ ﻣﻠﻔﺎت ﻧﻈﺎم اﻟﺘﺸﻐﯿﻞ اﻟﺨﺎرﺟﻲ External Fileﺣﯿﺚ ﯾﻘﻮم ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﺒﯿﺎﻧﺎت ﺑﺘﺨﺰﯾﻦ اﻟﻤﺆﺷﺮ
Locatorﻟﻠﻤﻠﻔﺎت اﻟﻤﺨﺰﻧﺔ ﺧﺎرﺟﯿﺎً وﯾﻤﻜﻦ اﺳﺘﺪام ھﺬا اﻟﻨﻮع ﻣﻦ أﻧﻮاع اﻟﺒﯿﺎﻧﺎت ﻟﺘﺨﺰﯾﻦ اﻟﻤﻠﻔﺎت ذات اﻻﻣﺘﺪاد :
GIF ، JPEGواﻟﺘﻲ ﺗﻤﺜﻞ اﻟﺼﻮر أو MPEG2 ، MPEGواﻟﺘﻲ ﺗﻤﺜﻞ ﻣﻠﻔﺎت اﻟﻔﯿﺪﯾﻮ .ﻛﻤﺎ ﺗﺴﺘﺨﺪم أﯾﻀﺎ
ﻟﺘﺨﺰﯾﻦ اﻟﻤﻠﻔﺎت اﻟﻨﺼﯿﺔ Textﺑﺎﻹﺿﺎﻓﺔ إﻟﻰ اﻟﻌﺪﯾﺪ ﻣﻦ اﻷﺷﻜﺎل اﻷﺧﺮى ﻟﻠﻤﻠﻔﺎت اﻟﻨﻈﺎم وﯾﺴﻤﺢ ﻟﻨﺎ ﺧﺎدم أوراﻛﻞ
Oracle serverﺑﺘﺨﺰﯾﻦ اﻟﻤﻠﻔﺎت اﻟﺨﺎرﺟﯿﺔ ﻋﻠﻰ اﻷﻗﺮاص اﻟﺼﻠﺒﺔ Hard Diskأو ﻋﻠﻰ اﻷﻗﺮاص اﻟﻤﺪﻣﺠﺔ CD-
Romأو أي وﺣﺪة ﻣﻦ وﺣﺪات اﻟﺘﺨﺰﯾﻦ اﻷﺧﺮى وﻣﻦ ﺛﻢ أن ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ ﺗﺪﻋﻢ ﻧﻮع اﻟﺒﯿﺎﻧﺎت BFile
ﻟﺘﻤﻜﯿﻦ ﻣﺴﺘﺨﺪﻣﻲ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﻮﺻﻮل إﻟﻰ اﻟﻤﻠﻔﺎت اﻟﻨﻈﺎم اﻟﺨﺎرﺟﯿﺔ . External File system
وﯾﻘﻢ ﻟﻨﺎ ﺧﺎدم أوراﻛﻞ ﺛﻼﺛﺔ ﻋﻤﻠﯿﺎت رﺋﯿﺴﯿﺔ ﻟﻠﺘﻔﺎﻋﻞ ﻣﻊ ﻧﻮع اﻟﺒﯿﺎﻧﺎت -: Bfile
ﯾﺘﻢ إﻧﺸﺎء ﻋﻨﺼﺮ اﻟﻤﺠﻠﺪ ex_picاﻟﻤﻮﺟﻮد ﻋﻠﻰ اﻟﻘﺮص Cﺑﺎﻟﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺑﺎﻻﺳﻢ ex_picوﻣﻨﺢ ﺟﻤﯿﻊ
اﻟﻤﺴﺘﺨﺪﻣﯿﻦ ﺣﻘﯿﺔ ﻗﺮاءة ھﺬا اﻟﻤﺠﻠﺪ ﻣﻦ ﺧﻼل اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ Readﻓﻲ اﻟﺠﻤﻠﺔ Grantوﺗﺄﺗﻲ ﺑﻌﺪ ذﻟﻚ ﻣﺮﺣﻠﺔ
ﺗﺨﺰﯾﻦ ﻣﺴﺎر ھﺬه اﻟﻤﻠﻔﺎت ﻓﻲ اﻟﺠﺪول اﻟﺬي ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻮﻇﯿﻔﺔ BFilenameواﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ
رﺑﻂ ﻛﻞ ﻣﻠﻒ ﻣﻦ ﻣﻠﻔﺎت اﻟﻨﻈﺎم ﺑﺎﻟﺴﺠﻞ اﻟﺨﺎص ﺑﮫ ﺑﺎﻟﺠﺪول وﺗﺄﺧﺬ اﻟﻮﻇﯿﻔﺔ BFilenameاﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ :
وﺗﺄﺧﺬ ھﺬه اﻟﻮﻇﯿﻔﺔ ﻣﻌﻄﯿﺎن اﻟﻤﻌﻄﻰ اﻷول Directory_aliasوھﻮ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻌﻨﺼﺮ Directory
Objectاﻟﺬي ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎﺋﮫ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﻠﻒ Filenameاﻟﻤﺨﺰن داﺧﻞ اﻟﻤﺠﻠﺪ اﻟﻔﻌﻠﻲ وﻟﻌﻤﻞ
ھﺬه اﻟﻤﺮﺣﻠﺔ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﻮﻇﯿﻔﺔ داﺧﻞ اﻟﺠﻤﻠﺔ Insertوذﻟﻚ ﻟﺘﻌﯿﯿﻦ اﻟﻘﯿﻤﺔ ﻓﻲ اﻟﻌﻤﻮد اﻟﻤﻌﺮف ﺑﺎﻟﺒﯿﺎﻧﺎت
Bfileﻛﻤﺎ ﯾﻤﻜﻦ ﺗﻌﯿﯿﻦ اﻟﻘﯿﻤﺔ Nullﺑﺎﻟﻌﻤﻮد اﻟﻤﻌﺮف ﺑﮭﺬا اﻟﻨﻮع ﻣﻦ اﻟﺒﯿﺎﻧﺎت ﻋﻨﺪ إﻧﺸﺎء اﻟﺠﺪول ﺛﻢ ﻋﻤﻞ ﺗﻌﺪﯾﻞ
ﻟﻘﯿﻤﺔ ھﺬا اﻟﻌﻤﻮد ﻓﯿﻤﺎ ﺑﻌﺪ وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ Updateﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل إذا أردﻧﺎ ﺗﻌﺪﯾﻞ ﻗﯿﻤﺔ اﻟﻌﻤﻮد
Emp_videoاﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻮﻇﻒ رﻗﻢ 100ﻣﺜﻼ ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺠﻤﻠﺔ :
واﻟﻘﺴﻢ اﻟﺜﺎﻧﻲ ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﺒﺮاﻣﺞ اﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ ﻗﺮاءة أو اﺧﺘﺒﺎر ﺑﯿﺎﻧﺎت ھﺬا اﻟﻨﻮع وﺗﺘﻤﺜﻞ ﻓﻲ اﻟﺒﺮاﻣﺞ اﻟﻤﻮﺟﻮدة
ﻓﻲ اﻟﺠﺪول اﻟﺘﺎﻟﻲ:
وﻟﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ھﺬه اﻟﺒﺮاﻣﺞ داﺧﻞ اﻟﺒﺮﻧﺎﻣﺞ PL/SQLﻧﻨﻈﺮ إﻟﻰ اﻟﻤﺜﺎل اﻟﺘﺎﻟﻲ:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ﺗﻮﺿﯿﺢ
ﺣﯿﺚ ﯾﻌﻤﻞ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ ﻋﻠﻰ ﺗﺨﺰﯾﻦ ﺑﯿﺎﻧﺎت اﻟﻤﻠﻔﺎت اﻟﺬي ﻗﻤﻨﺎ ﺑﺤﻔﻈﮭﺎ ﻓﻲ اﻟﻤﺠﻠﺪ ex_picﻓﻲ اﻟﺠﺪول exوذﻟﻚ ﻣﻦ
ﺧﻼل ﻋﺪد ﻣﻦ اﻟﺨﻄﻮات وﯾﺠﺐ ﻣﻼﺣﻈﺔ أم ھﺬه اﻟﻤﻠﻔﺎت ﻋﺒﺎرة ﻋﻦ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺼﻮر اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻮﻇﻔﯿﻦ ﺣﯿﺚ
ﺗﺄﺧﺬ ھﺬه اﻟﺼﻮرة ﻧﻔﺲ أﺳﻤﺎء اﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﺨﺰﻧﺔ ﻓﻲ اﻟﺤﻘﻞ nameﻓﻲ اﻟﺠﺪول exوﺑﺎﻻﻣﺘﺪاد .jpg
ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪروس اﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﺒﯿﺎﻧﺎت Bfileﻣﻦ ﺧﻼل اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ DBMS_LOB
ﻛﻤﺎ ﺗﻌﺮﻓﻨﺎ أﯾﻀﺎ ﻋﻠﻰ ﻣﺠﻤﻮﻋﺔ ﻣﻦ اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﻟﮭﺬه اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ .
وﻓﻲ ھﺬا اﻟﺪرس ﺳﻮف ﻧﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ اﻟﺘﻌﺎﻣﻞ ﻣﻊ اﻟﺒﯿﺎﻧﺎت اﻟﺪاﺧﻠﯿﺔ ﻟﻠﻨﻮع LOBﻣﻦ ﺣﯿﺚ ﺗﻌﺮﯾﻔﮭﺎ أو أﺿﺎﻓﺘﮭﺎ
ﻓﻲ ﺟﺪاول ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وإﻣﻜﺎﻧﯿﺔ اﻟﻜﺘﺎﺑﺔ ﻋﻠﯿﮭﺎ ﻛﻤﺎ ﺳﻨﺘﻌﺮف أﯾﻀﺎ ﻋﻠﻰ ﻛﯿﻔﯿﺔ ﻗﺮاءة اﻟﺒﯿﺎﻧﺎت اﻟﻤﺨﺰﻧﺔ ﻋﻠﯿﮭﺎ ﻓﺈذا
أردﻧﺎ ﻣﺜﻼ إﺿﺎﻓﺔ ﻋﻤﻮد ﺟﺪﯾﺪ ﯾﻘﻮم ﺑﺤﻔﻆ ﺑﻌﺾ اﻟﻤﻌﻠﻮﻣﺎت ﻋﻦ ﻛﻞ ﻣﻮﻇﻒ ﻓﻲ اﻟﺠﺪول exﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد:
;Alter table ex Add emp_info CLOB
وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻜﻮد أﻧﻨﺎ ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻒ اﻟﻌﻤﻮد emp_infoﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت CLOBﻓﻲ اﻟﺠﻤﻠﺔ Alter table
وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺨﺎﺻﯿﺔ Addوﺑﻌﺪ إﺿﺎﻓﺔ اﻟﻌﻤﻮد emp_infoﻟﻠﺠﺪول ﻧﻘﻮم ﺑﻌﻤﻞ ﻓﺤﺺ ﻟﻠﻘﯿﻢ اﻟﻤﻮﺟﻮدة ﻓﻲ
ﺻﻔﻮف ھﺬا اﻟﻌﻤﻮد وذﻟﻚ ﻣﻦ ﺧﻼل ھﺬا اﻟﻜﻮد :
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ﺗﻮﺿﯿﺢ
ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ اﻟﻌﻤﻮد emp_rec.emp_infoﻓﻲ اﻟﺴﻄﺮ ] [7ﻟﻠﻤﺘﻐﯿﺮ Directionsاﻟﺬي ﻗﻤﻨﺎ ﺑﺘﻌﺮﯾﻔﮫ ﻓﻲ
اﻟﻘﺴﻢ Declareﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [2ﺛﻢ ﻗﻤﻨﺎ ﺑﻌﻤﻞ اﺧﺘﺒﺎر ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ اﻟﺸﺮﻃﯿﺔ IFﻓﻲ اﻟﺴﻄﺮ ][8
ﻓﺈذا ﻛﺎﻧﺖ ھﺬه اﻟﻘﯿﻤﺔ Nullﯾﺘﻢ إﻇﮭﺎر اﻟﺮﺳﺎﻟﺔ ' ' value is Nullﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [9ﺛﻢ ﻧﻘﻮم ﺑﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ
اﻓﺘﺮاﺿﯿﺔ ﻟﻠﻌﻤﻮد emp_infoﻓﻲ اﻟﺴﻄﺮ ] [10وذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻮﻇﯿﻔﺔ ) ( empty_CloBوﺗﻌﻤﻞ ھﺬه اﻟﻮﻇﯿﻔﺔ
ﻋﻠﻰ اﺳﺘﺮﺟﺎع ﻣﺆﺷﺮ Pointerﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت CLOBوﺗﮭﯿﺌﺔ ھﺬا اﻟﻌﻤﻮد ﻟﺘﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ وﺿﻊ
ﻗﯿﻤﺔ اﻓﺘﺮاﺿﯿﺔ ﻟﮫ ﺣﯿﺚ ﻻ ﯾﻤﻜﻦ اﻟﺘﻌﺎﻣﻞ ﻣﻊ ﻧﻮع اﻟﺒﯿﺎﻧﺎت CLOBوھﻮ ﯾﺤﺘﻮي ﻋﻠﻰ ﻗﯿﻤﺔ Nullأﻣﺎ أذا ﻛﺎﻧﺖ ھﺬه
' 'value is not Nullﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [13أﻣﺎ اﻟﻘﯿﻤﺔ ﻗﯿﻤﺔ أﺧﺮى ﻏﯿﺮ اﻟﻘﯿﻤﺔ Nullﯾﺘﻢ أﻇﮭﺎر اﻟﺮﺳﺎﻟﺔ
اﻟﻮﻇﯿﻔﺔ DBMS_LOB.GetLengthﻓﺘﺴﺘﺨﺪم ﻹﻇﮭﺎر ﻃﻮل اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ ھﺬا اﻟﻌﻤﻮد ﺣﯿﺚ ﺗﺄﺧﺬ ھﺬه
اﻟﻮﻇﯿﻔﺔ ﻣﻌﻄﻰ واﺣﺪاً ﻓﻘﻂ وھﻮ ﻋﺒﺎرة ﻋﻦ ﻣﺘﻐﯿﺮ ﻣﻦ ﻧﻮع اﻟﺒﯿﺎﻧﺎت CLOBأو BLOBأو Bfileوﺗﻌﻤﻞ ھﺬه
اﻟﻮﻇﯿﻔﺔ ﻋﻠﻰ إﻋﺎدة ﻗﯿﻤﺔ ﻋﺪدﯾﺔ ﺗﻤﺜﻞ ﻃﻮل اﻟﺒﯿﺎﻧﺎت اﻟﻤﺨﺰﻧﺔ ﻓﻲ ھﺬا اﻟﻤﺘﻐﯿﺮ ). (Directions
ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﺿﺎﻓﺔ أﻋﻤﺪة ﻟ ﮭﺎ ﻧﻮع اﻟﺒﯿﺎﻧﺎت LOBﻓﻲ ﺟﺪاول ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وﻛﯿﻔﯿﺔ ﺗﮭﯿﺌﺔ
ھﺬه اﻷﻋﻤﺪة ﻟﻼﺳﺘﺨﺪام ﺑﻮاﺳﻄﺔ اﻟﻮﻇﯿﻔﺔ empty_Clobوﺳﻮف ﻧﺴﺘﻜﻤﻞ ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ اﻟﺘﻌﺮف ﻋﻠﻰ ﺑﻌﺾ
اﻟﺒﺮاﻣﺞ اﻟﻔﺮﻋﯿﺔ ﺷﺎﺋﻌﺔ اﻻﺳﺘﺨﺪام ﻓﻲ اﻟﻤﺠﻤﻮﻋﺔ DBMS_LOBوﻣﻨﮭﺎ اﻹﺟﺮاءات Write :و Write
Appendو Readوﯾﻌﻤﻞ اﻹﺟﺮاء Writeﻋﻠﻰ ﻛﺘﺎﺑﺔ ﻛﻤﯿﺔ ﻣﺤﺪدة ﻣﻦ اﻟﺒﯿﺎﻧﺎت ﻓﻲ ﻧﻮع اﻟﺒﯿﺎﻧﺎت Internal
LOBوذﻟﻚ ﺑﺪاﯾﺔ ﻣﻦ ﻣﻮﺿﻊ ﻣﺤﺪد ﻟﻸﺣﺮف ﯾﻘﻮم اﻟﻤﺴﺘﺨﺪم ﺑﺘﺤﺪﯾﺪه ﻓﺈذا ﻗﺎم اﻟﻤﺴﺘﺨﺪم ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﺑﺘﺤﺪﯾﺪ
اﻟﻘﯿﻤﺔ 5ﻛﻤﻮﺿﻊ ﻟﺒﺪاﯾﺔ اﻟﻜﺘﺎﺑﺔ ﻓﺈن ھﺬا اﻹﺟﺮاء ﺳﻮف ﯾﻘﻮم ﺑﺎﻟﻜﺘﺎﺑﺔ أﺑﺘﺪاءأً ﻣﻦ ﻣﻮﺿﻊ اﻟﺤﺮف اﻟﺨﺎﻣﺲ وﺳﻮف
ﯾﻘﻮم ھﺬا اﻹﺟﺮاء ﺑﺎﺳﺘﺒﺪال أي ﺑﯿﺎﻧﺎت ﻣﻮﺟﻮدة أﺑﺘﺪاءاً ﻣﻦ ھﺬا اﻟﻤﻮﺿﻊ إﻟﻰ ﻧﮭﺎﯾﺔ ﻛﻤﯿﺔ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺪﺧﻠﺔ .
واﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﮭﺬا اﻹﺟﺮاء ھﻲ:
وﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ ھﺬه اﻟﺼﯿﻐﺔ ﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء أرﺑﻌﺔ ﻣﻌﻄﯿﺎت :
اﻟﻤﻌﻄﻰ اﻷول Lobdstﻋﺒﺎرة ﻋﻦ ﻣﺆﺷﺮ ﯾﺸﯿﺮ إﻟﻰ ﻣﻜﺎن اﻟﻜﺘﺎﺑﺔ وﯾﻤﻜﻦ أن ﯾﻜﻮن ھﺬا اﻟﻤﺆﺷﺮ ﻣﻦ اﻟﻨﻮع
BLOB/CLOBوذﻟﻚ ﺣﺴﺐ ﻧﻮع اﻟﺒﯿﺎﻧﺎت اﻟﺬي ﯾﺸﯿﺮ إﻟﯿﮫ .واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ amountﻋﺒﺎرة ﻋﻦ ﺣﺠﻢ اﻟﺒﯿﺎﻧﺎت
اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ وھﺬا اﻟﻤﻌﻄﻰ ﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت . Binary_integerواﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ offsetﻋﺒﺎرة ﻋﻦ اﻟﻤﻮﺿﻊ
اﻟﺬي ﺳﯿﺘﻢ اﻟﻜﺘﺎﺑﺔ ﻣﻨﮫ وﻟﮫ ﻧﻮع اﻟﺒﯿﺎﻧﺎت . integerاﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ Bufferھﻮ ﻋﺒﺎرة ﻋﻦ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ
ﻓﮭﻲ أﻣﺎ أن ﺗﻜﻮن ﻣﻦ اﻟﻨﻮع Varchar2إذا ﻛﺎن اﻟﻤﺆﺷﺮ ﯾﺸﯿﺮ إﻟﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت CLOBأو ﻣﻦ ﻧﻮع Rawإذا ﻛﺎن
اﻟﻤﺆﺷﺮ ﯾﺸﯿﺮ إﻟﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت . BLOBوﻟﻤﺰﯾﺪا ﻣﻦ اﻟﺘﻮﺿﯿﺢ ﻧﻘﻮم ﺑﺎﻟﺘﻌﺮف ﻋﻠﻰ ھﺬا اﻟﻤﺜﺎل :
1
2
3
4
5
6
7
8
9
10
11
12
16
17
18
19
20
21
ﺗﻮﺿﯿﺢ
ﯾﻌﻤﻞ ھﺬا اﻟﺒﺮﻧﺎﻣﺞ ﻋﻠﻰ ﻛﺘﺎﺑﺔ ﺑﻌﺾ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺘﻌﻠﻘﺔ ﺑﺎﻟﻤﻮﻇﻔﯿﻦ اﻟﻤﻮﺟﻮدﯾﻦ ﺑﺎﻟﺠﺪول exﺑﺎﻟﻌﻤﻮد emp_info
اﻟﻤﻮﺟﻮد ﺑﻨﻔﺲ اﻟﺠﺪول ﻛﻤﺎ ﻓﻲ ﻧﻼﺣﻆ ﻓﻲ اﻟﺴﻄﺮ ] [9ﺗﻢ ﺗﻌﯿﯿﻦ ﻗﯿﻤﺔ اﻟﻌﻤﻮد emp_infoﻟﻠﻤﺘﻐﯿﺮ Directionsﺛﻢ ﯾﺘﻢ
ﻋﻤﻞ اﺧﺘﺒﺎر ﻟﻤﺤﺘﻮﯾﺎت ھﺬا اﻟﻤﺘﻐﯿﺮ وذﻟﻚ ﻟﻠﺘﺄﻛﺪ ﻣﻦ ﻋﺪم وﺟﻮد ﻛﺘﺎﺑﺎت ﺑﮭﺬا اﻟﻤﺘﻐﯿﺮ وﻓﻲ ﺣﺎﻟﺔ ﻋﺪم اﺣﺘﻮاء ھﺬا اﻟﺤﻘﻞ
ﻋﻠﻰ أي ﻛﺘﺎﺑﺎت ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء DBMS_LOB.Openﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [11ﻟﻔﺘﺢ وﺗﮭﯿﺌﺔ اﻟﻤﺆﺷﺮ ﻟﻠﻜﺘﺎﺑﺔ
وﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺄﺧﺬ ھﺬا اﻹﺟﺮاء ﻣﻌﻄﯿﺎن اﻟﻤﻌﻄﻰ اﻷول ﻋﺒﺎرة ﻋﻦ أﺳﻢ اﻟﻤﺆﺷﺮ وھﻮ Directionsﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ .
واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ DBMS_LOB.Lob_readwriteوھﻮ ﻋﺒﺎرة ﻋﻦ اﻷﺳﻠﻮب اﻟﻤﺴﺘﺨﺪم ﻟﻔﺘﺢ وﺗﮭﯿﺌﺔ اﻟﻤﺆﺷﺮ وھﻮ
أﺣﺪى اﻷﺳﻠﻮﺑﯿﻦ اﻷﺳﻠﻮب ReadWriteوﯾﻌﻤﻞ ﻋﻠﻰ ﺗﮭﯿﺌﺔ اﻟﻤﺆﺷﺮ ﻟﻠﻘﺮاءة واﻟﻜﺘﺎﺑﺔ
ReadWrite Read & Write
واﻷﺳﻠﻮب Read onlyﯾﻌﻤﻞ ﻋﻠﻰ ﺗﮭﯿﺌﺔ اﻟﻤﺆﺷﺮ ﻟﻠﻘﺮاءة ﻓﻘﻂ .أﻣﺎ اﻟﺠﻤﻠﺔ اﻟﻠﻲ ﻓﻲ اﻟﺴﻄﺮ ] [12ﻓﺘﺴﺘﺨﺪم ﻟﺘﻌﯿﯿﻦ
اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﻧﺮﯾﺪ ﻛﺘﺎﺑﺘﮭﺎ ﻓﻲ اﻟﻌﻤﻮد emp_infoﻟﻠﻤﺘﻐﯿﺮ First_directionوﺗﺴﺘﺨﺪم ھﺬه اﻟﺠﻤﻠﺔ
) Length (First_directionﻓﻲ اﻟﺴﻄﺮ ] [13ﻟﺘﻌﯿﯿﻦ ﺣﺠﻢ اﻟﻜﺘﺎﺑﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ ﻛﻘﯿﻤﺔ ﻟﻠﻤﺘﻐﯿﺮ amount
وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﻮﻇﯿﻔﺔ . Lengthوﺗﺴﺘﺨﺪم ھﺬه اﻟﺠﻤﻠﺔ offset:=1ﻓﻲ اﻟﺴﻄﺮ ] [14ﻟﺘﻌﯿﯿﻦ ﻗﯿﻤﺔ اﻟﻤﻮﺿﻊ اﻟﺬي
ﺳﯿﺒﺪأ اﻹﺟﺮاء اﻟﻜﺘﺎﺑﺔ ﻣﻨﮫ ﻟﻠﻤﺘﻐﯿﺮ offsetوھﻮ واﺣﺪ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ وﯾﺴﺘﺨﺪم اﻹﺟﺮاء DBMS_LOB.Writeﻓﻲ
اﻟﺴﻄﺮ ] [15ﻟﻜﺘﺎﺑﺔ اﻟﺒﯿﺎﻧﺎت ﻓﻲ اﻟﻌﻤﻮد emp-infoوﯾﺤﺘﻮي ھﺬا اﻹﺟﺮاء ﻋﻠﻰ أرﺑﻌﺔ ﻣﻌﻄﯿﺎت ﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﺴﻄﺮ
] [15اﻟﻤﻌﻄﻰ Directionsﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺆﺷﺮ Locatorاﻟﺬي ﯾﺸﯿﺮ اﻟﻰ اﻟﻌﻤﻮد emp_infoواﻟﻤﻌﻄﻰ
amountﻋﺒﺎرة ﻋﻦ ﺣﺠﻢ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ ﻓﻲ اﻟﻌﻤﻮد واﻟﻤﻌﻄﻰ offsetﻋﺒﺎرة ﻋﻦ اﻟﻤﻮﺻﻊ اﻟﺬي ﺳﯿﺒﺪأ
اﻹﺟﺮاء اﻟﻜﺘﺎﺑﺔ ﻣﻨﮫ ﻓﻲ اﻟﻌﻤﻮد واﻟﻤﻌﻄﻰ First_directionﻋﺒﺎرة ﻋﻦ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ .
وﺑﻌﺪ إﺟﺮاء ﻋﻤﻠﯿﺔ اﻟﻜﺘﺎﺑﺔ ﺑﺎﻟﻌﻤﻮد ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻹﺟﺮاء ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [16وھﻮ DBMS_LOB.Close
ﻹﻏﻼق اﻻﺗﺼﺎل ﺑﺎﻟﻤﺆﺷﺮ وﻣﻨﻊ أي ﻋﻤﻠﯿﺔ أﺧﺮى ﻋﻠﻰ اﻟﻌﻤﻮد اﻟﻤﻌﺮف ﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت LOBوﯾﺄﺧﺬ ھﺬا اﻷﺟﺮاء ﻣﻌﻄﻰ
واﺣﺪاً ﻓﻘﻂ وھﻮ أﺳﻢ اﻟﻤﺆﺷﺮ وھﻮ Directionsﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ .أﻣﺎ ﻓﻲ ﺣﺎﻟﺔ ﺗﻮاﺟﺪ ﺑﯿﺎﻧﺎت ﻓﻲ ھﺬا اﻟﺤﻘﻞ ﯾﻘﻮم
'. 'The Data is already entered اﻟﺒﺮﻧﺎﻣﺞ ﺑﺈﻇﮭﺎر رﺳﺎﻟﺔ ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [18وھﻲ
ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ ﻋﻠﻰ اﻹﺟﺮاء DBMS_LOB.Writeوﻓﻲ ھﺬا اﻟﺪرس ﺳﻮف ﻧﺴﺘﻜﻤﻞ ﺷﺮح ﺑﺎﻗﻲ
اﻹﺟﺮاءات اﻟﺬي ﺗﻢ ذﻛﺮھﺎ ﻓﻲ اﻟﺪرس اﻟﺴﺎﺑﻖ اﻹﺟﺮاء WriteAppendوﯾﻘﻮم ھﺬا اﻹﺟﺮاء ﺑﺈﺿﺎﻓﺔ اﻟﺒﯿﺎﻧﺎت ﻓﻲ
ﻧﮭﺎﯾﺔ اﻟﺤﻘﻞ اﻟﻤﻌﺮف ﺑﻨﻮع اﻟﺒﯿﺎﻧﺎت LOBواﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﮭﺬا اﻹﺟﺮاء ھﻲ ﻛﺎﻟﺘﺎﻟﻲ:
اﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ Bufferﻓﮭﻮ ﻋﺒﺎرة ﻋﻦ اﻟﻤﺘﻐﯿﺮ اﻟﺬي ﯾﺤﺘﻮي ﻋﻠﻰ اﻟﺒﯿﺎﻧﺎت اﻟﺬي ﺳﯿﺘﻢ ﻛﺘﺎﺑﺘﮭﺎ ھﻲ أﻣﺎ أن ﺗﻜﻮن ﻣﻦ
اﻟﻨﻮع Varchar2أذا ﻛﺎن اﻟﻤﺆﺷﺮ ﯾﺸﯿﺮ إﻟﻰ ﻧﻮع اﻟﺒﯿﺎﻧﺎت CLOBأو ﻣﻦ اﻟﻨﻮع Rawأذا اﻟﻤﺆﺷﺮ ﯾﺸﯿﺮ اﻟﻰ ﻧﻮع
اﻟﺒﯿﺎﻧﺎت . BLOB
ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل إﺿﺎﻓﺔ ﺑﯿﺎﻧﺎت ﻟﻤﻮﻇﻒ ﻣﻌﯿﻦ ﻓﻲ اﻟﻌﻤﻮد emp_infoﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬا اﻹﺟﺮاء :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ﻧﻼﺣﻆ أن ھﺬا اﻹﺟﺮاء ﯾﺤﺘﻮي ﻋﻠﻰ ﻣﻌﻄﯿﺎن اﻟﻤﻌﻄﻰ اﻷول emp_nameﻓﻲ اﻟﺴﻄﺮ ] [1وھﻮ ﻋﺒﺎرة ﻋﻦ اﺳﻢ
اﻟﻤﻮﻇﻒ اﻟﺬي ﻧﺮﯾﺪ إﺿﺎﻓﺔ اﻟﺒﯿﺎﻧﺎت ﻟﮫ واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ app_textﻋﺒﺎرة ﻋﻦ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ أﺿﺎﻓﺘﮭﺎ وﻛﻤﺎ ﻧﻼﺣﻆ
] [12ﯾﺘﻢ اﺧﺘﺒﺎر اﺳﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﺳﯿﺘﻢ إدﺧﺎﻟﮫ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻓﺈذا ﻛﺎن اﻻﺳﻢ ﻣﺴﺎوي ﻟﻼﺳﻢ اﻟﻤﺴﺘﺮﺟﻊ ﻣﻦ
اﻟﻤﺆﺷﺮ ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء DBMS_LOB.WriteAppendﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [14ﻹﺿﺎﻓﺔ اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ
ﺑﮭﺬا اﻟﻤﻮﻇﻒ وﯾﺤﺘﻮي ھﺬا اﻹﺟﺮاء ﻋﻠﻰ ﺛﻼﺛﺔ ﻣﻌﻄﯿﺎت :
اﻟﻤﻌﻄﻰ اﻷول Directionsوھﻮ ﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺆﺷﺮ Locatorاﻟﺬي ﯾﺸﯿﺮ اﻟﻰ ﻣﻜﺎن اﻟﻜﺘﺎﺑﺔ وھﻮ اﻟﻌﻤﻮد
emp_infoﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ .
Locator emp_info
واﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ ) Length (app_textﻋﺒﺎرة ﻋﻦ ﺣﺠﻢ اﻟﻜﺘﺎﺑﺎت اﻟﺘﻲ ﺳﯿﺘﻢ أﺿﺎﻓﺘﮭﺎ ﻟﻠﻌﻤﻮد واﻟﺘﻲ ﯾﺘﻢ ﺣﺴﺎﺑﮭﺎ
ﻋﻦ ﻃﺮﯾﻖ اﻟﻮﻇﯿﻔﺔ . Lengthواﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ app_textﻓﮭﻮ ﻋﺒﺎرة ﻋﻦ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﻧﺮﯾﺪ إدﺧﺎﻟﮭﺎ ﻟﮭﺬا
اﻟﻤﻮﻇﻒ .أﻣﺎ إذا ﻛﺎن اﺳﻢ اﻟﻤﺪﺧﻞ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻏﯿﺮ ﻣﺴﺎوي ﻟﻼﺳﻢ اﻟﻤﺴﺘﺮﺟﻊ ﻣﻦ اﻟﻤﺆﺷﺮ ﺗﻘﻮم ﺑﺎﺳﺘﺨﺪام
Gotoﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [16ﻟﺘﻜﺮار ﻋﻤﻠﯿﺔ اﺳﺘﺨﻼص اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﻤﺆﺷﺮ ﻣﺮة أﺧﺮى وھﻜـــــــــــــــــــــﺬا !!!!
**********************************************************************
(4) DBMS_LOB
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ إﺟﺮاء آﺧﺮ ﻣﻦ إﺟﺮاءات اﻟﻤﺠﻤﻮﻋﺔ اﻟﺒﺮﻣﺠﯿﺔ DBMS_LOBوھﻮ اﻹﺟﺮاء
Readوﯾﻌﻤﻞ ھﺬا اﻹﺟﺮاء ﻋﻠﻰ اﺳﺘﺮﺟﺎع ﻛﻤﯿﺔ ﻣﺤﺪدة ﻣﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة ﻓﻲ أﺣﺪى اﻟﺤﻘﻮل اﻟﻤﻌﺮﻓﺔ ﺑﻨﻮع
اﻟﺒﯿﺎﻧﺎت LOBواﻟﺼﯿﻐﺔ اﻟﻌﺎﻣﺔ ﻟﮭﺬا اﻹﺟﺮاء :
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ﺗﻮﺿﯿﺢ
ﯾﻌﻤﻞ ھﺬا اﻟﻜﻮد ﻋﻠﻰ اﺳﺘﺮﺟﺎع ﺑﯿﺎﻧﺎت ﻣﻮﻇﻒ ﻣﻌﯿﻦ ﻓﻲ اﻟﺠﺪول exﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [1وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ ﺗﻤﺮﯾﺮ اﺳﻢ
اﻟﻤﻮﻇﻒ ﻛﻤﻌﻄﻰ ﻟﮭﺬه اﻟﻮﻇﯿﻔﺔ وﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺘﻢ اﺧﺘﺒﺎر اﺳﻢ اﻟﻤﻮﻇﻒ اﻟﺬي ﯾﺘﻢ إدﺧﺎﻟﮫ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻛﻤﺎ ﻓﻲ
اﻟﺴﻄﺮ ] [15ﻓﺈذا ﻛﺎن ﻣﺴﺎوي ﻟﻼﺳﻢ اﻟﻨﺎﺗﺞ ﻟﻠﻤ ﺆﺷﺮ ﯾﺘﻢ اﺳﺘﺨﺪام اﻹﺟﺮاء ﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [18وھﻮ
DBMS_LOB.READوذﻟﻚ ﻟﻘﺮاءة ﺑﯿﺎﻧﺎت ھﺬا اﻟﻤﻮﻇﻒ وﯾﺤﺘﻮي ھﺬا اﻹﺟﺮاء ﻋﻠﻰ أرﺑﻌﺔ ﻣﻌﻄﯿﺎت :
اﻟﻤﻌﻄﻰ اﻷول Directionsﻋﺒﺎرة ﻋﻦ اﺳﻢ اﻟﻤﺆﺷﺮ Locatorاﻟﺬي ﯾﺸﯿﺮ اﻟﻰ ﻣﻜﺎن اﻟﻘﺮاءة وھﻮ اﻟﻌﻤﻮد
. Locatorواﻟﻤﻌﻄﻰ اﻟﺜﺎﻧﻲ emp_info emp_infoﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ
amountوھﻮ ﻋﺒﺎرة ﻋﻦ ﺣﺠﻢ اﻟﺒﯿﺎﻧﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﻗﺮاءﺗﮭﺎ ﻣﻦ اﻟﻌﻤﻮد . emp_infoواﻟﻤﻌﻄﻰ اﻟﺜﺎﻟﺚ Offset
ﻋﺒﺎرة ﻋﻦ اﻟﻤﻮﺿﻊ اﻟﺬي ﺳﯿﺒﺪأ اﻹﺟﺮاء اﻟﻘﺮاءة ﻣﻨﮫ وھﻮ واﺣﺪ ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ أي أﻧﮫ ﺳﺘﺒﺪأ ﻋﻤﻠﯿﺔ اﻟﻘﺮاءة ﺑﺪاﯾﺔ ﻣﻦ
اﻟﺤﺮف اﻷول .واﻟﻤﻌﻄﻰ اﻟﺮاﺑﻊ Out_Putھﻮ ﻋﺒﺎرة ﻋﻦ اﻟﻤﺘﻐﯿﺮ اﻟﺬي ﺳﯿﺘﻢ ﺗﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻨﺎﺗﺠﺔ ﻣﻦ ھﺬه
اﻟﻮﻇﯿﻔﺔ ﺑﮫ .أﻣﺎ أذا ﻛﺎن اﻻﺳﻢ اﻟﺬي ﺗﻢ إدﺧﺎﻟﮫ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﻏﯿﺮ ﻣﺴﺎوي ﻟﻼﺳﻢ اﻟﻤﺴﺘﺮﺟﻊ ﻟﻠﻤﺆﺷﺮ ﻧﻘﻮم
ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ Gotoﻛﻤﺎ ﻓﻲ اﻟﺴﻄﺮ ] [20وذﻟﻚ ﻟﺘﻜﺮار ﻋﻤﻠﯿﺔ اﺳﺘﺨﻼص اﻟﺒﯿﺎﻧﺎت ﻣﻦ اﻟﻤﺆﺷﺮ وھﻜﺬا .
ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻋﺮض اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﻇﻒ وﻟﯿﻜﻦ Alsaeediﻣﺜﻼً ﻓﻨﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد :
ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺘﻌﯿﯿﻦ اﻟﻘﯿﻤﺔ اﻟﻨﺎﺗﺠﺔ ﻣﻦ اﻟﻮﻇﯿﻔﺔ empty_Clobإﻟﻰ اﻟﻌﻤﻮد emp_infoوذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ
. Update
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ Create [Or Replace] Triggerﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ Trigger_nameﺛﻢ اﻟﻌﺒﺎرة
timingاﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻟﻮﻗﺖ اﻟﺬي ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻓﯿﮫ وھﻮ أﻣﺎ Beforeأو Afterﺛﻢ اﻟﻜﻠﻤﺎت Event[Or
] event2 Or event3واﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻟﺠﻤﻞ اﻟﺘﻲ ﺗﺆدي إﻟﻰ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ وھﻲ أﺣﺪ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت -:
Insertأو Updateأو Deleteﯾﻠﯿﮭﺎ اﻟﻌﺒﺎرة Onﺛﻢ اﺳﻢ اﻟﺠﺪول table_nameأو اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ
view_nameﯾﻠﯿﮫ اﻟﺠﺰء اﻟﺨﺎص ﺑﻜﻮد ھﺬا اﻟﻤﻄﻠﻖ وﯾﺤﺘﻮي ھﺬا اﻟﺠﺰء ﻋﻠﻰ اﻟﻌﻤﻠﯿﺎت اﻟﺘﻲ ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ ﺗﻨﻔﯿﺬ
أﺣﺪ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت اﻟﺬي ﺗﻢ ﺗﺤﺪﯾﺪھﺎ ﺳﺎﺑﻘﺎً وھﻮ ﻋﺒﺎرة ﻋﻦ ﻗﺎﻟﺐ PL/SQLوﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ أﻧﮫ ﯾﻤﻜﻦ
اﺳﺘﺪﻋﺎء إﺟﺮاء ﺧﺎرﺟﻲ داﺧﻞ ھﺬا اﻟﺠﺰء وﻋﻨﺪ اﺧﺘﯿﺎرﻧﺎ اﻻﺳﻢ اﻟﻤﻄﻠﻖ Triggerﯾﺠﺐ ﻋﺪم اﺳﺘﺨﺪام ھﺬا اﻻﺳﻢ ﻣﻦ
ﻗﺒﻞ Trigger_nameﺑﻤﻌﻨﻰ أﻧﮫ ﻻﯾﻤﻜﻦ أن ﯾﻜﻮن ھﻨﺎك أﻛﺜﺮ ﻣﻦ Triggerﻟﮫ ﻧﻔﺲ اﻻﺳﻢ ﻓﺈذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ
اﻟﻤﺜﺎل أﻧﺸﺎء Triggerﯾﺘﻢ ﺗﻨﻔﯿﺬه ﺗﻠﻘﺎﺋﯿﺎً ﻋﻨﺪ إﺟﺮاء ﻋﻤﻠﯿﺔ إﺿﺎﻓﺔ ﻓﻲ اﻟﺠﺪول اﻟﻤﻮﻇﻔﯿﻦ employeesﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ
ھﺬا اﻟﻜﻮد :
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ Create (or Replace)Triggerﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ Trigger_nameﺛﻢ اﻟﻜﻠﻤﺔ
timingواﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ وﻗﻒ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ وھﻲ أﻣﺎ beforeأو Afterﺛﻢ اﻟﻜﻠﻤﺎت Event (or event or
) ….واﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻟﺠﻤﻞ اﻟﺘﻲ ﺗﺆدي إﻟﻰ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﺛﻢ اﻟﻌﺒﺎرة ONﯾﻠﯿﮫ اﺳﻢ اﻟﺠﺪول table_Nameأو
اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ ﺛﻢ ھﺬه اﻟﺠﻤﻠﺔ -:
][Referencing old As old_name / New AS new_name
وﺗﺴﻤﺢ ھﺬه اﻟﺠﻤﻠﺔ ﺑﺘﻐﯿﯿﺮ اﻷﺳﻤﺎء اﻻﻓﺘﺮاﺿﯿﺔ ﻟﻠﻘﯿﻢ اﻟﻤﻮﺟﻮدة ﺑﺎﻟﻔﻌﻞ و اﻟﻘﯿﻢ اﻟﺤﺪﯾﺜﺔ اﻟﺘﻲ ﺳﯿﺘﻢ إدﺧﺎﻟﮭﺎ أو
اﺳﺘﺮﺟﺎﻋﮭﺎ ﻣﻦ ﺻﻔﻮف اﻟﺠﺪول اﻟﺘﻲ ﺳﯿﺘﻢ ﻣﻌﺎﻟﺠﺘﮭﺎ ﺑﮭﺬا اﻟﻤﻄﻠﻖ وھﺬه اﻟﺠﻤﻠﺔ اﺧﺘﯿﺎرﯾﮫ optionalﯾﻠﯿﮭﺎ اﻟﺠﻤﻠﺔ
For each Rowوﺗﻌﻤﻞ ھﺬه اﻟﺠﻤﻠﺔ ﻋﻠﻰ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﺪدا ﻣﻦ اﻟﻤﺮات ﻣﺴﺎوي ﻟﻌﺪد ﺻﻔﻮف اﻟﺠﺪول اﻟﺘﻲ ﯾﺘﻢ
ﻣﻌﺎﻟﺠﺘﮭﺎ ﻋﻦ ﻃﺮﯾﻖ ﺟﻤﻠﮫ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﺛﻢ اﻟﺠﻤﻠﺔ Whenاﻟﺘﻲ ﺗﻌﻤﻞ ﻋﻠﻰ ﺗﻘﯿﯿﺪ اﻟﻤﻄﻠﻖ Triggerﺑﻌﺪدا ًﻣﻦ
اﻟﺸﺮوط وﻓﻲ ﺣﺎﻟﺔ ﺻﺤﺔ ھﺬه اﻟﺸﺮوط ﯾﺘﻢ ﺗﻨﻔﯿﺬ أﻛﻮاد اﻟﻤﻄﻠﻖ Trigger_bodyوﻓﻲ ﺣﺎﻟﺔ ﻋﺪم ﺻﺤﺔ ھﺬه
اﻟﺸﺮوط ﻻ ﯾﺘﻢ ﺗﻨﻔﯿﺬ أﻛﻮاد اﻟﻤﻄﻠﻖ Trigger_bodyوھﺬه اﻟﺠﻤﻠﺔ ﺟﻤﻠﺔ اﺧﺘﯿﺎرﯾﮫ أﯾﻀﺎ ﺛﻢ اﻟﻜﻮد اﻟﺨﺎص ﺑﮭﺬا
اﻟﻤﻄﻠﻖ.
ﺣﯿﺚ ﯾﻘﻮم ﺑﺘﻌﺪﯾﻞ اﻟﻌﻤﻮد Current_job_idﻓﻲ اﻟﺠﺪول employee_historyﻓﻲ ﺣﺎﻟﺔ ﺗﻌﺪﯾﻞ اﻟﻌﻤﻮد
job_idﻓﻲ اﻟﺠﺪول employeesوﻛﻤﺎ ﻧﻼﺣﻆ ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ After Update ofﻟﺘﻨﻔﯿﺬ ھﺬا اﻟﻤﻄﻠﻖ ﺑﻌﺪ
إﺟﺮاء أي ﺗﻌﺪﯾﻞ ﻋﻠﻰ ﺑﯿﺎﻧﺎت اﻟﻌﻤﻮد job_idوذاﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ Updateﺛﻢ ﯾﺘﻢ ﻛﺘﺎﺑﺔ اﻟﺠﻤﻠﺔ Onﯾﻠﯿﮭﺎ
اﻟﻜﻠﻤﺔ employeesوذﻟﻚ ﻟﺘﺤﺪﯾﺪ اﺳﻢ اﻟﺠﺪول ﺛﻢ اﻟﺠﻤﻠﺔ Referencingﻟﺘﻐﯿﯿﺮ أﺳﻤﺎء اﻟﻤﺘﻐﯿﺮات OLDو
Newﺑﺎ ﻷﺳﻤﺎء New-valueو old-valueواﻟﺘﻲ ﺗﺴﺘﺨﺪم ﻛﺄﻋﻤﺪة وھﻤﯿﮫ ﺗﺴﺘﺨﺪم ﻟﺘﺨﺰﯾﻦ اﻟﺒﯿﺎﻧﺎت اﻟﻤﻮﺟﻮدة
ﺑﺎﻟﻔﻌﻞ ﺑﺎﻟﺠﺪول واﻟﻘﯿﻢ اﻟﺘﻲ ﺳﯿﺘﻢ أﺿﺎﻓﺘﮭﺎ أو ﺗﻌﺪﯾﻠﮭﺎ ﻣﻦ ﻗﺒﻞ اﻟﻤﺴﺘﺨﺪم ﺛﻢ اﻟﺠﻤﻠﺔ For each Rowواﻟﺘﻲ ﺗﺸﯿﺮ
إﻟﻰ أن ھﺬا اﻟﻤﻄﻠﻖ ﺳﯿﺘﻢ ﺗﻜﺮار ﺗﻨﻔﯿﺬه ﻋﺪدا ﻣﻦ اﻟﻤﺮات ﻣﺴﺎوي ﻟﻌﺪد اﻟﺼﻔﻮف اﻟﺘﻲ ﺳﻮف ﯾﺘﻢ ﺗﻌﺪﯾﻠﮭﺎ ﺑﺎﺳﺘﺨﺪام
اﻟﺠﻤﻠﺔ Updateوﻗﺪ ﻗﻤﻨﺎ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ whenﻟﺘﺤﺪﯾﺪ اﻟﺸﺮوط اﻟﺬي ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻜﻮد اﻟﺨﺎص ﺑﺎﻟﻤﻄﻠﻖ ﺑﻨﺎ ءً
ﻋﻠﯿﮫ وھﻮ ﻓﻲ ھﺬا اﻟﺤﺎﻟﺔ ﻋﺪم ﺗﺴﺎوي اﻟﻘﯿﻢ اﻟﻤﻮﺟﻮدة ﺑﺎﻟﻔﻌﻞ ﺑﺎﻟﺠﺪول ﺑﺎﻟﻘﯿﻢ اﻟﺠﺪﯾﺪة اﻟﺘﻲ ﺳﯿﺘﻢ إدﺧﺎﻟﮭﺎ وﻓﻲ ﺣﺎﻟﺔ
ﺻﺤﺔ ھﺬه اﻟﺸﺮوط ﯾﺘﻢ ﺗﻨﻔﯿﺬ ﻛﻮد اﻟﻤﻄﻠﻖ .
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻧﻮع آﺧﺮ ﻣﻦ أﻧﻮاع اﻟﻤﻄﻠﻘﺎت Triggersوھﺬا اﻟﻨﻮع Instead of Trigger
وﺗﻌﺘﺒﺮ ھﺬا اﻟﻨﻮع أ ﺣﺪ أﻧﻮاع اﻹﺟﺮاءات Row Triggersوﯾﺴﺘﺨﺪم ھﺬا اﻟﻨﻮع ﻟﻤﻌﺎﻟﺠﺔ اﻟﺠﺪاول اﻷﺳﺎﺳﯿﺔ Base
Tableﻣﻦ ﺧﻼل اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ Viewsﺣﯿﺚ ﯾﻌﻤﻞ ھﺬا اﻟﻤﻄﻠﻖ ﻋﻠﻰ اﺳﺘﺒﺪال ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺮاد
ﺗﻨﻔﯿﺬھﺎ ﻋﻠﻰ اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ ﺑﻌﻤﻠﯿﺎت أﺧﺮى ﺗﺤﺪد ﺑﺎﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻟﻤﻄﻠﻖ وﺗﻜﻮن ھﺬه اﻟﺠﻤﻠﺔ ھﻲ اﻟﻤﺴﺒﺒﺔ
ﻟﺘﻨﻔﯿﺬ ھﺬا اﻟﻤﻄﻠﻖ وﻹﻧﺸﺎء ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﻄﻠﻘﺎت ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ-:
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ ) Create (or Replaceﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ Trigger_nameﺛﻢ اﻟﺠﻤﻠﺔ Instead
ofﯾﻠﯿﮭﺎ ﺟﻤﻠﮫ ﻣﻌﺎﻟﺠﮫ اﻟﺒﯿﺎﻧﺎت Operationاﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ ھﺬا اﻟﻤﻄﻠﻖ وﻷن ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﻄﻠﻘﺎت ﯾﺨﺘﻠﻒ ﻋﻦ
ﺑﺎﻗﻲ اﻷﻧﻮاع اﻟﺴﺎﺑﻘﺔ ﻣﻦ ﺣﯿﺚ ﻃﺮﯾﻘﺔ اﻟﻌﻤﻞ ﻓﺎﻧﮫ ﻻﯾﺘﻢ ﺗﺤﺪﯾﺪ زﻣﻦ اﻟﺘﻨﻔﯿﺬ ﻋﻨﺪ إﻧﺸﺎءه ﺳﻮاء ﻛﺎن Before event
أو After eventﻗﺒﻞ اﻟﺤﺪث أو ﺑﻌﺪ اﻟﺤﺪث ﺣﯿﺚ ﻻﯾﻘﻮم ھﺬا اﻟﻨﻮع ﺑﺘﻨﻔﯿﺬ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﮫ ﻋﻨﺪ وﻗﻮع أي ﺟﻤﻠﮫ
ﻣﻦ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﻋﻠﻰ اﻟﺠﺪول وﻟﻜﻦ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﮫ ﺑﺪﻻ ﻣﻦ ﺟﻤﻠﺔ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺴﺒﺒﺔ
ﻟﺘﻨﻔﯿﺬه وﺗﻌﺒﺮ اﻟﻜﻠﻤﺔ operationﻋﻦ اﺧﺬ ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻣﺜﻞ -:
Delete ,Update ,Insert
ﺛﻢ اﻟﻜﻠﻤﺔ ONﯾﻠﯿﮫ اﺳﻢ اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ View nameﺛﻢ اﻟﺠﻤﻠﺔ For each Rowواﻟﺘﻲ ﺗﺸﯿﺮ ﻋﻠﻰ إن ھﺬا
اﻟﻤﻄﻠﻖ ﺳﻮف ﯾﺘﻢ ﺗﻜﺮار ﺗﻨﻔﯿﺬه ﻓﻲ ﻛﻞ ﻣﺮه ﯾﺘﻢ ﺗﻌﺪﯾﻞ ﺻﻒ ﻣﻦ ﺻﻔﻮف اﻟﺠﺪول وﻧﺬﻛﺮ ھﻨﺎ إن ھﺬا اﻟﻨﻮع ﻣﻦ
اﻟﻤﻄﻠﻘﺎت ﯾﻜﻮن داﺋﻤﺎ ﻣﻦ اﻟﻨﻮع Row Triggersﺣﺘﻰ إذا ﺗﻢ ﺗﺠﺎھﻞ ﻛﺘﺎﺑﺔ ھﺬه اﻟﺠﻤﻠﺔ For each Rowﯾﻠﻲ
ھﺬه اﻟﺠﻤﻠﺔ اﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻄﻠﻖ .ﻓﺈذا أردﻧﺎ ذﻟﻚ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻋﻨﺪ ﻣﺤﺎوﻟﺔ إﺿﺎﻓﺔ ﺑﯿﺎﻧﺎت ﻟﻠﺠﺪول اﻟﺘﺨﯿﻠﻲ
emp_Detailsواﻟﻤﺒﻨﯿﺔ ﻋﻠﻰ اﻟﺠﺪاول New_emp ,New_deptإﺿﺎﻓﺔ اﻟﻘﯿﻢ -:
New_empﺗﻘﻮم ﺑﺎﺳﺘﺨﺪام اﻟﻜﻮد اﻟﺘﺎﻟﻲ -: ﻓﻲ اﻟﺠﺪول Ename , job ,sal
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﺑﻌﺾ اﻟﻔﺮوق اﻟﮭﺎﻣﺔ ﺑﯿﻦ اﻹﺟﺮاءات واﻟﻤﻄﻠﻘﺎت ﺣﯿﺚ ﯾﺘﻢ ﺗﺨﺰﯾﻦ اﻟﻤﻄﻠﻘﺎت
Triggersﺑﻌﺪ إﻧﺸﺎءھﺎ ﻣﺒﺎﺷﺮةً ﻓﻲ اﻟﺠﺪول User-Triggersاﻟﻤﻮﺟﻮد ﻓﻲ ﻗﺎﻣﻮس ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﺑﯿﻨﻤﺎ ﯾﺘﻢ
ﺗﺨﺰﯾﻦ اﻹﺟﺮاءات Stored_procedureﻓﻲ اﻟﺠﺪول User_sourceأﻣﺎ ﺑﺎﻟﻨﺴﺒﺔ ﻟﻄﺮﯾﻘﺔ اﻟﺘﻨﻔﯿﺬ ﻓﯿﺘﻢ ﺗﻨﻔﯿﺬ
اﻹﺟﺮاءات Procedureﺑﺼﻔﮫ ﻣﺴﺘﻘﻠﺔ ﻋﻦ ﻃﺮﯾﻖ اﺳﺘﺪﻋﺎﺋﮭﺎ Calling Procedureأو اﺳﺘﺨﺪام اﻷﻣﺮ
executeﺑﯿﻨﻤﺎ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻘﺎت Triggersﺗﻠﻘﺎﺋﯿﺎ ﺑﻤﺠﺮد وﻗﻮع ﺣﺪث ﻣﻌﯿﻦ eventsﻣﺜﻞ إﺿﺎﻓﺔ ﺑﻌﺾ
اﻟﺒﯿﺎﻧﺎت ﻓﻲ ﺟﺪول ﻣﻌﯿﻦ أو ﺣﺬﻓﮭﺎ وھﻜﺬا!!!!!
وﻣﻦ اﻟﻔﺮوق اﻟﮭﺎﻣﺔ أﯾﻀﺎ اﻧﮫ ﯾﻤﻜﻦ اﺳﺘﺨﺪام ﻛﻼ ﻣﻦ اﻟﺠﻤﻞ -:
Commit , savepoint , Rollback
داﺧﻞ اﻹﺟﺮاءات . Procedures
ﻋﻠﻰ اﻟﻌﻜﺲ ﻣﻦ اﻟﻤﻄﻠﻘﺎت Triggersﻓﺎﻧﮫ ﻻﯾﺴﻤﺢ ﺑﺎﺳﺘﺨﺪام ﻣﺜﻞ ھﺬه اﻟﺠﻤﻞ .وأن ﻛﺎن ﻣﻦ اﻟﻤﻤﻜﻦ اﺳﺘﺨﺪاﻣﮭﺎ
ﺑﻄﺮﯾﻘﮫ ﻏﯿﺮ ﻣﺒﺎﺷﺮه وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ اﺳﺘﺪﻋﺎء إﺟﺮاء ﯾﺤﺘﻮي ﻋﻠﻰ ھﺬه اﻟﺠﻤﻞ داﺧﻞ اﻟﻤﻄﻠﻖ Triggerوﻟﻜﻦ ﻻ
ﯾﻨﺼﺢ ﺑﺈﺟﺮاء ﻣﺜﻞ ھﺬه اﻟﻌﻤﻠﯿﺎت وذﻟﻚ ﻟﻤﺎ ﻟﮭﺎ ﻣﻦ أﺿﺮار ﺟﺎﻧﺒﯿﮫ Side Effectsﻋﻠﻰ اﻹﺟﺮاءات Transactions
ﺑﺎﻷﺿﺎﻓﮫ إﻟﻰ ذﻟﻚ ﺗﻮﺟﺪ ﺑﻌﺾ اﻟﻔﺮوق ﺑﯿﻦ اﻟﻤﻄﻠﻘﺎت Triggersاﻟﺨﺎﺻﺔ ﺑﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت Data Base
Triggersواﻟﻤﻄﻠﻘﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﺘﻄﺒﯿﻘﺎت .Application Triggers
ﺣﯿﺚ ﯾﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻘﺎت ﺑﻘﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت Data Baseﻣﻦ ﺧﻼل اﻹﺣﺪاث اﻟﺘﻲ ﺗﻘﻊ ﻋﻦ ﻃﺮﯾﻖ أدوات ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت
. أو اﻟﺘﻄﺒﯿﻘﺎت اﻟﺨﺎﺻﺔ ﺑﮭﺎ
ﺗﻌﺮﻓﻨﺎ ﻓﻲ اﻟﺪروس اﻟﺴﺎﺑﻘﺔ ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﻧﺸﺎء اﻟﻤﻄﻠﻘﺎت Triggersوأﻧﻮاﻋﮭﺎ وﻛﯿﻔﯿﺔ اﺳﺘﺨﺪاﻣﮭﺎ .وﺳﻮف ﻧﺘﻌﺮف
ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﺗﺎﺣﺔ أو ﻋﻢ إﺗﺎﺣﺔ اﻟﻤﻄﻠﻘﺎت Triggersﻟﻼﺳﺘﺨﺪام -:
Enable Triggers أو Disable Triggers
وذﻟﻚ ﻟﺠﻤﯿﻊ اﻟﻤﻄﻠﻘﺎت Triggersاﻟﺨﺎﺻﺔ ﺑﺠﺪول ﻣﻌﯿﻦ أو اﻟﻤﻄﻠﻖ Triggerﻣﺤﺪد ﻛﻤﺎ ﺳﻨﺘﻌﺮف ﻋﻠﻰ ﻛﯿﻔﯿﺔ
إﻋﺎدة إﻧﺸﺎء اﻟﻤﻄﻠﻘﺎت Triggersﺑﺎﻻﺿﺎﻓﮫ إﻟﻰ ﻛﯿﻔﯿﺔ ﺣﺬف اﻟﻤﻄﻠﻘﺎت Deletingﻣﻦ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻓﻔﻲ اﻟﻮﺿﻊ
اﻻﻓﺘﺮاﺿﻲ ﺗﻜﻮن اﻟﻤﻄﻠﻘﺎت Triggersﻣﺘﺎﺣﺔ وذﻟﻚ ﺑﻌﺪ إﻧﺸﺎءھﺎ ﻣﺒﺎﺷﺮه وﻟﻠﺘﺤﻜﻢ ﻓﻲ إﺗﺎﺣﺔ أو ﻋﺪم إﺗﺎﺣﺔ اﻟﻤﻄﻠﻘﺎت
ﻓﻲ اﻻﺳﺘﺨﺪام enabling and Disabling Triggersﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ-:
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﻜﻠﻤﺎت Alter_nameﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ Trigger_nameﺛﻢ اﻟﻜﻠﻤﺎت Disable
وﺗﺴﺘﺨﺪم ھﺬه اﻟﻜﻠﻤﺔ إذا أردﻧﺎ ﻋﺪم إﺗﺎﺣﺔ ھﺬا اﻟﻤﻄﻠﻖ ﻟﻼﺳﺘﺨﺪام )ﺗﻌﻄﯿﻞ( .وﻹﺗﺎﺣﺔ اﻟﻤﻄﻠﻖ ﻟﻼﺳﺘﺨﺪام ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪام
اﻟﻜﻠﻤﺔ enableﺑﺪﻻ ﻣﻦ .Disable
وﻹﺗﺎﺣﺔ ﺟﻤﯿﻊ اﻟﻤﻄﻠﻘﺎت Triggersاﻟﺨﺎﺻﺔ ﺑﺠﺪول ﻣﻌﯿﻦ ﺗﻘﻮم ﺑﺎﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ -:
:ALL Triggersﺗﻌﻤﻞ ھﺬه أﻟﺠﻤﻠﮫ ﻹﺗﺎﺣﺔ أو ﻋﺪم إﺗﺎﺣﺔ ﺟﻤﯿﻊ اﻟﻤﻄﻠﻘﺎت Triggersاﻟﺨﺎﺻﺔ ﺑﮭﺬا اﻟﺠﺪول وﻓﻲ
ﺑﻌﺾ اﻷﺣﯿﺎن ﻗﺪ ﻧﺤﺘﺎج إﻟﻰ ﻋﻤﻞ إﻋﺎدة ﺗﺮﺟﻤﮫ Recompileﻟﺒﻌﺾ اﻟﻤﻄﻠﻘﺎت Triggersاﻟﻐﯿﺮ ﻓﻌَﺎﻟﮫ
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ Alter Triggerﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ Triggerﺛﻢ اﻟﻌﺒﺎرة . Compile
وﻟﺤﺬف اﻟﻤﻄﻠﻘﺎت Triggersﻧﺴﺘﺨﺪم اﻟﺠﻤﻠﺔ .Drop Trigger
ﻛﻤﺎ ﻓﻲ اﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ-:
;Drop Trigger trigger_name
***************************************************
Triggers
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ أﻧﻮاع أﺧﺮى ﻣﻦ اﻟﻤﻄﻠﻘﺎت Triggersوھﻲ اﻟﻤﻄﻠﻘﺎت اﻟﺨﺎﺻﺔ ﺑﻨﻈﺎم ﻗﻮاﻋﺪ
اﻟﺒﯿﺎﻧﺎت system eventﺳﻮاء ﻛﺎﻧﺖ ﻋﻠﻰ ﻣﺴﺘﻮى ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت ﻛﻜﻞ Database Levelأو ﻋﻠﻰ ﻣﺴﺘﻮى
ﻣﺴﺘﺨﺪم واﺣﺪ ﻓﻘﻂ . Schema Levelﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل اﻟﻤﻄﻠﻘﺎت Triggersاﻟﺘﻲ ﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ ﻓﺘﺢ أو
إﻏﻼق ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت Open &close Databaseأو ﻋﻨﺪ دﺧﻮل أو ﺧﺮوج ﻣﺴﺘﺨﺪم ﻣﻌﯿﻦ Log on or off
ﻣﻦ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت أو ﻋﻨﺪ ﺗﻨﻔﯿﺬ أي ﺟﻤﻠﮫ ﻣﻦ اﻟﺠﻤﻞ Execute DDLﯾﻤﻜﻦ أن ﺗﻜﻮن ﻋﻠﻰ ﻣﺴﺘﻮى ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت
أو ﻋﻠﻰ ﻣﺴﺘﻮى اﻟﻤﺴﺘﺨﺪم أﻣﺎ اﻟﻤﻄﻠﻘﺎت اﻟﺘﻲ ﺗﻨﻔﺬ ﻋﻨﺪ ﺗﻨﻔﯿﺬ ﺟﻤﻞ ﻣﻌﺎﻟﺠﮫ اﻟﺒﯿﺎﻧﺎت DMLﻓﺘﻜﻮن ﻋﻠﻰ ﻣﺴﺘﻮى
ﺟﺪول ﻣﻌﯿﻦ وﻹﻧﺸﺎء ﻣﻄﻠﻘﺎت Triggersﯾﺘﻢ ﺗﻨﻔﯿﺬھﺎ ﻋﻨﺪ ﺗﻨﻔﯿﺬ اﻟﺠﻤﻞ DDLﯾﺘﻢ اﺳﺘﺨﺪام ھﺬه اﻟﺼﯿﻐﺔ-:
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﺠﻤﻠﺔ Create or Replace Triggerﯾﻠﯿﮭﺎ اﺳﻢ اﻟﻤﻄﻠﻖ trigger_nameﺛﻢ اﻟﻌﺒﺎرة
timingواﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻟﻮﻗﺖ اﻟﺘﻲ ﺳﯿﺘﻢ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﺑﮫ وھﻮ أﻣﺎ Afterأو beforeﺛﻢ اﻟﻜﻠﻤﺎت
]] [ddl_event1[Or ddl_event2 Or …….واﻟﺘﻲ ﺗﺸﯿﺮ إﻟﻰ اﻟﺠﻤﻞ اﻟﺘﻲ ﺗﺆدي إﻟﻰ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻘﺎت
Triggersوﺗﻜﻮن ﻣﻦ اﻟﺠﻤﻞ DDLوھﻲ إﺣﺪى اﻟﺜﻼث اﻟﺠﻤﻞ Create or Alter or Dropوﺗﻌﻤﻞ اﻟﺠﻤﻠﺔ
Createﻋﻠﻰ ﺟﻌﻞ اﻟﺨﺎدم أوراﻛﻞ Oracle serverﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ Triggerﻋﻨﺪ إﺿﺎﻓﺔ أي ﻋﻨﺼﺮ ﺟﺪﯾﺪ
ﻓﻲ ﻗﺎﻣﻮس ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت . Data Dictionary
وﺗﺪل اﻟﻜﻠﻤﺎت database_event1 OR database_event2ﻋﻠﻰ ﺑﻌﺾ اﻟﻌﻤﻠﯿﺎت اﻟﺘﻲ ﯾﻤﻜﻦ أن ﺗﺤﺪث ﻓﻲ
ﻧﻈﺎم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وھﻲ إﺣﺪى اﻟﻌﻤﻠﯿﺎت-:
* After server_error
واﻟﺘﻲ ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﻨﺪ إﺻﺪار أي رﺳﺎﻟﺔ ﺧﻄﺄ .
* After Logon
واﻟﺘﻲ ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﻨﺪ دﺧﻮل أي ﻣﺴﺘﺨﺪم إﻟﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت .
* Before Logon
واﻟﺘﻲ ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻋﻨﺪ ﺧﺮوج أي ﻣﺴﺘﺨﺪم ﻣﻦ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت .
*After startup
واﻟﺘﻲ ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﺑﻌﺪ ﻓﺘﺢ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت ﻣﺒﺎﺷﺮةً.
*Before shut Down
اﻟﺘﻲ ﺗﺠﻌﻞ اﻟﺨﺎدم أوراﻛﻞ ﯾﻘﻮم ﺑﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ ﻗﺒﻞ إﻏﻼق ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت .
وﯾﺠﺐ ﻣﻼﺣﻈﺔ اﻧﮫ ﯾﻤﻜﻦ ﺗﻄﺒﯿﻖ ﺟﻤﯿﻊ ھﺬه اﻷﺣﺪاث ﻋﻠﻰ ﻣﺴﺘﻮى ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت وﻋﻠﻰ ﻣﺴﺘﻮى اﻟﻤﺴﺘﺨﺪم ﻣﻌﺎ ﻓﮭﻲ
ﻣﺎﻋﺪا اﻟﺤﺪﺛﯿﻦ-:
After Startup
Before Shutdown
ﺣﯿﺚ ﻗﻤﻨﺎ ﺑﺈﻧﺸﺎء Triggerﻟﮫ اﻻﺳﻢ Logon_trigﺑﺤﯿﺚ ﯾﺘﻢ ﺗﻨﻔﯿﺬ ھﺬا اﻟﻤﻄﻠﻖ ﺗﻠﻘﺎﺋﯿﺎ ﻋﻨﺪ دﺧﻮل أي ﻣﺴﺘﺨﺪم
إﻟﻰ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت وذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺤﺪث After Logonوﻗﺪ ﻗﻤﻨﺎ ﺑﺘﻄﺒﯿﻖ ھﺬا اﻟﻤﻄﻠﻖ ﻋﻠﻰ ﻣﺴﺘﻮى اﻟﻤﺴﺘﺨﺪم
وذﻟﻚ ﻋﻦ ﻃﺮﯾﻖ ﻛﺘﺎﺑﺔ اﻟﻌﺒﺎرة Schemaﻛﻤﺎ ﻧﻼﺣﻆ ﻓﻲ اﻟﻜﻮد.
**************************************************
Call Mutating Table
ﻋﺎدة ﻣﺎ ﺗﻤﺮ اﻟﺠﺪاول ﺑﺤﺎﻟﮫ ﺗﻌﺮف ﺑﺎﻟﺤﺎﻟﺔ mutating tableوﺗﺤﺪث ھﺬه اﻟﺤﺎﻟﺔ ﻋﻨﺪﻣﺎ ﻧﺤﺎول اﻟﻘﺮاءة أو اﻟﻜﺘﺎﺑﺔ
ﻋﻠﻰ اﻟﺠﺪاول ﻓﻲ ﻧﻔﺲ اﻟﻮﻗﺖ اﻟﺘﻲ ﺗﺠﺮي ﻋﻠﯿﮭﺎ ﻋﻤﻠﯿﺎت ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﻣﺜﻞ-:
اﻻﺿﺎﻓﮫ Insertأو اﻟﺤﺬف Deleteأو اﻟﺘﻌﺪﯾﻞ Updateوذﻟﻚ ﻣﻦ ﺧﻼل اﻟﻤﻄﻠﻘﺎت Triggersﻣﻦ اﻟﻨﻮع
ﻓﺈذا Row_Levelوﻓﻲ ﺣﺎﻟﺔ وﻗﻮع ھﺬه اﻟﺤﺎﻟﺔ ﺗﻘﻮم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أوراﻛﻞ ﺑﺈﺻﺪار رﺳﺎﻟﺔ اﻟﺨﻄﺄ Ora-4091
أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل وﺿﻊ ﺷﺮﻃﺎ ﺧﺎﺻﺎ ﻋﻠﻰ اﻟﺠﺪول employeesﻟﺘﺄﻛﺪ ﻣﻦ اﻧﮫ ﻋﻨﺪ إﺿﺎﻓﺔ ﻋﻼوة ﻷي ﻣﻮﻇﻒ
ﻣﻦ اﻟﻤﻮﻇﻔﯿﻦ ﻻﯾﺰﯾﺪ اﻟﺮاﺗﺐ اﻟﺨﺎص ﺑﮭﺬا اﻟﻤﻮﻇﻒ ﻋﻦ 20%ﻣﻦ ﻗﯿﻤﺔ اﻛﺒﺮ راﺗﺐ ﻟﮭﺬا اﻟﻘﺴﻢ ﺗﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا
اﻟﻜﻮد-:
ﯾﻌﻤﻞ ھﺬا اﻟﻜﻮد ﻋﻠﻰ إﻧﺸﺎء Triggerﻣﻦ اﻟﻨﻮع Row_Levelواﻟﺬي ﯾﻌﻤﻞ ﻋﻠﻰ إﺟﺮاء ﻋﻤﻠﯿﺔ ﻓﺤﺺ ﻟﻘﯿﻢ
رواﺗﺐ اﻟﻤﻮﻇﻔﯿﻦ وﻓﻲ ﺣﺎﻟﺔ ﻗﯿﺎﻣﻨﺎ ﺑﻌﻤﻞ ﺗﻌﺪﯾﻞ ﻋﻠﻰ رواﺗﺐ اﻟﻤﻮﻇﻔﯿﻦ ﻧﻼﺣﻆ ﻇﮭﻮر رﺳﺎﻟﺔ اﻟﺨﻄﺄ وذﻟﻚ ﻻن اﻟﺠﺪول
employeesﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﯾﻌﺘﺒﺮ ﻣﻦ اﻟﺠﺪاول mutating tableﻟﺬاﻟﻚ ﯾﻔﻀﻞ ﻋﺪم اﺳﺘﺨﺪام ھﺬا اﻟﻨﻮع ﻣﻦ
اﻟﻤﻄﻠﻘﺎت Triggerوﻟﺤﻞ ھﺬا اﻟﻨﻮع ﻣﻦ اﻟﻤﺸﺎﻛﻞ ﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻨﻮع Statement Triggerﺑﺪﻻ ﻣﻦ اﻟﻨﻮع
Row_Levelأو ﺟﻌﻞ اﻟﻤﻄﻠﻖ Triggerﻣﺴﺘﻘﻼ ﻋﻦ ﻃﺮﯾﻖ إﺿﺎﻓﺔ ھﺬه اﻟﺠﻤﻠﺔ-:
PRAGMA AUTONOMOUS TRANSACTION
ﻣﻤﺎ ﯾﺘﯿﺢ ﻟﻨﺎ ﻓﺮﺻﺔ اﻻﺳﺘﻌﻼم ﻣﻦ ھﺬا اﻟﺠﺪول ﻣﻊ ﻋﺪم اﻟﻘﺪرة ﻋﻠﻰ اﻻﺿﺎﻓﮫ أو اﻟﺘﻌﺪﯾﻞ ﻓﻲ ﻣﺤﺘﻮاه .ﻛﻤﺎ ﯾﻤﻜﻨﻨﺎ أﯾﻀﺎ
اﺳﺘﺪﻋﺎء اﻹﺟﺮاءات داﺧﻞ اﻟﻤﻄﻠﻘﺎت Triggersوذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﻤﻠﺔ CALLوذﻟﻚ ﺑﺪﻻ ﻣﻦ ﺗﻜﺮار اﻻﻛﻮاد
ﺣﯿﺚ ﯾﻤﻜﻨﻨﺎ وﺿﻊ اﻟﻜﻮد اﻟﺬي ﻧﻘﻮم ﺑﺎﺳﺘﺨﺪاﻣﮫ ﺑﻄﺮﯾﻘﮫ ﻣﺘﻜﺮرة داﺧﻞ إﺟﺮاء Procedureﺛﻢ ﻧﻘﻮم ﺑﺎﺳﺘﺪﻋﺎء ھﺬا
اﻹﺟﺮاء ﻋﻠﻰ ﺣﺴﺐ اﺣﺘﯿﺎﺟﺎﺗﻨﺎ داﺧﻞ ﻋﻨﺎﺻﺮ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت اﻷﺧﺮى ﺳﻮاءاً ﻛﺎﻧﺖ ﻣﻄﻠﻘﺎت Triggersأو وﻇﺎﺋﻒ
Functionsأو ﺣﺘﻰ إﺟﺮاءات أﺧﺮى Proceduresوﺗﺄﺧﺬ اﻟﻜﻠﻤﺔ Callاﻟﺼﯿﻐﺔ اﻟﺘﺎﻟﯿﺔ-:
;Call Procedure_name
وﺗﺒﺪأ ھﺬه اﻟﺼﯿﻐﺔ ﺑﺎﻟﻜﻠﻤﺔ Callﯾﻠﯿﮭﺎ اﺳﻢ اﻹﺟﺮاء اﻟﺬي ﻧﺮﯾﺪ اﺳﺘﺪﻋﺎﺋﮫ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﯾﻤﻜﻨﻨﺎ ﺣﻔﻆ اﻟﻜﻮد اﻟﺨﺎص
ﺑﺎﻟﻤﻄﻠﻖ اﻟﺴﺎﺑﻖ داﺧﻞ إﺟﺮاء ﺗﻢ اﺳﺘﺪﻋﺎء ھﺬا اﻹﺟﺮاء ﻣﻦ داﺧﻞ اﻟﻤﻄﻠﻖ ﻛﻤﺎ ﻓﻲ اﻟﺘﺎﻟﻲ -:
ﺗﻌﺮﻓﻨﺎ ﻓﻲ ﻣﺎ ﺳﺒﻖ ﻋﻠﻰ ﻛﯿﻔﯿﺔ إﻧﺸﺎء وﺗﻌﺪﯾﻞ وإدارة اﻟﻤﻄﻠﻘﺎت Triggersﺑﻮاﺳﻄﺔ اﻟﺠﻤﻞ-:
وﺳﻮ ف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ اﻻﻣﺘﯿﺎزات اﻟﻼزﻣﺔ ﻟﺴﻤﺎح اﻟﻤﺴﺘﺨﺪم ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت أو ﻟﻤﺪﯾﺮ ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت
ﻟﻠﻘﯿﺎم ﺑﮭﺬه اﻟﻌﻤﻠﯿﺎت ﻓﻺﻧﺸﺎء اﻟﻤﻄﻠﻖ Triggerﻻﺑﺪ ﻣﻦ اﻟﺤﺼﻮل ﻋﻠﻰ اﻣﺘﯿﺎز اﻟﻨﻈﺎم Create Triggerﺑﺎ ﻹﺿﺎﻓﺔ
إﻟﻰ اﻣﺘﻼك اﻟﺠﺪول اﻟﻤﺤﺪد ﻓﻲ اﻟﻤﻄﻠﻖ أو اﻟﺤﺼﻮل ﻋﻠﻰ اﻣﺘﯿﺎز اﻟﻨﻈﺎم Alterﻟﻠﺠﺪول اﻟﻤﺤﺪد ﻓﻲ اﻟﻤﻄﻠﻖ وﻟﺘﻌﺪﯾﻞ أو
ﺣﺬف اﻟﻤﻄﻠﻘﺎت Triggersﺑﺪون أي اﻣﺘﯿﺎزات أﺧﺮى .وﻛﻤﺎ ذﻛﺮﻧﺎ ﻣﻦ ﻗﺒﻞ اﻧﮫ ﯾﺘﻢ اﺳﺘﺪﻋﺎء اﻟﻤﻄﻠﻘﺎت Triggers
ﺑﻄﺮﯾﻘﮫ ﺗﻠﻘﺎﺋﯿﺔ ﻋﻨﺪ اﺳﺘﺨﺪام ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت DMLﻓﺬﻟﻚ ﻓﺈﻧﻨﺎ ﻻ ﻧﺤﺘﺎج ﻟﻠﺤﺼﻮل ﻋﻠﻰ أي اﻣﺘﯿﺎزات ﻻﺳﺘﺪﻋﺎء
اﻟﻤﻄﻠﻘﺎت Triggersﻓﻲ ﻧﻔﺲ ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت .Schema
وﻟﻜﻦ إذا ﻛﺎن ھﺬا اﻟﻤﻄﻠﻖ ﯾﺸﯿﺮ إﻟﻰ أي ﻋﻨﺎﺻﺮ أﺧﺮى ﻣﻮﺟﻮدة ﺧﺎرج ﻗﺎﻋﺪة اﻟﺒﯿﺎﻧﺎت Schemaﻓﻼﺑﺪ ﻟﻤﻨﺸﺊ ھﺬا
اﻟﻤﻄﻠﻖ أن ﯾﻜﻮن ﻟﮫ اﻻﻣﺘﯿﺎز Executeﻋﻠﻰ ھﺬه اﻟﻌﻨﺎﺻﺮ وﻣﻦ اﻟﻤﻤﻜﻦ إﻧﺸﺎء ﻣﻄﻠﻘﺎت ﻗﻮاﻋﺪ اﻟﺒﯿﺎﻧﺎت وذﻟﻚ ﻣﻦ
ﺧﻼل اﻻﻣﺘﯿﺎز . Administer Data base Trigger :وﻓﻲ ﺣﺎﻟﺔ ﺳﺤﺐ ھﺬا اﻻﻣﺘﯿﺎز ﯾﻤﻜﻨﻨﺎ ﺣﺬف اﻟﻤﻄﻠﻘﺎت
Triggersﻓﻘﻂ ﺑﺪون أﻣﻜﺎﻧﯿﮫ إﻧﺸﺎءھﺎ Createأو ﺗﻌﺪﯾﻠﮭﺎ . Alter
*****************************************************
Triggers
ﺳﻮف ﻧﺘﻌﺮف ﻓﻲ ھﺬا اﻟﺪرس ﻋﻠﻰ ﻛﯿﻔﯿﺔ ﻋﺮض اﻟﺒﯿﺎﻧﺎت اﻟﺨﺎﺻﺔ ﺑﺎﻟﻤﻄﻠﻘﺎت Triggersوذﻟﻚ ﻣﻦ ﺧﻼل اﻟﺠﺪاول
اﻟﺘﺨﯿﻠﯿﺔ Viewsﺣﯿﺚ ﯾﺴﺘﺨﺪم اﻟﺠﺪول اﻟﺘﺨﯿﻠﻲ User_objectﻟﻌﺮض ﻛﻼ ﻣﻦ أﺳﻤﺎء وﺣﺎﻟﺔ اﻟﻤﻄﻠﻖ-:
ﻛﻤﺎ ﯾﺤﺘﻮي ﻋﻠﻰ ﻣﻌﻠﻮﻣﺎت ﻋﻦ ﺗﺎرﯾﺦ ووﻗﺖ إﻧﺸﺎء اﻟﻤﻄﻠﻘﺎت Triggersوﯾﺤﺘﻮي اﻟﺠﺪول User_Errorsﻋﻠﻰ
ﻣﻌﻠﻮﻣﺎت ﻋﻦ اﻷﺧﻄﺎء اﻟﺘﻲ ﺣﺪﺛﺖ أﺛﻨﺎء ﺗﺮﺟﻤﺔ اﻟﻤﻄﻠﻖ -:
ﺣﯿﺚ ﯾﺤﺘﻮي ﻋﻠﻰ اﺳﻢ اﻟﻤﻄﻠﻖ وﻧﻮﻋﮫ واﻷﺣﺪاث اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ واﻟﺠﺪول اﻟﺬي ﻗﺎم ﻋﻠﻰ أﺳﺎﺳﮫ ھﺬا اﻟﻤﻄﻠﻖ
واﻻﻛﻮاد اﻟﺨﺎﺻﺔ ﻟﮭﺬا اﻟﻤﻄﻠﻖ.
وﺗﺘﻤﯿﺰ ھﺬه اﻟﺠﺪاول ﺑﺄﻧﮭﺎ ﺗﺤﺘﻮي ﻋﻠﻰ ﻋﻤﻮد إﺿﺎﻓﻲ ﯾﻌﺮض اﺳﻢ اﻟﺠﺪول اﻟﻤﺮﺗﺒﻂ ﺑﮫ ھﺬه اﻟﻤﻄﻠﻘﺎت ﻓﻔﻲ اﻟﻤﺜﺎل
اﻟﺘﺎﻟﻲ -:
; Select * From all_Triggers
ﯾﺘﻢ ﻋﺮض ﺟﻤﯿﻊ اﻟﻤﻄﻠﻘﺎت Triggersاﻟﺘﺎﺑﻌﺔ ﻟﻠﻤﺴﺘﺨﺪم . Scottوذﻟﻚ ﺑﺎﺳﺘﺨﺪام اﻟﺠﺪول ALL_Triggers
واﻵن إذا أردﻧﺎ ﻋﻠﻰ ﺳﺒﯿﻞ اﻟﻤﺜﺎل ﻣﻌﺮﻓﺔ ﻧﻮع اﻟﻤﻄﻠﻖ Update_job_Historyﻧﻘﻮم ﺑﻜﺘﺎﺑﺔ ھﺬا اﻟﻜﻮد -:
Select trigger_type
From User_triggers
; 'Where trigger_Name ='Update_job_History
**************************************************
ﻣﻼﺣﻈﺎت ﻋﻠﻰ ھﺬا اﻟﻔﺼﻞ
• ﻋﻨﺪ اﺳﺘﺨﺪام ﺟﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت ﻣﻊ اﻟﺠﺪاول اﻟﺘﺨﯿﻠﯿﺔ Viewsﺗﺴﻤﻰ اﻟﻤﻄﻠﻘﺎت ﻓﻲ ھﺬه اﻟﺤﺎﻟﺔ ﺑﺎﻻﺳﻢ
. Instead of Triggers
• ﻋﻨﺪ اﺳﺘﺨﺪام اﻟﺨﺎﺻﯿﺔ Afterﻓﻲ اﻟﻤﻜﻮن اﻟﺨﺎص ﺑﺘﺤﺪﯾﺪ وﻗﺖ ﺗﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ Trigger Timingﯾﺘﻢ ﺗﻨﻔﯿﺬ
اﻟﻜﻮد اﻟﻤﻮﺟﻮد ﺑﺎﻟﺠﺰء Trigger bodyﺑﻌﺪ وﻗﻮع اﻟﺤﺪث اﻟﺨﺎص ﺑﺠﻤﻞ ﻣﻌﺎﻟﺠﺔ اﻟﺒﯿﺎﻧﺎت DML Eventﻋﻠﻰ
اﻟﺠﺪاول.
• ﻓﻲ اﻟﻤﻜﻮن Trigger Typeﻟﻠﻤﻄﻠﻘﺎت Triggersﯾﺘﻢ اﺳﺘﺨﺪام اﻟﻨﻮع Rowﻟﺘﻨﻔﯿﺬ ﻛﻮد اﻟﻤﻄﻠﻖ Trigger
Bodyﻋﺪد ﻣﻦ اﻟﻤﺮات ﻣﺴﺎوي ﻟﻌﺪد اﻟﺼﻔﻮف اﻟﺘﻲ ﺗﺄﺛﺮت ﺑﺎﻟﺠﻤﻠﺔ اﻟﻤﺴﺒﺒﺔ ﻟﺘﻨﻔﯿﺬ اﻟﻤﻄﻠﻖ.
Form builder And Reports builder