ػ ذ ا يبذع ا م ي ك ا غا بم ي ا غك حخغشن ا يذا ؼ اص ا يخ ػ ي خفغ ب و في ا ؼا ا ؼشبي اص غ ف ضذ االعخار ا خ يز ؼا يبذػا وي ي ششا ػ ا سائؼا Mo7amed Reda Abd ElRahman ORACLE FINANCIAL CONSULTANT ACCOUNTANT UNDER ORACLE APPLICATIONS ENVIRONMENT INSTRUCTOR ORACLE FINANCIAL R12 INSTRUCTOR ORACLE DEVELOPER Scientific Computing Center Mansoura University Mobile : 01066734381
Introduction To PL/SQL Index Fundamental (I) Chapter1: Chapter2: Chapter3: Chapter4: Chapter5: Chapter6: Chapter7: Chapter8: Introduction to PL/SQL Declaring PL/SQL Variables Writing Executable Statements Interacting with the Oracle Server Writing Control Structures Working with Composite Data Types Using Explicit Cursors Handling Exceptions PL/SQL Program Units Fundamental (II) Chapter1: Chapter2: Creating Stored Procedure s Creating Stored Functions Chapter3: Creating Package
PL/SQL Fundamental (I)
CHAPTER 1 Introduction to PL/SQL PL/SQL Procedural Language / Structure Query Language PL \ SQL إ زذاد غخ ا SQL ثإضبفخ يضاد غخ ا جش غخ األعشائيخ. ع ا زؼب األسزؼال ا خبطخ ثب SQL يز إدساع ب داخ ا ى د ا خبص ث غخ ا. PL / SQL س ف م ف ا PL ثؼ و د رخضي خ ف ا DATABASE م ثب ذاء ػ ي فمظ إسزذػبئخ. س ف م ثأسزخذا بيس ثب زغيشاد (Variables) ايضب ا ض اثذ (Constant) ا اع اخش وضيشح. س ف سزخذ ا غ ا ششعيخ Statement) (If ع ا زىشاس (Loop) رسزخذ زىشاس ع ؼي ػذد شاد ؼي. س ف م ثىزبثخ ا ى د شح اؽذح ى ب سزغيغ ر فيزح اوضش شح. ي ى األسزفبدح ب ثي اد اد : PL / SQL يضاث ا Modularized ح يش ا بش ا ش : (Nested Blocks) ؽيش سزغيغ ضغ اوضش ث ن داخ ثؼض ب (Libraries) األسزفبدح ا خجشاد األو اد ا سبثمخ ر ه ثغ ؼ ب ف شى ىزجبد ا ساو ا خز فخ. Integration ا خىا :. Jdeveloper يزىب غ زغبد ا ساو ض ا Portability ا ش ت :. (Platform) ا (Operating System) ؽيش سزغيغ وزبثخ ا ى د ػ ا Exception ؼا ضت األخاء : ؽيش سزغيغ ؼب غخ األخغبء إظ بس ب ثب شى ا ز شيذ.
PL/SQL Block Structure ػذة (Blocks) و (Block) يخى : PL يخى و د ا Optional مت ا خؼشيف األػال حغخ ػ اي : Variables Cursors Constants And Other Types Mandatory ا مت ا خ فيزيت SQLStatement Pl / SQL Statement Optional ؼا ضت األخاء Mandatory ايت ا Block غ ظ :. End Begin يزى ا Block ػ األل
: PL / SQL ح فيز ص ػباساث ا. PL / SQL يز ضغ ػال خ (;) فبط خ م عخ ف بيخ و ع ا ػجبسح ع ا ػ ذ ر فيز ا ج ن ثذ أخغبء رظ ش ا غ خ ا زب يخ ز ضيؼ ر ب طؾخ ا ز فيز PL / SQL procedure successfully completed. Exception ا Begin ا Declare الؽظ ػذ ع د ػال خ ا فبط خ ا م عخ ثؼذ بيخ و خ. End الؽظ ع د ػال خ ا فبط خ ا م عخ (;) ف بيخ و خ ي ى وزبثخ أوضش ع خ ا ػجبسح ػ فس ا سغش ا فظ ثي ثؼال خ ا فبط خ ا م عخ (;) ى اليؾجز ر ه غؼ لشاءح ا جش ب ظ اس وز ه ا زؼذي في : ا اع ا ب واث Block Types العظ ا ا اع ا Blocks ف غت ا PL / SQL ي ى ا حى فظ ت و يا ا خذاخ غ بؼؼ ا ا بؼغ Blocks) (Nested ح مغ ز ا ىخ ا لغ ي : Blocks Anonymous block Subprograms block" "Anonymous الكتلة المجهىلة : يس اس يز رؼشيف ػ ذ مغخ ا زغجيك ي فز سبػز ب يز اسسب ا ؼب ظ ا ساو زشع ز ب ر فيز ب. "Subprograms" وحدات برمجية : ؽذاد ا Blocks رمج ؼب الد (Parameters) ي ى ا رسز ذ ػ ي ب ف ر فيز ا جش ب ظ ر مس ز ا ؽذاد ا ( Procedure ) (Function) ز ا ؽذاد يز ؽفظ ب داخ ا Database يز اسزذػبئ ب ػ ذ ا ؾبعخ ا ي ب. )1 )2
Blocks Types Anonymous Procedure Function Differences between Anonymous Blocks and Subprograms Anonymous Block Subprogram ئع م بؼ Compile شة اعذة فمؾ يخض ف ا Database غخيغ ح فيز App أخش ى ا يأخز Parameters يظ ئع م بؼ Compile ػ ذ و ػ يت ح فيز اليخض ف ا Database ال غخيغ ح فيز App اخش الي ى ا يأخز Parameters ا ا فشق بي ا Procedure ا Function ا Procedure ى رؼ د ثمي خ ا اوضش ا ال رؼ د ثمي خ. ا Function الثذ أ رؼ د ثمي خ.
Declare V_fname varchar2 (20); Begin Select First_name into V_fname From employees Where employee_id = 100 ; End ; زاي : اعخخشس اع ا ظف سل 111 PL/SQL procedure successfully completed. ملحىظة : Set Serveroutput On ز ا ض ت حىخب شة Procedure PUT_LINE البذ هي تهيئة البز بهح ألستخزاج خول الطببعه عي طزيق كتببة األهز التبلى DBMS_OUTPUT.PUT_ LINE اعذة ف ا Session حظ غف ظت عخ م باغالق ا بش ا ش. وال هى (,). واحذ لذلك ال ستطيع استخذام ال بعذ تهيئة البز بهح قىم بكتببة خولة الطببعه وهى DBMS_OUTPUT تسوى Package Parameter Begin هحفىظة داخل وتأخذ بذاخلهب بل ستخذم ( ) فى حبلة PL/SQL procedure successfully completed. تىضع خولة الطببعه داخل لى ارد ب طببعة اكثز هي هتغيز. فى حبلة كتببة الكىد بشكل سلين وبذوى أخطبء تظهز الدولة التبلية : Declare V_fname varchar2 (20); Begin Select First_name into V_fname From employees Where employee_id = 100 ; DBMS_OUTPUT.PUT_LINE( the first name of the employee is : V_fname ) ; End ; the first name of the employee is : Steven PL/SQL procedure successfully completed.
CHAPTER 2 Declaring PL/SQL Variables ا خغيشاث Variables ىا ف ا ي س م في بخخضي بيا ؼي ا لي ؼي حخضي إلج غخيغ ئعخخذا ا : ا Variable Variables خؼذي األػافت ػ ا مي ا ص دة ف ا Database ايؼا غخيغ ئ عخخذا اوزش شة. ا م اػذ ا ؼا خغ يت ا : Variables البذ أ يبذأ بغشف ا ى ا يغخ ع ػ عش ف أسلا ػال اث يضب اال يضيذ ػ 31 عشف اال يى و ت و اث ا ساو ا غض صة ز Insert) (Select, ا غيش ا غ ظت :. (Declare) ا ا ضضء ا خاص ب Declarative Section ف Varables م بخؼشيف ا ا ى ئػاء ا Variables لي ئفخشاػيت ف ا Declare غخيغ حبذي ا ف ا Executable Section ا ضضء ا خاص ب. Begin Example Variable Name Datatype ; V_hire Date; يضب ا ال يغخ ػ V_deptno Number Not Null := 10 ; Null V_location Varchar2(13) := 'Mansoura' ; ز ا مي ت رابخت الحخغيش ; 1400 := Number V_comm Constant Example ( I ) V_Name Varchar2(20) ; DBMS_OUTPUT.PUT_LINE ('My name is: ' V_Name ); V_Name := 'Mo7amed Reda'; DBMS_OUTPUT.PUT_LINE('My name is: ' V_Name); END ; ف ز ا غا يبغ ش ء ع و ت : Is My Name فمؾ ف ز ا غا عيبغ و ت My Name Is: Mo7amed Reda
Example ( II ) V_Name Varchar2(20) := 'Mo7amed'; V_Name := ' reda '; DBMS_OUTPUT.PUT_LINE('My name is: ' V_Name); END ; ف ز ا غا ت ا Variable ب ا لي ف ا Declarative Section ب ا لي ت أيؼا ف ا Executable Section ى ػ ذ ا م بباػت ا مي ا ص دة با خغيش عخبغ ا مي ت ا ص دة ا Executable Section أل ا األعك ف ا خ فيز ز ه عيى احش ا باػ. My name is : reda أ اع ا خغيشاث Types of Variables PL/SQL variables: Scalar Composite Reference. ا فشدة (CH6). ا شوبت. ا شاس ب ا. راث األعضا ا ىبيشة (LOB) Large object NonPL/SQL variables: Host Bind : PL / SQL ا ال ا خغيشاث ا خاطت با غ ظت : باع يذي ػ ا بيا ا ز يغ ت. األفؼ حغ يت ا Variable. Column ػ ئع Variable األفؼ ػذ حغ يت ا. Declarative Section البذ ئػائت لي ئفخشاػيت ف ا Not Null ا Constant ا ز يى Variable ا ا وخابت و ت غخيغ ئػاء ا Variable لي ت ئفخشاػيت ػ ؿشيك ػ (=:) Operator Assignment Default و ا ي : V_Name Varchar2(20) := 'Mo7amed Reda' ; V_Name Varchar2(20) Default 'Mo7amed Reda' ;
األفؼ حؼشيف و Variable ػ عش عخ يغ ػ ي ا ػ يت ا مشاءة أيؼا ؼا ضت األخاء ع ت ا ط ي ا ي ا. ع ف خ ا ي ف زا ا Chapter ا ع األ ي ا Scalar ا PL/SQL Variables ع ف خ ا ي ا ع األخيش ا خاص با. Non Pl/sql Varciables Declaring Scalar Variables ا خغيشاث ا فشدة Variables) (Scalar : )1 خغيشاث حغخ ػ لي فشدة الي ى حضضء ا لي فشدة أطغش ا ف ا اع الي ى ا يغخ ا خغيش في ا ع ػ لي ت اعذ فمؾ Number ا Varchar2 ا Date ا Boolean غيش. V_Job Varchar2 (9) ; V_Count Binary_Integer := 0; V_Dept Number (9, 2) := 0; V_Orderdate Date := Sysdate+ 7; V_Tax_Rate Constant Number := 8.25; V_Valid Boolean Not Null := TRUE; األ اع ا خخ فت : Data Types : خغيش عشف رابج ا غؼت ع اء ح أل ا با بيا اث ا حشوج فاسغت زا ا ع ؼش ف Char (length) ا غاعت ى اعشع ف ا خؼا. (length) : Varchar2 خغيش عشف راث عؼ ؼي ت ى ز ا غؼت خغيشة يخ أل ا خغيش بغؼت ا ض فمؾ بغذ الظ عؼت زا ا خغيش ف زال خغيش عشف راث عؼت 31 عشف ي ػغ في ع 6 عش ف ي الء با غش ف اي 6 يخ ح فيش ا بال زا ا ع فيذ ف ا غاعت ى اب ء ا ع ا غابك (char). : Long ا ع األعاع بيا اث ا ظيت راث عؼ بغذ الظ 32761 بايج..PL/SQL ى اليخ ا خؼا ب ال يف Long ز ا : Long Raw (s : number,p) خغيش سل يأخز اق خا اعذة ا 33 خا ت وز ه وغش ػشش 23 ا 127 : p ػذد خا اث األسلا ا ظغيغت. : S ػذد خا اث األسلا ا ؼششيت. : ا ع ا شل ا ظغيظ يأخز وغ س ػششيت خالي + 2147433 Binary_integer : Pls_integer ز ا ع ا غابك ى اعشع يأخز غاعت ال. : Boolean ع يأخز رالد لي فمؾ null) (true, false m يغخخذ ف عاالث ا شش ؽ ا ماس اث ا ميت. فمؾ : Date ع ا خغيشاث ا خاسيخيت يغخ ػ بيا اث حاسيخ ا لج ا ص يبذأ 4712 لب ا يالد ا 9999 بؼذ ا يالد.
Declare خغيش عشف راث عؼت 15 عشف ;(15) varchar2 v_job خغيش سل طغيظ يأخز لي ت ئبخذائيت طفش ;0 =: binaryinteger v_count خغيش سل عبغ خا اث ار ا وغش ػشش ;3.17 =: (7.2) number v_total_sal خغيش ص يبذأ ف األعب ع ا ماد ; 7+ sysdate v_order_date date:= CTAXRATIO CONSTANT NUMBER (4.2) :=17.25; 17.25 V_Flag Boolean Not Null :=True ; خغيش رابج سل ى اسبغ خا اث خا احا وغش ػشش يأخز لي ت افخشاػيت. خغيش م Boolean اليأخز لي ت فاسغت Null يأخز لي ت ئفخشاػيت true %TYPE Attribute. Column ا خاص با Length ا Data type ى ا يضة ب ا ا ا حأخز فظ ا Data type Variable Name Table Name. Column Name %Type ; V_Name Employees.Last_Name%Type ; V_Balance Number(7,2) ; V_Min_Bal V_Balance%TYPE := 1000; غ ظت : زا ا ع افؼ ا Basic Scalar عيذ ا ػ ذ ػ ا حغييش ا حؼذي ف ا ضذ ي ف ا Length زال فا ا Variable يخغيش ح مائيا بخغييش ا ضذ ي.. (true, false, null ) Boolean ا مي ا خ حؼ د ب ا ئعخخشاس ئع شحب ا ظف ا ز يغ سل 111 V_Name Employees.Last_Name%Type ; V_Sal Number ; V_Id Employees.Employee_id%Type := 100 ; Select Last_Name, Salary into V_Name, V_Sal From Employees Where Employee_Id = V_Id ; DBMS_OUTPUT.PUT_LINE( V_Name ' and His Salary is : ' V_Sal); END ;
Bind Variables زا ا ع ا خغيشاث يخ ئ شاؤة داخ ا Session يظ داخ ا Block حغ. Host Variable Variable Variable Name. ي ػغ لب ا و ت Variable حغخخذ أيؼا ف ا Sql ا Pl/Sql غ ظت : ػ ذ وخابت Bind Variable الي ػغ بؼذة (;) Colon Semi يى شى ت وا خا : Datatype ػ ذ ا ذاء ػ يت ئعخذػائت البذ ا ؼغ لب ) : ( Colon غخيغ ئعخخذا ص ت ا باػ ا ؼاديت غ ا. Bind Variable و ا ي :Variable Name Variable V_Sal Number Select Salary into :V_Sal From Employees Where Employee_Id = 178 ; END ; / Print V_Sal ئعخخشاس شحب ا ظف سل 173 ي ى اعخخذا ا Bind Variable ف ا. SQL ا Bind Variable ا غ V_Sal ا زو س ف ا زاي ا غابك يغخ ػ شحب ا ظف سل 173 فخشع ا ا شيذ األعخؼال ػ ا ظفي ا زي يغظ ػ زا ا شحب غ ظت : زاي : Select Last_Name From Employees Where Salary = :V_Sal ; حغخخذ ف ا باػت اح احيىيا حغ. Set Autoprint On Bind Variable ان ص ت الحؼ اال غ ا
زاي : Prompt for Substitution Variables ل باعخخشاس شحب ا ظف ا ز عأػيه سل ت ايا وا غخخذ ا ا Bind Variable شحب Set Veriffy Off Variable V_Sal Number Accept Empno Prompt ' Please Enter a Valid Employee ID ' Set Autoprint On V_Id Number(6) := & Empno ; Select Salary into :V_Sal From Employees Where Employee_Id = V_Id ; END ;
CHAPTER 3 Writing Executable Statements Lexical Units in a PL/SQL Block. ػ ذ ا خؼا غ األعشف ا خ اسيخ البذ ػؼ ا بي Single Quotition.*/ غخيغ وخابت ا ى د ػ اوزش عش. غخيغ ػ Comment ( حؼ يك ) ى د بشيمخي و ا ي :. غش اعذ غخخذ ألوزش عش غخخذ */ مف ب ؼ Comment ؼ Comment )1 )2 األفؼ ا م بىخابت ا comment يغخيغ ا يف األو اد بشى عشيغ. ػ األو اد ششط ظيفت و و د عخ ارا صاء بش ش اخش يى ا شش ع SQL Functions in PL/SQL V_Lname Varchar2(20) := Initcap( ' KING' ) ; V_Name Varchar2(20) ; Select First_Name into V_Name From Employees Where Last_Name Like V_Lname And Salary = 24000 ; غ ظت : PL داخ ا SQL ا ص دة با Functions غخيغ اعخخذا ص يغ ا. اػذا ا Decode & Group Functions
Nested Blocks غ ظت : ا ب ن ا ذاخ يش ا ب ن ا خاسص يإرش في ا ؼىظ غيش طغيظ ا ا ا ب ن ا خاسص اليش ا ب ن ا ذاخ. Example V_Father_Name Varchar2(20) := 'reda'; V_Date_of_Birth Date :='04Apr1965' ; V_Child_Name Varchar2(20) := 'mohamed' ; V_Date_of_Birth Date := '04Dec1985'; DBMS_OUTPUT.PUT_LINE( V_Father_Name ) ; ==== >>> reda DBMS_OUTPUT.PUT_LINE( V_Date_of_Birth ); ==== >>> 04Dec1985 DBMS_OUTPUT.PUT_LINE( V_Child_Name ); ==== >>> mohamed DBMS_OUTPUT.PUT_LINE( V_Date_of_Birth ); ==== >>> 04Apr1965
غ ظت : غخيغ ػ Qualifier ب ن حغ يخ بأ ئع شيذة عخ خ ى حغذيذ ا ب ن ا شاد ا ذاء ػ ي ى البذ. ػؼ بي << >> ان خغيش ف ا ب ن ا ىبيش فظ األع ف ا ب ن ا ظغيش ل ا با ذاء ػ ي داخ ا ب ن ا ظغيش فاأل يت خغيش ا ص د ف ا ب ن ا ظغيش. Logical Arithmetic Concatenation Parentheses to control order of operations Operators in PL/SQL Same in SQL Qualify an Identifier Example ( I ) << scc >> V_Father_Name Varchar2(20) := 'reda'; V_Date_of_Birth Date :='04Apr1965' ; V_Child_Name Varchar2(20) := 'mohamed' ; V_Date_of_Birth Date := '04Dec1985'; DBMS_OUTPUT.PUT_LINE( V_Father_Name ) ; ==== >>> reda DBMS_OUTPUT.PUT_LINE(scc. V_Date_of_Birth ); ==== >>> DBMS_OUTPUT.PUT_LINE( V_Child_Name ); ==== >>> Mohamed DBMS_OUTPUT.PUT_LINE( V_Date_of_Birth ); ==== >>> 04Apr1965 04Dec1985
Example ( II ) << scc >> V_Sal Number(7,2) := 60000 ; V_Comm Number(7,2) := V_Sal * 0.20; V_Message Varchar2(255) := ' eligible for commission' ; V_Sal Number(7,2) := 50000 ; V_Comm Number(7,2) := 0 ; V_Total Number(7,2) := V_Sal + V_Comm ; V_Message := 'CLERK not' V_Message ; DBMS_OUTPUT.PUT_LINE ( V_Message ); (1) scc.v_comm := V_Sal * 0.30; DBMS_OUTPUT.PUT_LINE (scc.v_comm ); (2) V_Message := 'SALESMAN' v_message; DBMS_OUTPUT.PUT_LINE ( V_Message ); (3) 1) eligible for commission. 2) 15000 3) SALESMAN eligible for commission.
CHAPTER 4 Interacting with the Oracle Server Using PL/SQL to Manipulate Data INSERT UPDATE DELETE MERGE INSERT into Departments Values (280, 'Reda_Dept', 100, 1700); Inserting Data ***************************************** Updating Data Sal_Increase Employees. Salary%Type := 800 ; UPDATE Employees Set Salary = Salary + Sal_Increase Where Job_id = 'ST_CLERK'; ***************************************** Deleting Data Deptno Employees.Department_id%Type: = 280; DELETE From Employees Where Department_id = Deptno;
SQL Cursor IMPLICIT EXPLICIT ا بش ش ا ز يم بؼ ع ف خ ا ت با خفظي ف (7) Chapter ا ع ا ؼ ا ا ا ساو ا خ لا ج بؼ يؼ ح مائيا ب ضشد ا ذاء ػ ي ا Cursor يؼزجش سبؽخ ف ا شا رم ا ساو ثزغ يض ب ار بريىيب غ و ع خ SQL رضغ ث ب ا جيب بد ا مبد خ ا SQL Cursor Attributes for Implicit Cursors. SQL غ ظت : SQL%FOUND SQL%NOTFOUND SQL%ROWCOUNT عذ ثيب بد يم ثإسزشعبع True يغذ يم ثإسزشعبع False يغذ ثيب بد يم ثإسزشعبع True عذ ثيب بد يم ثإسزشعبع False يم ثإسزشعبع ػذد ا ظف ف ا ز رأصشد ثب ؼ يخ ف ا ي س ل ب غظ ا ظف سل 206 ر اؿبغ ػذد ا ظف ف ا خ حأرشث با ؼ يت ا صذ زا ا ظف V_Rows_Deleted Varchar2(30) ; V_Empno Employees.Employee_id%Type := 206; Delete From Employees Where Employee_id = V_Empno ; V_Rows_Deleted := (SQL%Rowcount ' row deleted.'); DBMS_OUTPUT.PUT_LINE (V_Rows_Deleted );
ل باػاء ا ظف سل 111 ا صذ ا شحب األح 31111 V_Name Varchar2 (20); Select Last_Name into V_Name From Employees Where Employee_Id = 100; IF SQL%Found Then Update Employees Set Salary = 30000 Where Employee_Id = 100; End IF; غ ظت : مذ ل ب ثؼ ع خ Select ؽز ؼشف ي عذ ظف ث زا ا شل ا ال ف عذ سيأر ثإس ا يغذ ف يأر ثش ء. ا ب ا SQL%FOUND فز ظش ا ا SQL عذد ثيب بد ا ال فإ عذد فس ف رم ثز فيز ػ يخ ا زؼذي ا رغذ ف رفؼ ش ء.
CHAPTER 5 Writing Control Structures IF Statement V_Myage Number:=30; IF V_Myage < 11 Then DBMS_OUTPUT.PUT_LINE (' I am a child '); ELSE DBMS_OUTPUT.PUT_LINE (' I am not a child '); End IF;
Example V_Myage Number:=30; IF V_Myage < 11 Then DBMS_OUTPUT.PUT_LINE (' I am a child '); ELSIF V_Myage < 20 Then DBMS_OUTPUT.PUT_LINE (' I am young '); ELSIF V_Myage < 30 Then DBMS_OUTPUT.PUT_LINE (' I am in my twenties'); ELSIF V_Myage < 40 Then DBMS_OUTPUT.PUT_LINE (' I am in my thirties'); ELSE DBMS_OUTPUT.PUT_LINE (' I am always young '); End IF; غ ظت : 1( رؾمك ا ششط األ ي يز ر فيز األ ش ا ز ثؼذ Then ارا يزؾمك ا ششط األ ي يز ا غ ء ا ا ششط ا ضب ار رؾمك يز ر فيز األ ش ا ز ثؼذ then إرا وب ذ ا شش ط و ب null يز ر فيز األ ش ا ز ثؼذ. Else IF Condition Then Action س ف ي فز ا Action True ي فز ا Action False سبش ضغ ) ; ( ف بيخ. IF سزغيغ ضغ اوضش If ف فس ا غ خ. و خ Else رأر شح اؽذح ف بيخ ع خ. IF ف بيخ ا شش ط ضغ و خ ; if End )2 )3 )4
CASE Expressions V_Grade Char(1) := Upper('&Grade'); Appraisal Varchar2 (20); Appraisal := CASE When V_Grade = 'A' Then 'Excellent' When V_Grade In ('B','C') Then 'Good' Else 'No such grade' End; DBMS_OUTPUT.PUT_LINE ('Grade: ' V_Grade ' Appraisal ' Appraisal); Handling Nulls.. ا مبس بد ا جسيغخ في ب Null ا برظ يظجؼ Null. ضؼ ب Not غ Null ا برظ يظجؼ Null غ And األل ا False األضؼف ا True غ Or األل ا True األضؼف ا. False غ ظت :
LOOP Statements Basic Loop While Loop For Loop Basic Loop Syntax Loop Statement; Exit [When Condition]; End Loop; الغ باعخخذا ا Basic Loop V_Country_id Locations.Country_id%Type:= 'CA'; V_Loc_id Locations.Location_id%Type; V_Counter Number := 1; V_New_City Locations.City%Type := 'Montreal'; Select Max(Location_id) Into V_Loc_id From Locations Where Country_id = V_Country_id; LOOP Insert Into Locations (Location_id, City, Country_id) Values ((V_Loc_id + V_Counter), V_New_City, V_Country_id); V_Counter := V_Counter + 1; EXIT WHEN V_Counter > 3; END LOOP; ل باػافت 3
سزظ ا Loop رؼ ا بال بيخ ثب غجغ ال ػ شب وذ زالل ػشفذ زغيش ث ضبثخ ػذاد ا ز ي ض ػذد ا ذ ساد ا ز رم ث ب ا Loop ف و د سح ضيف اؽذ ػ زا ا ؼذاد ؽز يظ ا ا ؾذ ا غ ة يخشط ارا فب Basic Loop الثذ ػ زغيش يى ث ضبثخ ػذاد ؽز ػ يخ ا Loop ػ ذ. ارا ؾذد Exit When Condition ششط خش ط ا Loop فس ف رظ ا Loop رؼ ا بال بيخ س ف Numeric or Value Error :Number ==>.Error رز لف ا Database ػ ا ؼ ثسجت ا ز يظ يظ ش زا ا Precision too Large غ ظت : فشض ب ا ب ل ب ثؼ ا ششط ا زب 1> Counter Exit When فب ا Basic Loop س ف ر فز شح اؽذح ػ األل سغ ا ا ششط يخب ف ا Loop ر ه أل ا Statement ر فز ا ال لج ا ش س ػ ا. Condition While Loop Syntax While Condition Loop Statement; End Loop; V_Country_id V_Loc_id Locations.Country_id%Type:= 'CA'; Locations.Location_id%Type; ل باػافت 3 الغ باعخخذا ا WHILE Loop V_Counter Number := 1; V_New_City Locations.City%Type := 'Montreal'; Select Max(Location_id) Into V_Loc_id From Locations Where Country_id = V_Country_id; WHILE v_counter <= 3 LOOP Insert Into Locations (Location_id, City, Country_id) Values ((V_Loc_id + V_Counter), V_New_City, V_Country_id); V_Counter := V_Counter + 1; END LOOP;
ا While Loop رم ثؼ Check ا ال ػ ا Condition لج ر فيز ا Statement فإرا رؾمك رم ثؼ ا Loop ارا يزؾمك رؼ ا Loop ثؼىس ا Basic Loop و ب رؾمك ا Condition س ف رظ ا Loop رؼ. غ ظت : For Loop Syntax For Counter in [Reverse] lowerbound.. UpperBound Loop Statement; End Loop; ا For Loop الرؾزبط ا ػ ػذاد ب ث رم ا ساو ثؼ ار بريىيب ى ب م ثزس يز فمظ. ف ضال اسد ب عجبػخ األسلب... 1 11 فب ب م ثىزبثخ ا غ خ ث زا ا شى For I in 1.. 10 Loop DBMS_OUTPUT.PUT_LINE ( I ); اسد ب عجبػخ األسلب ثشى ػىس ا شل 11 ؽز ا شل 1 فب م وزبثخ ا غ خ ثب شى ا زب : 10.. 1 For I in Reverse Loop DBMS_OUTPUT.PUT_LINE (I); ال سزغيغ اسزخذا Null ف ثذايخ ا ؼذاد ال لي يغت ا جذأ ث ب (1). سزغيغ اسزخذا اوضش Loop داخ ثؼض ب ف فس ا غ خ. غ ظت : الغ باعخخذا While Loop V_Country_id Locations.Country_id%Type:= 'CA'; V_Loc_id Locations.Location_id%Type; V_New_City Locations.City%Type := 'Montreal'; Select Max(Location_id) Into V_Loc_id From Locations Where Country_id = V_Country_id; FOR i in 1..3 LOOP Insert Into Locations (Location_id, City, Country_id) Values ((V_Loc_id + i), V_New_City, V_Country_id); END LOOP; ل باػافت 3
CHAPTER 6 Working with Composite Data Types Composite Data Types 1) PL/SQL Records 2) PL/SQL Collections : a. Index By tables. b. Nested table. c. Varray. ان ػا ا : PL/SQL Records Records غ ظت : ا Record يؾ ثذاخ اوضش لي خ ػ ػىس ا. Scalar يؾز ا Record ػ 3 Generation Language (3GL) Fields يز ا شبء ز ا خب بد ث فس ا غشيمخ ا ز رسزخذ ب غبد ا C ا ++C إػغبء ا Record رس يز ب ايضب ص ػ ا Variable ا جش ظ يم ثزؼشيف ا DataType ا خبطخ ث ز ا Fields ا زغيش الثذ رؾذيذ ع ثيب بد ا ا ا Variable الثذ رؾذيذ Datatype ى األخزالف ز ا شح ا ا Datatype ػجبسح ػ غ ػخ ا Datatypes يسذ اؽذح ز ه يغت ػ ي ب ا شبء ا Datatype ا ال ثؼذ ر ه يز إػغبؤ ب زغيش. Syntax Create Datatype and Variable. Type Type_Name is Record (Field1 Datatype, Field2 Datatype,.) ; Variable ;
غ ظت : Two Fields ش ا ب لذ ل ب ثؼ Datatype رؾز ػ وأ ب ل ب ثؼ زغيشا داخ ا Datatype ز لذ ل ب ثإػغبء ز ا Datatype إس ب. ئعخخشس ئع ظيفت ا ظف سل 111 باعخخذا ا Record Type Emp_Rec is Record (R_Name Varchar2(20), R_Job Varchar2(20)); V_Rec Emp_Rec ; Select Last_Name, Job_id into V_Rec From Employees Where Employee_id = 100 ; DBMS_OUTPUT.PUT_LINE (V_Rec.R_Name ' ' V_Rec.R_Job ) ; غ ظت :. (Variable.Field name) ف ؽب خ ا غجبػ الثذ وزبث اس ا زغيش د د اس ا في ذ. Record ػ ذ األسزؼال ضغ ا مي داخ ا زغيش يغت ا يشاػ ا زشريت ا ع د ف ا
%ROWTYPE Attribute Syntax Variable_Name Table_Name%Rowtype ; سزخذ ا %Rowtype اسد ب اسزخشاط ع يغ أػ ذح ا غذ ي ف اسزخذ ب ا غشيمخ ا ؼبديخ ا Scalar فإ ب س ؾزبط ا رؼشيف زغيشاد ثؼذد أػ ذح ا غذ ي ل ب ثؼ Record فإ ب س ف ؾزبط ا رؼشيف Fields ثؼذد أػ ذح ا غذ ي أيضب زا سجت إسزخذا خبطيخ %Rowtype. Exampl (I) ئعخخشس ص يغ بيا اث ا ظف سل 111 ل بباػت ئع ت شحبت V_Rec Employees%Rowtype ; Select * into V_Rec From Employees Where Employee_Id = 100 ; DBMS_OUTPUT.PUT_LINE ( V_Rec.Last_Name ' ' V_Rec.Salary); Exampl (II) Type T_Rec is Record (R_Sal Number, R_Minsal Number Default 1000, R_Hire_Date Employees.Hire_Date%Type, R_Rec1 Employees%Rowtype ); V_Myrec T_Rec ; V_Myrec.R_Sal := V_Myrec.R_Minsal + 500; V_Myrec.R_Hire_Date := Sysdate; Select * into V_Myrec.R_Rec1 From Employees Where Employee_Id = 100; DBMS_OUTPUT.PUT_LINE (V_Myrec.R_rec1.Last_Name ' ' To_Char(V_Myrec.R_Hire_Date) ' ' To_Char(V_Myrec.R_Sal) );
PL/SQL collections INDEX BY Tables ع أ اع ا Datatype ا ز م ثؼ ب يزى ػ دي ا ؼ د األ ي ثيى Primary Key يفض ا رى ع ا جيب بد ث سل يخ ا ؼ د ا ضب ا ب ا يى Scalar ا. Composite Syntax TYPE Type_Name Is Table Of ( Column_type Table.Column%Type Table%Rowtype ) INDEX BY (Datatype ); Variable_Name Type_Name; غ ظت :
Examples(I) Type T_Name_Table Is Table Of Employees.Last_name%Type Index By Number; V_Name T_Name_Table; V_Name (1) := 'Mo7amed Reda'; IF V_Name.Exists(1) Then Insert into Employees (LAST_Name, Employee_Id, Hire_Date, Job_Id, Email ) Values(V_Name(1), 800, '1JAN2010', SA_REP, Dev_Habib@Yahoo.com ); Examples(II) TYPE Emp_Table_Type Is Table Of Employees%Rowtype INDEX BY PLS_INTEGER; V_Emp Emp_Table_Type; V_Max_Count Number := 104; FOR i IN 100.. V_Max_Count LOOP Select * Into V_Emp(i) From Employees Where Employee_Id = i; END LOOP; FOR i IN V_Emp.FIRST.. V_Emp.LAST LOOP DBMS_OUTPUT.PUT_LINE ( V_Emp(i).Last_Name); END LOOP;
CHAPTER 7 Using Explicit Cursors ا ا Cursor ا فائذحت ا Explicit Cursors يس ا ع ا ض ا ا ا جش ظ ا ز يم ثؼ فزؾ رؼجئز غ م ػجبسح ػ ىب ف ا ي س رم في ثؼ ػ ي ؼي ا ا ب م ثزخضي و ا جيب بد ا ز ؾزبؽ ب ا Database ف ا Cursor ثذال ا ز ت ف و شح ا ا Database سزذػ ا جيب بد زا عجؼب اسشع ثىضيش ي فش لزب وجيشا ارا فبئذر ا ىجش ف ا سشػخ ف األسزؼال ؼ ا جيب بد فجذال ا ضغ ا مي ا Database ف ا زغيش ف أر ثى ا جيب بد ا ز شيذ ب شح اؽذ ا Cursor ا ز ثغجيؼز خض ف ا ي س ص م ب ا ا زغيش. Syntax Cursor Cursor_Name is Select_Statement; Open Cursor_Name ; Fetch Cursor_Name Into Variables ; Close Cursor_Name ;
ئعخخشس أسلا أع اء ظف األداسة سل 31 Cursor Emp_Cursor is Select Employee_Id, Last_Name From Employees Department_Id = 30 ; V_Id Employees.Employee_Id%Type ; V_Name Employees.Last_Name%Type ; Open Emp_Cursor ; LOOP Fetch Emp_Cursor into V_Id, V_Name ; Exit When Emp_Cursor %Notfound ; DBMS_OUTPUT.PUT_LINE ( V_Id ' and his name is :' V_Name ); End Loop ; Close Emp_Cursor ; ل بغ ا زاي ا غابك ى باعخخذا خغيشاث ا ع Composite با خغذيذ باعخخذا ا Record بذال Cursor Emp_Cursor is Select Employee_Id, Last_Name From Employees Where Department_Id = 30 ; V_Rec Emp_Cursor %Rowtype ; Open Emp_Cursor ; LOOP Fetch Emp_Cursor into V_Rec; Exit When Emp_Cursor %Notfound ; ا خغيشاث ا Scalar DBMS_OUTPUT.PUT_LINE ( V_Rec.Employee_Id V_Rec.Last_Name ); End Loop ; Close Emp_Cursor ;
مذ ل ب ثؼ ا Cursor ضؼ ب ث و ا جيب بد ا ز شيذ ب ا Database ص ل ب ثإسزذػبئ ب ا Cursor ا ا زغيش ثسشػ أل األص ب ف ا ي س س اء ا Variable ا ا. Cursor غ ظ : Explicit Cursor Attributes Cursor FOR Loops اسزخذا For Loop غ ا Cursor األشيبء ا شبئؼخ األسزخذا ؽيش ا ب ال ؾزبط ا رؼشيف زغيش ثب سجخ For Loop أيضب ال ؾزبط فزؼ ال زؼجئخ ال غ ك ا Cursor ارا ف ؾزبط اال ؼ ا Cursor فمظ رم ا ساو ا ر بريىيب ثفزؾخ رؼجئز غ مخ. اعخخشس اسلا اع اء ظف األداسة سل 31 باعخخذا ا For Loop Cursor Emp_Cursor is Select Employee_Id, Last_Name From Employees Where Department_Id = 30 ; For Rec in Emp_Cursor Loop DBMS_OUTPUT.PUT_LINE ( Rec.Employee_Id Rec.Last_Name ); End Loop ;
Syntax %ISOPEN Attribute IF NOT c_emp_cursor%isopen THEN OPEN c_emp_cursor; END IF; LOOP... ECLARE END ; زاي ػ اعخخذا ا خاطيت %ROWCOUNT %NOTFOUND. Cursor C_Emp Is Select Employee_Id, last_name From Employees; V_Rec C_Emp%Rowtype; Open C_Emp ; LOOP Fetch C_Emp INTO V_Rec ; Exit When C_Emp %Rowcount > 10 or C_Emp %Notfound; DBMS_OUTPUT.PUT_LINE ( V_Rec.Employee_Id ' ' V_Rec.Last_Name); End Loop; Close C_Emp ; ف ز ا ؾب خ ا ششط يزؾمك ا ال رخشط ا Loop س اء ا Cursor اطجؼ فبسغب ا ػذد ا ظف ف ا ز ر سؾج ب اوجش. 11 غ ظت :
. Cursor FOR Loops Using Subqueries زاي ػ اعخخذا ا For R in ( Select Employee_Id, Last_Name From Employees Where Department_Id =30 ) LOOP DBMS_OUTPUT.PUT_LINE ( R.Employee_Id ' ' R.Last_Name); End Loop; غ ظت : و بفؼ ب ا ب ثذال ػ ا Cursor ضغ ع خ األسزؼال داخ ل ب ثؼ Subquey ىب ا Cursor ف ا for Loop فمظ رم ث فس ا ظيف ى يس ث فس ا سشػخ.. Cursors with Subqueries زاي ػ اعخخذا ا Cursor Sub is Select D.Department_Id, D.Department_Name,E.Staff From Departments D, (Select Department_Id,Count (*) as Staff From Employees Groub by Department_Id) E Where D.Department_Id = E.Department_Id And E.Staff >= 3; غ ظت : برظ زا ا Cursor اسلب اس بء األداساد ا ز ث ب ظفي اوجش ا يسب 3 ظفي.
Cursors with Parameters Parameters زغييش ا ارظ. ا فبئذح ا ب سزغيغ رغييش ا مي ا برغخ ػ ا Cursor ػ عشيك إدخبي Example Cursor C_Emp (P_Id Number) is Select Employee_Id, Last_Name From Employees Where Department_Id = P_Id ; V_Id Number ; V_Name Varchar2(20) ; Open C_Emp( 10 ) ; Loop Fetch C_Emp Into V_Id, V_Name ; Exit When C_Emp%Notfound ; DBMS_OUTPUT.PUT_LINE (V_Id V_Name); End Loop ; Close C_Emp ; DBMS_OUTPUT.PUT_LINE ( ); Open C_Emp( 30 ) ; Loop Fetch C_Emp Into V_Id, V_Name ; Exit When C_Emp%Notfound ; DBMS_OUTPUT.PUT_LINE (V_Id V_Name); End Loop ; Close C_Emp ; ث زا ا شى ى لذ ل ب ثزغييش ا جيب بد اوضش شح ػ عشيك فزؼ ا Cursor شح اخش ثجيب بد اخش ى ر ه يزغ ت ب غ ك ا Cursor ا مذي اال سيظ ش ب Error ا فز ػ ثب فؼ زغ ت ػ ز ا شى خ سزخذ ا خبطيخ. Cursor_Name%Isopen غ ظت :
CHAPTER 8 Handling Exceptions و ب روش ب لج ا ز ا شؽ خ شؽ خ إخزيبسيخ سغزيغ األسزغ بء ػ ب ى ب شؽ خ ب خ في ب يز ا زؼب غ األخغبء ا ز ى ا رظ ش سزخذ ا بئ ؼب غز ب إظ بس ب ثظ س يسزغيغ ف ب لشأر ب ؽيش ا األخغبء ا ز رظ ش ا ساو اليسزغيغ ا سزخذ ا بئ ف ب ز ه ظ ش ب ثظ سح ثسيغخ. Predefined Oracle Server Error 21 زؼبسف ػ ي لج ا ساو ا ش سي يى ذي إس Error ايضب سل ض Example V_Name Varchar2(20); Select First_Name into V_Name From Employees Where Last_Name Like King ; DBMS_OUTPUT.PUT_LINE ( V_Name ); EXCEPTION When Too_Many_Rows Then DBMS_OUTPUT.PUT_LINE ( Query Retrieved Multiple Rows ); Syntax Exception EXCEPTION When Exception1 [Or Exception2] Then Statement ; [When. Then Statement ; ] [When Others بن ؽ ا شسب خ. غ ظت :
فإ س ف يظ ش Error ا بن اوضش شخض ى غ وزبثخ ا عذ اوضش ظف يس King فسزظ ش ا شسب خ ا ز وزج ب ب زا ا Error ا شب يش ا 21 Exception ل ب ثىزبثخ ز ا غ خ Select Last_Name From employees Where salary = 2542184518 ; أل الي عذ ظف يأخز زا ا شرت V_Name Varchar2(20); V_Sal Number; No Data Found ==> Error فإ س ف يظ ش ب زا ا Select Last_Name into V_Name From employees Where salary = 2542184518; DBMS_OUTPUT.PUT_LINE ('V_Name' ); DBMS_OUTPUT.PUT_LINE ( 'V_Sal' ); EXCEPTION When No_Data_Found Then ;(' الي صذ ظف يأخز زرا ا شحب' ( DBMS_OUTPUT.PUT_LINE When Others Then DBMS_OUTPUT.PUT_LINE (SQLCODE '' SQLERRM); ث ز ا ظ سح س ف يظ ش ا الي عذ ظف ث زا ا شرت يم ثغجبػخ ا V_sal ال ا V_name أل ب عبءا ثؼذ ع خ Select ا ز رؾز ػ ا Error ا ب ضؼ ب ع خ ا غجبػ ا شرت األس اػ ا Select فإ س ف رم ثغجبػخ. Null غ ظت : SQLCODE حأح بشل ا Error SQLERRM حأح ب ض سعا ت ا Error
ع ف م األ بؼشع ا Errors ا خؼاسف ػ ي ا ا ش سة و ا ل ا لب ا ا 21 Error خؼا شف ػ ي واألح :
Non predefined Oracle Server ف ز ا ؾب ا Error الي ز ه يخ ا ال ي ز ه اس ذي ثب غجغ سل ذي سسب ى ا شى خ ا ب ال سزغيغ ا ذاء ػ ي أل يس إس ز ه م ثؼ زغيش ا ع Exception ا ا يؾ ثذاخ خ Error ضغ ا Error ثذاخ ػ عشيك بيس ثب Paragma ا ز رشثظ رضغ ا Error داخ ا Variable ب ز يؾذس ارا ؽب ب اضبفخ لي خ Null ف ػ د Not Null ثب غجغ سيظ ش Error سل خ 11411 سسب ز رم ي ا ب ال سزغيغ ضغ لي خ Null داخ ػ د Not Null ى ا سزخذ ا بئ ظ شد ز ا شسب خ زا ا شل يف شيئب ز ه س ف ظ ش سسب يسزغيغ ف ب. Example V_Error Exception; Pragma Exception_init (V_Error, 01400); Insert into Departments (Department_Id, Department_Name) Values ( Null, 'Mo7amed Reda'); EXCEPTION When V_Error Then ; ('البذ ػغ لي ت داخ ا ؼ د') DBMS_OUTPUT.PUT_LINE User Defined Exceptions وهما نىعان : Raise Raise_Application_Error ز ا شح الر عذ شى خ أل يظ ش ب PL/SQL Procedural Successfully ى ا ى د يغجك فؼ يب ي غؼ ف ر فيز ا غ ة ى ثذال ا يظ ش ب Error ي ضؼ ا ا ؼؼ يخ رز يظ ش ا ب غؾذ فؼ عشيك اسزخذا Raise سزغيغ ارا ي فز ا ى د ا غ ة فإ ب غجشح ػ اظ بس سسب خ ر ضؼ ا ا ؼ يخ رز.
Example V_Error Exception ; Update Employees Set Salary = 12000 Where Employee_Id = 123456 ; IF SQL%Notfound Then Raise V_Error ; End IF; DBMS_OUTPUT.PUT_LINE (SQL%Rowcount); Commit; EXCEPTION When V_Error Then ;(' ال ي صذ ظف ب زا ا شل ') DBMS_OUTPUT.PUT_LINE Raise )1 سزخذ Raise ىب ظ ش ب سسب ا ر ذ ػ يخ ا زؾذيش ث غبػ زا عجؼب يؾذس ؼذ ع د ظف ث زا ا شل. %ROWCOUNT == < رم ثب مشاءح ػذد ا ظف ف ا ز رأصشد ثب ؼ يخ خالي ا ي س فإرا و ب وزج ب Commit لج DBMS فإ يظ ش يغجغ شيئب ر ه أل Commit رم ثؼ Save ؼ يبد ا ي س ا ا Database ر ؾ ب ف ا ي س.
Raise_Application_Error )2 ف ز ا شح بن Error ا ال الي ى ا جش ظ خال يسزغيغ ظ س Error طشيؼ ض Error ا ساو سل سسب خ ا ى ا م ثأسزخذا اسلب خبطخ ثب ساو مذ لب ذ ا ساو ث ع غ ػ األسلب سزغيغ اسزخذا ب رجذأ 21111 ؽز 21222 سزخذ Raise_Application_Error ؽز م ث ز ا ؼ يخ سزغيغ ا فؼ ر ه ث ىب ي ب ا ب غمخ ا Exception Section ا غمخ ا Executable. Section. Executable Section Delete From Employees Where Employee_Id = 123456; IF SQL%Found Then DBMS_OUTPUT.PUT_LINE (SQL%Rowcount ); Elsif SQL%Notfound Then ;( الرقم بهذا مىظف يىجد ال,20001) Raise_Application_Error End IF; Exception Section V_Name Varchar2(20); Select Last_Name into V_Name From Employees Where Employee_Id = 123456; EXCEPTION When No_Data_Found Then ;( ا شل ب زا ظف ي صذ ال,20002) Raise_Application_Error
PLSQL Program Units
CHAPTER 1 Creating Stored Procedures ع ا اع ا ج وبد يؼزجبس اؽذ افشاد ػبئ خ ا Subprogram رى ي شجي ثب ج ن ا Anonymous غ إخزالف ثسيظ غ ا Procedure ال سزخذ ا Declare سزخذ ثذال Is ا As ؽز ضغش ا رؼشيف Variables ا جبل و ب يضح ا Procedure ا ب م ثىزبثخ ا ى د شح اؽذح سزغيغ ر فيزح ا ذاء ػ ي اوضش شحأل خض ف ا Database ى يس ا ضش س ا يؼ د زا األعشاء ثمي خ ؼي... ا ا ى ا يؼ د ثمي خ ا ال... ا فشق بي ا Function) Subprogram (Procedure, ا Anonymous Block Syntax Create [ or Replace ] Procedure Procedure_Name Is As [ (Parameter1 [Mode1] Datatype1, Parameter2 [Mode2] Datatype2,...) ] Variables; END [Procedure_Name]; م ثإسزخذا و خ زؼذي ػ ا. Procedure غ ظت : ا Procedure رسزغيغ ا رأخز Parameters ا ال. ػ ذ ػ ا Procedure ا ا Function فإ رظ ش سسب خ رم ي Procedure Created فإ ا Compiler ارا وب بن Error يم ثؼ Check ػ ي فإرا وب ا Syntax يس ث أخغبء فس ف رظ ش ز ا شسب خ Warning:. Function Created with Compilation Error ؼشفخ ا خغأ ا ع د م ثىزبثخ. Show Errors
CREATE PROCEDURE Add_Dept IS V_Dept_Id Number := 280 ; V_Dept_Name Varchar2(20) := 'Outbox'; Insert into Departments ( Department_Id,Department_Name) ل بؼ Procedure حم باػافت اداسة صذيذة Values (V_Dept_Id, V_Dept_Name ); DBMS_OUTPUT.PUT_LINE ('Inserted ' SQL%Rowcount ' row '); Execute Add_Dept ; ب زا ا شى لذ ا بؼ Procedure ى ا ح فز بؼذ ا اسد ا ا فز ا فا ر ه يخ بشيمخي ا : Add_Dept ; غ ظت : يفؼ ئعخخذا ا شيمت ا زا يت أل ا شيمت األ ال حؼ ف ا ف س ض غخمبال. Parameters شجي ثب زغيشاد ى ر شس ا مي خ فمظ داخ ب ا ب ا زغيش فيم ثؾ ا مي خ م ثزؼشيف ا Parameter ثؼذ إس ا. Length اليأخز Procedure P_Name Varchar2(20) x P_Name Varchar2 ا Parameter ا اع :
Create Procedure Add_Name (P_Name Varchar2 ) Add_Name ( Mo7amed Reda ); ا Parameter ف ؽب خ األ شبء ض : : Parameters Formal غ ظت : : Actual Parameters ا Parameter ف ؽب خ إػغبء لي خ ض : Using IN Parameters: Example ل بؼ Procedure م باػائ ا سل ا ظف غبت ا غ افض حم با خؼذي ف شحب ب ز ا غبت CREATE OR REPLACE PROCEDURE Raise_Salary ( P_Id IN Employees.Employee_Id%Type, P_Percent IN Number) IS Update Employees Set Salary = Salary + (Salary * P_Percent) Where Employee_Id = P_Id; END Raise_Salary; Raise_Salary ( 100,.4 ); خ فيز ا: Using OUT Parameters: Example ل بؼ Procedure م باػائ ا سل ا ظف حؼي ا ئع شحب CREATE OR REPLACE PROCEDURE Query_Emp (P_Id IN Number,P_Name OUT Varchar2, P_Sal OUT Number) IS Select Last_Name, Salary Into P_Name, P_Sal From Employees Where Employee_Id = P_Id; END Query_Emp;
V_Name Varchar2(20); V_Sal Number; Query_Emp ( 171, V_Name, V_Sal ); DBMS_OUTPUT.PUT_LINE ( V_Name V_Sal ); خ فيز ا : VARIABLE V_Name Varchar2(25) VARIABLE V_Sal Number EXECUTE Query_Emp (171, :V_Name, :V_Sal) ; / PRINT V_Name, V_Sal ا ع. Out ث ب Parameter ؿشيمت أخش خ فيز : غ ظت : الثذ ػ Variable ػ ب م ثب ذاء ػ ا Procedure Using IN OUT Parameters: Example ع ف أػيه سل باي اسيذ اعخخشاص ب زا ا شى 0984455(010) CREATE OR REPLACE PROCEDURE Format_Phone (P_Phone_No IN OUT Varchar2) IS P_Phone_No := '(' Substr (P_Phone_No,1,3) ')' Substr (P_Phone_No,4,3) '' Substr (P_Phone_No,7); END ;
خ فيز ا: غ ظت : V_Phone Varchar2(20) := '01009844556'; Format_Phone (V_Phone ); DBMS_OUTPUT.PUT_LINE (V_Phone ); ػ ذ ب م ثب ذاء ػ ا Procedure ث ب Parameter ا ع In Out Syntax for Passing Parameters الثذ ػ Variable سزغيغ ا ذاء ػ ا Parameters ثأوضش شى : Positiona )ا خشحيب( م ب ػغ لي ا Parameter ب فظ ا خشحيب ا ص د ف ا Procedure Named Combination )األع ( م بىخابت ئ ا Parameter بض اسة ا مي ةا خاطت ب : P_Name => Mo7amed Reda )األ ا خشحيب( م بىخابت ا مي با شيمخي ا غابمخي ؼا حبذأ 1111 حضيذ ب ؼذي 1 Create Sequence Reda_Seq Start With 1000 Increment By 1 ; ل با شاء Sequence ل بؼ Procedure ا غابمت م باػائ ا سل ا ظف حؼي ا ئع شحب ر ل با ذاء ػ ي ا با زالد ؿشق CREATE OR REPLACE PROCEDURE Add_Dept ( P_Name Varchar2, P_Loc IN Number ) IS Insert Into Departments ( Department_Id, Department_Name, Location_Id) Values (Reda_Seq.Nextval, P_Name, P_Loc); END Add_Dept;
Passing by Positional Notation Execute Add_Dept ( Education, 2300 ); Passing by Named Notation Execute Add_Dept (P_Loc => 2400, P_Name => Training ); Passing by Combination Notation Execute Add_Dept ( Advertising, P_Loc => 2500 ); خ فيز : Invoking Procedures سزغيغ ا ذاء ػ ا Parameters خالي anonymous blocks رؼشض ب أل ض خ وضيشح ف زا ا ظذد ايضب خالي CREATE OR REPLACE PROCEDURE Process_Employees IS Commit; Cursor Emp_Cursor is Select Employee_Id From Employees; For Rec in Emp_Cursor Loop Raise_Salary Rec.Employee_Id,.3); End Loop; END Process_Employees; Handled Exceptions Procedure اخش. ػ إفزشاع ا ب ل ب ثؼ Procedure رس Add_Dept ل ب ثؼ Exception ثؼ Procedure اخش ظيفز ب ا ذاء ػ. Add_Dept ارا يغذد عذد خأ ف ا Add_Dept ى لذ ل ا ب ؼا ضخ ارا و ب لذ ل ب ث ؼب غز ف يؾذس شيئب ا ب ارا وب بن Error ب األخغبء ا ز ي ى ا رمغ ث ب ص ل ب يؼب ظ فس ف يظ ش ب Error ي لف و ش ء. Syntax Removing Procedures DROP Procedure Procedure_Name ; Example DROP Procedure Raise_Salary;
Viewing Procedures in the Data Dictionary Select * From User_Source Where Name = ' Add_Dept ' And Type = 'PROCEDURE' Order by Line; شؤيت ؼشفت ا ى د ا ز لذ ل ج بىخابخ داخ ا Procedure ا خ ل ج بؼ ا Select Object_Name From User_Objects Where Object_Type = 'PROCEDURE'; ش ؤيت ؼشفت اع اء ا Procedure ا خ ل ج بؼ ا
ع ا اع ا ج وبد يؼزجش اؽذ افشاد ػبئ خ ا Subprogram إخزالف ثسيظ الرسزخذ Declare غ ا Function ا خ رؼشيف Variables ا ب ا جبل و ب يضح ا Function رسزخذ ثذال ب ا Is رى ي يى شجي ثب ج ن ا ؼبد ا Anonymous As الثذ وزبثخ ا Is غ As ؽز ضغش CHAPTER 2 Creating Stored Functions أل ب خض ف ا Database الثذ ا رؼ د ا Function ا ب م ثىزبثخ ا ى د شح اؽذح ا ذاء ػ يخ ر فيزح اوضش شح ثمي خ. ا فشق بي ا Function) Subprogram (Procedure, ا Anonymous Block Syntax CREATE [ OR REPLACE ] FUNCTION Function_Name [(Parameter1 [mode1] Datatype1,...)] RETURN Datatype IS AS [Variables ; ] RETURN expression; END [function_name]; غ ظت : ا ا ب م ثز يئخ ا Function ا ا برظ ا شاد ف ا Return Datatype ا فشق ثي ا Procedure ا Function ا ز في ؾذد ا زغيش ا ز شيذ ا ضغ في إسزخشاعخ سيى ا ز ل ذ ثزؾذيذح سزمج خالي Return Expression ا مي خ. اسزخذا Paramerter اال ا ع In فمظ. ال سزغيغ غ ا Function ايضب ا Return ػ ذ رؾذيذ ا Datatype ال ؾذد ب و ب ػشف ب ب سبثمب ػ ذ رؼشيف ب فإ ب ال ؼغي ب Length ا Paramerter Length ايضب.
ل بؼ Function ؼي ا سل ا ظف حؼي ا شحب CREATE OR REPLACE FUNCTION Get_Sal ( P_Id Number ) RETURN Number IS V_Sal Number:= 0; Select Salary into V_Sal From Employees Where Employee_id = P_Id; RETURN V_Sal; END Get_Sal; ان اسبغ ؿشق خ فيز ز ا Function غ ظت : الثذ ػ زغيش ػ ذ ا ذاء ػ ا Function ألسزشعبع ا مي خ في. ل بؼ Function ؼي ا ا شحب حؼي ا طاف ا ؼشيبت ا خاص ب CREATE OR REPLACE FUNCTION Tax (P_Value IN Number) RETURN Number IS RETURN (P_Value * 0.08); END Tax;
Select Employee_Id, Last_Name, Salary, Tax(Salary) From Employees Where Department_Id = 100; ؼي ا سل ا ظف حؼ د ب True شحب اوبش خ عؾ شحباث اداسح False ا ؼىظ CREATE FUNCTION Check_Sal ( P_Id Number) RETURN Boolean IS V_Dept_Id Employees.Department_Id%Type; V_Empno Employees.Employee_Id%Type ; V_Sal Employees.Salary%Type; V_Avg_Sal Employees.Salary%Type; Select Salary,Department_Id into V_Sal,V_Dept_Id From Employees Where Employee_Id = P_Id; Select Avg(Salary) into V_Avg_Sal From Employees Where Department_Id=V_Dept_Id; IF V_Sal > V_Avg_Sal THEN RETURN True; ELSE RETURN False; End IF; EXCEPTION When NO_DATA_FOUND Then RETURN Null; خ فيز ا : Function ل بؼ
V_Check Boolean ; V_Check := Check_Sal ( 205) ; IF V_Check = True Then DBMS_OUTPUT.PUT_LINE ( T ); ELSIF V_Check = False Then DBMS_OUTPUT.PUT_LINE ( F ); End IF ; Removing Functions Syntax DROP Function Function_Name ; Example DROP Function Get_Sal ;. خ فيز ا: غ ظت : شؤيخ ا خغأ ىزت Show Errors Viewing Functions in the Data Dictionary شؤيت ص ؼشفت ا ى د ا ز ل ج بىخابخ داخ ا Function ا خ ل ج بؼ ا. Select Text From User_Source Where Name = ' Get_Sal ' And Type = 'FUNCTION' ; شؤيت ؼشفت أع اء ا Functions ا خ ل ج بؼ ا. Select Object_Name From User_Objects Where Object_Type ='FUNCTION';
ا زؼشف ػ ا Backage ى بر ب. ا شبء Backage األ ذاف : رزض غ ػخ.Exceptions Functions Procedures Cursors Variables ا زؼشف ػ ويفيخ اسزذػبء رشغي ا. Backage CHAPTER 3 CREATING PACKAGES Body )2 صضئي ا : حخى ا Backage Specification )1 الؽظ ا الثذ اشبء ا Specification ا ال ص م ثإ شبء ا Body ؽيش ا الي ى اشبء ا Body ا ال. ي ى ه إسزذػبء ا ػ (Call) أل Procedure ا Function ثششط ع د ف ا Specification )ا غضء ا (Public الي ى أسزذػبء Procedure ا Function ا ع دي ف ا Package Body فمظ )ا غضء ا Private فمظ(. ى. ف ا شع ا غابك :. Specification ف ا Procedure ؽيش ر رؼشيف ز ا )Procedure )A ػ عشيك ا Backage ي ى ب إسزخذا ا Specification ف ا Procedure ؽيش رؼشف ز ا )Procedure )B ػ عشيك ا Backage الي ى ب إسزخذا ا الؽظ ا يز ؽفظ ا Specification ا Body ا خبطي ثب Backage ف عضئي فظ ي داخ األ ساو.
ويف يم ا ساو بخ فيز ا ى د ا خاص با :Backage يز وزبثخ ا ى د ا ال ف. Text File 1(. يز ػ Load ى د ا ز ر وزبثز ا ا Environment. Isql*plus 2( يز ػ Compile And Store Backage ارا وب ا ى د س ي يز رخضي ا Backage ف ا Database ارا وب ف 3( ا ى د ا خغأ س ش ا ا Backage ي عذ ث ب اخغبء شؤيخ ا خغأ م ثىزبثخ األ ش Show Errors ر ه ؼشفخ ا. Compilation Errors ا. Body يز ػ Execute ى ا Specification )4 ئ شاء ا Backage Specification ثذال ا م : Or Replace إخزيبسيخ م ثىزبثز ب ؽز ز ى ػ ا رؼذي ف ا Backage Specification ثإصا ز ب ص ا زؼذي في ب. ي ى إسزخذا ثؼذ ر ه ػ ؽيش يز رؼشيف ف ا Specification : Subprogramme ا Procedure ا Function عشيك ا. Backage
زاي : Parameters Description Package_name حؼبش ػ األع ا خاص با Package Public Type and item Declaration Declare Variable, Cursor, Constant, Exception, or Types Subprogram Specification ا Function حؼشيف وال ا Procedure ا ذف ا ضبي ا زب ا شبء Package رم ثب زأوذ أ ا ظف عذيذ يز رؼيي ف ا ششوخ الثذ أ يى ا Comm ا خبص ث ال اوجش Comm ف ا ششوخ. ر رؼشيف Variable ثإس G_comm يأخز لي خ إفزشاضيخ 0.10 أيضب ر رؼشيف Procedure ثإس Reset_comm ب Parameter اؽذ ػ. Number ثب زب يى ا G_comm ا Reset_comm األص ب ا ع public ر ه أل ر رؼشيف ف ا Specification إ شبء ا. Package Body : Or Replace إخزيبسيخ م ثىزبثز ب ؽز ز ى ػ ا رؼذي ف ا Backage Body ثذال ا م ثإصا ز ب ص ا زؼذي في ب. ا ال يز رؼشيف م ب ؽيش يز رؼشيف ف ا Specification : Subprogramme ا Procedure ا Function ثىزبثخ ا ى د ا خبص ث ف ا. Backage Body
حابغ ا زاي ا غابك : م داخ ا Package Body با شاء أ Subprogramme ح حؼشيف ا ف ا Specification ا يخ حؼشيف ا و ا ف ا زاي ا غابك. غ ظت : يغت ا يى إس ا Package ف ا غضء األ ي (Specification) فس األس ف ا غضء ا ضب (Body). ويف ي ى ئعخذػاء حشغي ا. Package ف ا ضبي ا سبثك ر ر فيز ا Package ػ عشيف فس ا سزخذ ا ا USER ا اس ا ؾض خ ا ال ص مغخ ص اس االعشاء ا ا ظيفخ. ا ز لب ثإ شبؤ ب. ف زا ا ضبي ر ر فيز ا Package ػ عشيك سزخذ اخش ض SCOTT ر ه ػ عشيك ؼ زا ا سزخذ ا Privilage ا ظالؽيخ ا بسجخ ى يز ى إسزخذا ز ا. Package ا
. Package Body بذ Package زاي : حؼشيف ف زا ا زاي ل ا بخؼشيف Global ا ع ا Variable با خا حى ز ا Package Specification داخ ا Variables لذ ل ا با شاء ا Package ا غابم حغخ ػ ض ػت ا Variables ز ا ر م با شاء ا Procedure ا خا يت ح ػظ ئ ىا يت ئعخخذا ا. Procedure داخ ا Package Variables حغخ ػ لي ئفخشاػيت. Removing Package عزف ا : Package ػشف ا عابما ا ا Package مغ ا صضئي )سأط ( Specification )صغ (Body ز ه ي ى ئصا ت ا ضغ Body بماء ا شأط Specification حؼ بذ ا ضغ ر ه ىائ اث ا خ يظ ا ػاللت ا شحبت با Body ز ا خغيشاث ا خ ا لي ئبخذائيت ا Exceptions ا Cursors ا ا األصشاءاث ا ذ اي فأ ا الحؼ ح خش خأ.
Body بشيمت أح احيىيت. غ ظت : ػ ذ عزف ا Package Specification يخ عزف ا ضايا اعخخذا ا : Package )1 )2 )3 )4 ي ى ه حض يغ بؼغ ا Subprogramme ا شحبت ببؼؼ ا ف Package اعذة. ي ى ػ ئخفاء ى د Information) (Hiding خالي ا Package ر ه ف ا ضضء ا. Private اداء افؼ. ا ش ء ػ يت ا ظيا عيذ حغ ػ يت ا ظيا ت بأعخخذا ا Backage ا ا غض.
ػ يت ا :Overloading رزيؼ ز ا ؼ يخ إسزخذا فس األس ؼذح Procedures ا Functions إخزالف ثي ز ا Subprogramme ف ػذد ا ا ؼ يخ وزبثخ رغ يش ا جشا ظ ث ش خ اوضش. CHAPTER 4 More Package Concepts داخ فس ا Package ز ا ؼ يخ رغ ت ا يى بن Parameters ا رشريج ا ا اع ثيب بر و ب س ف يز ششؽ رزيؼ ز الؽظ ا ز ا ؼ يخ الي ى ا رؾذس Procedures ا Functions خبسط ا. Package ز ا ؼ يخ ر ى ا جش ظ رؼشيف ػذح ثش غيبد خز فخ ث فس األس داخ فس ا Package. يز ا زفشيك ا زؼشف ػ ا Subprogramme ا شاد إسزخذا ث اسغخ األخزالف ف ػذد ا Parameters ا ع ا جيب ب بد ز ا Parameters ا رشريج. غ ظ : الرز ػ يخ ا Overloading ارا وب األخزالف فمظ ثي ا Parameters ف ع ا جيب بد ز ا جيب بد فس ا ؼبئ خ ض Decimal( ) Number, ب فس ػبئ خ ا ع ا شل ( char ) Varchar2, فس ػبئ خ ا ع ا ؾشف. ا يى األخزالف فمظ ف ا مي خ ا شعؼخ (Return) ر ه ف ا ذ اي ؽز وب ا اع ثيب بد ا شع ع ػبئالد خز فخ. ارا ؽذس بسجك الؽظبد يؾذس خغبء اليؾذس ػ يخ. Overloading زاي ػ ا : Overloading. ث زا ى لذ ا شأ ب. Package Specification ف ا ضبي ا سبثك لذ ا شبؤ ب Package ثذاخ ب اص ب Proceure ث فس األس زغجيك ا Overloading األخزالف ثي ا Proceduers ا : ا Procedure األ رأخز صالصخ. Parameters ا Procedure ا ضب يخ رأخز إص ب Parameter فمظ الغيش.
ثؼذ ر ه م ثإ شبء ا Package Body و ب ي : ا شى ا خا : يجي ويفيخ إسزذػبء ر فيز وال ا Proceduers ا سبثك رؼشيف ف ا Package Specification زيغخ ر فيز ب :
زاي اخش ػ ا :Overloading غ ظت: ؼظ ا ذ اي ا ذاخ يخ أل ساو غجك ث ب ف ا. Overloading ضبي ػ ر ه دا خ ا To_Char و ب ف ا ضبي ا سبثك ش ف ا ضبي ا سبثك اسثغ رؼشيفبد خز فخ فس ا ذا خ ث فس األس ر ه ف Package ثإس. Standard األ ث ب Parameter اؽذ ػ Date رشعغ. Varchar2 ا ضب يخ ث ب Parameter اؽذ ػ Number رشعغ. Varchar2 ا ضب ضخ ث ب إص ب Parameters األ ي ػ DATE ا ضب Varchar2 رشعغ. VARCHAR2 ا شاثؼ ث ب إص ب Parameters األ ي ػ Number ا ضب Varchar2 رشعغ. VARCHAR2 غ ظت : ارا ر ػ دا خ اخش ث فس األس ذ اي داخ يخ يز إسزجذاي ا ذ اي ا مذي خ ضغ ا ذ اي ا غذيذح ا ز ػ ب ا سزخذ ر ه ف ا ذ اي ا خبطخ ثب. Standard Package ئعخخذا ا Forward Declartions غ ظت : ػ ذ إسزخذا ا Function داخ ا Procedure ا رى ا Function لذ ر إ شبؤ ب رؼشيف ب لج ا Procedure رؼشيف ا ىبئ س اء زغيش ا Subprogramme لج األسزخذا. فيغت
فف ا ضبي ا سبثك الؽظ ػذ إ ىب يخ إسزخذا ا Procedure ا س Calc_rating ؽيش ل ب ثإسزخذا ا Procedure لج رؼشيف زا الي ى إسزخذا ف ا Pl\SQL ف ى ز ى إسزخذا ر ه ا Procedure الثذ رؼشيف ا ال ف ا غضء ا خبص ثب Declartion ص م ثؼذ ر ه ثإسزخذا ز ا Procedure ف ا غضء ا خبص ثب Body و ب ف ا ضبي ا زب : ف ا ضبي ا سبثك ر ؼب غخ ر ه ا شى خ ر ه ػ عشيك رؼشيف (Calc_Rating) Procedure ف ا غضء ا خبص ثب. Declration ز ا ؼ يخ رزيؼ رغ يغ اوضش Subprogramme شرجغخ ثجؼض ب ف Package اؽذح ثؾيش يز رؼشيف ف ا Specification ا خبص ثب Package وزبثخ ا ى د داخ ا Body ر ه يفيذ ف إخفبء رفبطي ا ى د ا صيبدح ا سشيخ. (security)
Mo7amed Reda Abd ElRahman ORACLE FINANCIAL CONSULTANT INSTRUCTOR ORACLE FINANCIAL R12 INSTRUCTOR ORACLE DEVELOPER ********************** Scientific Computing Center Mansoura University Email:mreda47@hotmail.com https://www.facebook.com/eng.mohamedreda.scc Mobile: 01066734381