Professional Documents
Culture Documents
Introduction To PL/SQL
Index
Fundamental (I)
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أٛاع اخش ٜوضيش ح .
سٛف ٔسزخذَ اٌغًّ اٌششعيخ )ٚ (If Statementعًّ اٌزىشاس ) ٝ٘ٚ (Loopرسزخذَ ٌزىشاس عٍّٗ ِؼيٕٗ ػذد ِشاد ِؼيٕٗ .
سٛف ٔم َٛثىزبثخ اٌىٛد ِشح ٚاؽذح ٌٚىٕٕب ٔسزغيغ رٕفيزح اوضش ِٓ ِشح .
: ٗظٛ ٍِغ
. End ٚ Begin ِٓ ً األلٍٝ ػBlock ْ اٌــٛ يزى
العظ اْ أٛاع اٌــ Blocksفٌ ٝغت اٌـــ PL / SQLيّىٓ اْ حىِٕ ْٛفظٍت وٍياً اِ ٚخذاخٍٗ ِغ بؼؼٙا اٌبؼغ
)ٚ (Nested Blocksحٕمغُ ٘زٖ اٌىخً اٌ ٝلغّيٓ :
Blocks
Blocks Types
: ِزاي
111 ُظف سلٌّٛاعخخشس اعُ ا
Declare
V_fname varchar2 (20);
Begin
Select First_name into V_fname
From employees
Where employee_id = 100 ;
End ;
Procedure هىPUT_LINE والــDBMS_OUTPUT.PUT_ LINE بعذ تهيئة البزًبهح ًقىم بكتببة خولة الطببعه وهى
. 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 ;
CHAPTER 2
Declaring PL/SQL Variables
Variables اٌّخغيشاث
ٔغخـيغ ئعخخذاَ اٌــٚ ليّٗ ِؼيٕٗ حخضيٓ ِإلجَٚ فيٗ بخخضيٓ بياْ ِؼيٓ اٛ ٔمٜسّٛ اٌّيٝ ِىاْ فٛ٘ : Variable اٌـ-
. ايؼاً ٔغخـيغ ئٍعخخذاِٗ اوزش ِٓ ِشةٚ Database اٌــٝدة فٛصٌّٛ اٌميُ اٍٝاألػافت ػٚ ً ٌٍخؼذيVariables
: Variables اػذ اٌؼاِٗ ٌخغّيت اٌـــٛ اٌم
أْ يبذأ بغشفٚ البذ
ػالِاثٚ َأسلاٚ فٚ عشٍٝع ػٛ ِٓ اٌّّىٓ اْ يغخ
عشف31 ٓ يضب اال يضيذ ػ
غيشّ٘اٚ( اSelect , Insert) ًصة ِزٛساوً اٌّغضْٚ وٍّت ِٓ وٍّاث اٛ اال يى
: ظتٛ ٍِغ
. (Declare) اٌضضء اٌخاص بــٜ اDeclarative Section ٝ فVarables َ بخؼشيف اٌــٛ ٔم
ٝا فٍٙٔغخـيغ حبذيٚ Declare اٌــٝ ليُ ئفخشاػيت فVariables ِٓ اٌّّىٓ ئػـاء اٌــ
. Begin اٌضضء اٌخاص بــExecutable Section اٌـ
Example
DECLARE
Variable Name Datatype ;
V_hire Date;
V_deptno Number Not Null := 10 ; Null ٍٝ ػٜٛيضب اْ ال يغخ
V_location Varchar2(13) := 'Mansoura' ;
V_comm Constant Number := 1400 ; ٘زٖ اٌميّت رابخت الحخغيش
Example ( I )
DECLARE
V_Name Varchar2(20) ;
BEGIN DBMS_OUTPUT.PUT_LINE ('My name is: '|| V_Name );
فمؾMy Name Is : وٍّتٜٛء عٝ ٘زٖ اٌغاٌٗ ٌٓ يـبغ شٝف
V_Name := 'Mo7amed Reda';
DBMS_OUTPUT.PUT_LINE('My name is: '||V_Name);
My Name Is: Mo7amed Reda ٘زٖ اٌغاٌٗ عيـبغ وٍّتٝف
END ;
Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381
PL/SQL Course
Example ( II )
DECLARE
V_Name Varchar2(20) := 'Mo7amed';
BEGIN
V_Name := ' reda ';
DBMS_OUTPUT.PUT_LINE('My name is: '||V_Name);
END ;
ٌٓىٚ Executable Section اٌــٝا ليّت أيؼاً فٙبٚ Declarative Section اٌــٝا ليّٗ فٙ بVariable ٘زٖ اٌغاٌت اٌــٝف
Executable Section دة اٌــٛصٌّٛدة باٌّخغيش عخـبغ اٌميّت اٛصٌَّٛ بـباػت اٌميّٗ اٛػٕذِا ٔم
. My name is : reda ْٗ ٔاحش اٌـباػٛ اٌخٕفيز ٌزٌه عيىٝا األعك فٙٔأل
PL/SQL variables:
Scalar اٌّفشدة .
Composite اٌّشوبت. (CH6)
Reference اٙ اٌّشاس ب.
Large object (LOB) راث األعضاَ اٌىبيشة.
Non-PL/SQL variables:
Host
Bind
: PL / SQL الً اٌّخغيشاث اٌخاطت باٌـــٚ ا
: ظتٍِٛغ
. يغٍّتٜ اٌبياْ اٌزٍٝ باعُ يذي ػVariable ِٓ األفؼً حغّيت اٌـ
. Column ُ ئعٍٝ ػVariable ِٓ األفؼً ػذَ حغّيت اٌــ
. Declarative Section اٌـٝ البذ ِٓ ئػـائت ليُ ئفخشاػيت فNot Null ٚ اConstant ْٛ يىٜ اٌزVariable اٌـ
وخابت وٍّتٚ اAssignment Operator (:=) ًّ ليّت ئفخشاػيت ػٓ ؿشيك ػVariable ٔغخـيغ ئػـاء اٌـ
: ٍٝ وّا يDefault
V_Name Varchar2(20) := 'Mo7amed Reda' ;
V_Name Varchar2(20) Default 'Mo7amed Reda' ;
ِٓ األفؼً حؼشيف وً Variableػٍ ٝعـش عخ ٝيغ ًٙػٍيٕا ػٍّيت اٌمشاءة ٚأيؼاً ِؼاٌضت األخـاء ٚعٌٛٙت اٌٛطٛي
اٌيٙا.
عٛف ٔخٕاٚي ف٘ ٝزا اٌــ Chapterإٌٛع األٚي ٛ٘ٚاٌـــ Scalarاٌـــ ٚ PL/SQL Variablesعٛف ٔخٕاٚي إٌٛع
األخيش اٌخاص باٌــ . Non Pl/sql Varciables
Declare
v_job varchar2 (15); عشف15 راث عؼتِٝخغيش عشف
v_count binary-integer := 0; طغيظ يأخز ليّت ئبخذائيت طفشِّٝخغيش سل
v_total_sal number (7.2) := 3.17; ُٜ ارٕاْ وغش ػششِٕٙ ِٓ عبغ خأاثِّٝخغيش سل
v_order_date date:= sysdate +7 ; َع اٌمادٛ األعبٝ يبذأ فِِٕٝخغيش ص
C-TAX-RATIO CONSTANT NUMBER (4.2) :=17.25;
17.25 يأخز ليّت افخشاػيتٚ ُٜ خأاحاْ وغش ػششِٕٙ ْ ِٓ اسبغ خأاثٛ ِىِّٝخغيش رابج سل
V_Flag Boolean Not Null :=True ;
. true يأخز ليّت ئفخشاػيتٚ Null “ اليأخز ليّت فاسغتBoolean” ِٝخغيش ِٕـم
%TYPE Attribute
. Column اٌخاص باٌـLength اٌـٚ Data type ا حأخز ٔفظ اٌـٙٔا اٌٙىٓ اٌّيضة بٚ Data type ٝ٘
DECLARE
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;
: ظتٍِٛغ
ْ ِزالً فاLength اٌــٝي فٚ اٌضذٝ حؼذيً فٚ حغييش اٜ عيذ أٗ ػٕذ ػًّ اBasic Scalar ع افؼً ِٓ اٌــٌٕٛ ٘زا ا
. يٚ يخغيش حٍمائياً بخغييش اٌضذVariable اٌـ
. (true , false , null ) ٝ٘ Boolean اٙد بٛ حؼٝ اٌميُ اٌخ
Bind Variables
: ظتٍِٛغ
. Host Variable ّٝحغٚ Block ٌيظ داخً اٌــٚ Session ع ِٓ اٌّخغيشاث يخُ ئٔشاؤة داخً اٌـٌٕٛ ٘زا ا
. Pl/Sql اٌــٚ Sql اٌــٝحغخخذَ أيؼاً فٚ Variable ا وٍّتٍٙػغ لبٛ ي
: ٌْٝ شىٍت واٌخاٛ يىSemi Colon (;) ػغ بؼذةٛ اليBind Variable ػٕذ وخابت
Variable Variable Name Datatype
:Variable Name ٍٝ وّا يColon ( : ) ٍٗئعخذػائت البذ اْ ٔؼغ لبٚ ػٕذ إٌذاء ػٍيت
. Bind Variable ٔغخـيغ ئعخخذاَ صٍّت اٌـباػٗ اٌؼاديت ِغ اٌــ
Select Last_Name
From Employees
Where Salary = :V_Sal ;
. Set Autoprint On ّٝحغٚ ًِاحيىياٛ اٌـباػت احٝ حغخخذَ فٝ٘ٚ Bind Variable ٕ٘ان صٍّت الحؼًّ اال ِغ اٌــ
CHAPTER 3
Writing Executable Statements
Nested Blocks
: ظتٍِٛغ
. ٍٝن اٌذاخٍٛ اٌبٜ اليشٝن اٌخاسصٍٛ اْ اٌبٜاٌؼىظ غيش طغيظ اٚ ٗيإرش فيٚ ٝن اٌخاسصٍٛ اٌبٜ يشٍٝن اٌذاخٍٛ اٌب
Example
DECLARE
V_Father_Name Varchar2(20) := 'reda';
V_Date_of_Birth Date :='04-Apr-1965' ;
BEGIN
DECLARE
V_Child_Name Varchar2(20) := 'mohamed' ;
V_Date_of_Birth Date := '04-Dec-1985';
BEGIN
DBMS_OUTPUT.PUT_LINE( V_Father_Name ) ; ==== >>> reda
DBMS_OUTPUT.PUT_LINE( V_Date_of_Birth ); ==== >>> 04-Dec-1985
DBMS_OUTPUT.PUT_LINE( V_Child_Name ); ==== >>> mohamed
END;
DBMS_OUTPUT.PUT_LINE( V_Date_of_Birth ); ==== >>> 04-Apr-1965
END;
: ظتٍِٛغ
ِٓ ٌىٓ البذٚ ٗن اٌّشاد إٌذاء ػٍيٍٛ ٔخّىٓ ِٓ حغذيذ اٌبٝ ئعُ ٔشيذة عخٜحغّيخٗ بأٚ نٍٛ ٌٍبQualifier ًّ ٔغخـيغ ػ
. << >> ٓػؼٗ بيٚ
يتٌٛٚن اٌظغيش فاألٍٛلّٕا بإٌذاء ػٍيٗ ِٓ داخً اٌبٚ ن اٌظغيشٍٛ اٌبٝن اٌىبيش ٌٗ ٔفظ األعُ فٍٛ اٌبٝ ٕ٘ان ِخغيش فٌٛ
. ن اٌظغيشٍٛ اٌبٝد فٛصٌٌٍّّٛخغيش ا
Operators in PL/SQL
Logical
Arithmetic Same in SQL
Concatenation
Parentheses to control order of operations
Qualify an Identifier
Example ( I )
<< scc >>
DECLARE
V_Father_Name Varchar2(20) := 'reda';
V_Date_of_Birth Date :='04-Apr-1965' ;
BEGIN
DECLARE
V_Child_Name Varchar2(20) := 'mohamed' ;
V_Date_of_Birth Date := '04-Dec-1985';
BEGIN
DBMS_OUTPUT.PUT_LINE( V_Father_Name ) ; ==== >>> reda
Example ( II )
<< scc >>
DECLARE
V_Sal Number(7,2) := 60000 ;
V_Comm Number(7,2) := V_Sal * 0.20;
V_Message Varchar2(255) := ' eligible for commission' ;
BEGIN
DECLARE
V_Sal Number(7,2) := 50000 ;
V_Comm Number(7,2) := 0 ;
V_Total Number(7,2) := V_Sal + V_Comm ;
BEGIN
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)
END;
V_Message := 'SALESMAN'||v_message;
DBMS_OUTPUT.PUT_LINE ( V_Message ); (3)
END;
CHAPTER 4
Interacting with the Oracle Server
Inserting Data
BEGIN
INSERT into Departments
Values (280 , 'Reda_Dept', 100 , 1700);
END;
*****************************************
Updating Data
DECLARE
Sal_Increase Employees. Salary%Type := 800 ;
BEGIN
UPDATE Employees
Set Salary = Salary + Sal_Increase
Where Job_id = 'ST_CLERK';
END;
*****************************************
Deleting Data
DECLARE
Deptno Employees.Department_id%Type: = 280;
BEGIN
DELETE From Employees
Where Department_id = Deptno;
END;
-----------------------------------------------------------------------------------
SQL Cursor
IMPLICIT EXPLICIT
ٝ اٌخٝ٘ ًساوٚ اْ اٜ إّٝع اٌؼٌٕٛ ِٓ اٛ٘ ٌتٚف ٔخٕاٛعٚ ٍَّٗ بؼٛ يمٜ اٌزٛ٘ اٌّبشِش
ٗيؼًّ حٍمائياً بّضشد إٌذاء ػٍيٚ ٍّٗلاِج بؼ Chapter (7) ٝباٌخفظيً ف
: ظتٍِٛغ
ب اٌجيبٔبد اٌمبدِخ ِٓ اٌــٙرضغ ثٚ SQL ِبريىي ًب ِغ وً عٍّخٛيض٘ب ارٙساوً ثزغَٚ اٛ اٌشاَ رمٝ يؼزجش ِسبؽخ فCursor اٌــ
. SQL
SQL%NOTFOUND False َ ثإسزشعبعٛعذ ثيبٔبد يمٚ ٌٛٚ True َ ثإسزشعبعٛ ٌُ يغذ ثيبٔبد يمٌٛ
SQL%ROWCOUNT ٜسّٛ اٌّيٝ رأصشد ثبٌؼٍّيخ فٝف اٌزَٛ ثإسزشعبع ػذد اٌظفٛيم
ظف ؟ٌّٛصذ ٘زا اٚ ْ حأرشث باٌؼٍّيت اٝف اٌخِٛٓ رُ اؿبغ ػذد اٌظفٚ 206 ُظف سلّٛ ٌ لُ بّغظ ا
DECLARE
V_Rows_Deleted Varchar2(30) ;
V_Empno Employees.Employee_id%Type := 206;
BEGIN
Delete From Employees
Where Employee_id = V_Empno ;
V_Rows_Deleted := (SQL%Rowcount || ' row deleted.');
DBMS_OUTPUT.PUT_LINE (V_Rows_Deleted );
END;
؟31111 ٝصذ اٌّشحب األحٚ ٛٔ ا111 ُظف سلٌّٛ لُ باػـاء ا
DECLARE
V_Name Varchar2 (20);
BEGIN
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;
END;
: ظتٍِٛغ
. ءٝ ثشٝاْ ٌُ يغذ فٍُ يأرٚ ّٗ ثإسٝعذ سيأرٚ ٍٛزا اٌشلُ اَ ال فٙظف ثِٛ عذٛ ٔؼشف ً٘ يٝ ؽزSelect ٌمذ لّٕب ثؼًّ عٍّخ
ٌُ ْاٚ ًَ ثزٕفيز ػٍّيخ اٌزؼذيٛف رمٛعذد فسٚ ْعذد ثيبٔبد اَ ال فإٚ ً٘ SQL اٌــٌٝ فزٕظش اSQL%FOUND اِب اٌــ
. ءٝرغذ فٍٓ رفؼً ش
CHAPTER 5
Writing Control Structures
IF Statement
DECLARE
V_Myage Number:=30;
BEGIN
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;
END;
Example
DECLARE
V_Myage Number:=30;
BEGIN
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;
END;
: ظتٍِٛغ
ار رؾمك يزُ رٕفيزٚ ٝٔ اٌششط اٌضبٌٝء اٛي يزُ اٌٍغٚارا ٌُ يزؾمك اٌششط األٚ Then ثؼذٜي يزُ رٕفيز األِش اٌزٚ رؾمك اٌششط األٌٛ ) 1
. Else ثؼذٜ يزُ رٕفيز األِش اٌزnull بٍٙط وٚإرا وبٔذ اٌششٚ then ثؼذٜاألِش اٌز
CASE Expressions
DECLARE
V_Grade Char(1) := Upper('&Grade');
Appraisal Varchar2 (20);
BEGIN
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);
END;
Handling Nulls
: ظتٍِٛغ
. Null إٌبرظ يظجؼNull بٙ فيٌٛ اٌّمبسٔبد اٌجسيغخ
. Null إٌبرظ يظجؼNull ِغNot ضؼٕبٚ ٌٛ
. True اٌـٛ٘ األضؼفٚ False اٌــٛ٘ ٜٛ األلAnd ِغ
. False اٌـٛ٘ األضؼفٚ True اٌــٛ٘ ٜٛ األلOr ِغ
LOOP Statements
Basic Loop
Syntax
Loop
Statement;
Exit [When Condition];
End Loop;
---------------------------
؟Basic Loop الغ باعخخذاَ اٌــِٛ 3 لُ باػافت
DECLARE
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';
BEGIN
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;
END;
: ظتٍِٛغ
يّضً ػذدٜ ثّضبثخ ػذاد اٌزٛ٘ ػشفذ ِزغيشٝٔٛبيخ ؟ ثبٌغجغ ال ػٍشبْ وذٖ ٘زاللٙٔ ِبالٌٝ رؼًّ اLoop ً٘ سزظً اٌــ
يخشط ارا فبٌـٚ ةٍٛ اٌؾذ اٌّغٌٝ يظً اٝ ٘زا اٌؼذاد ؽزٍٝاؽذ ػٚ سح ٔضيفٚ وً دٝفٚ Loop ب اٌــَٙ ثٛ رمٝساد اٌزٚاٌذ
. ٖ ػٕذLoop ػٍّيخ اٌــٕٝٙٔ ْٝ ثّضبثخ ػذاد ؽزٛ الثذ ِٓ ػًّ ِزغيش ٌٗ يىBasic Loop
فٛسٚ بيخٙٔ ِبالٌٝ رؼًّ اLoop ف رظً اٌـٛ فسLoop ط ِٓ اٌــٚ ششط ٌٍخشExit When Condition ارا ٌُ ٔؾذد
Numeric or Value Error :Number <== .Error ش ٘زا اٌـٙيظٚ ٕيظٙ ػٓ اٌؼًّ ثسجت اٌزDatabase لف اٌـٛرز
Precision too Large
ً األلٍٝاؽذح ػٚ ف رٕفز ِشحٛ سBasic Loop فبْ اٌــExit When Counter <1 ٌٝفشضٕب إٔب لّٕب ثؼًّ اٌششط اٌزب
. Condition اٌـٍٝس ػٚالً لجً اٌّشٚ رٕفز اStatement رٌه ألْ اٌــٚ Loop سغُ اْ اٌششط يخبٌف اٌــ
While Loop
Syntax
While Condition Loop
Statement;
End Loop;
؟WHILE Loop الغ باعخخذاَ اٌـــِٛ 3 لُ باػافت
DECLARE
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';
BEGIN
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;
END;
: ظتٍِٛغ
Loop َ ثؼًّ اٌــٛ فإرا رؾمك رمStatement لجً رٕفيز اٌــCondition اٌـٍٝالً ػٚ اCheck ًَّ ثؼٛ رمWhile Loop اٌــ
.ًّ رؼLoop ف رظً اٌـٛ سCondition وٍّب رؾمك اٌــٚ Basic Loop ثؼىس اٌـLoop ارا ٌُ يزؾمك ٌٓ رؼًّ اٌـٚ
For Loop
Syntax
For Counter in [Reverse] lower-Bound .. Upper-Bound Loop
Statement;
End Loop;
: ظتٍِٛغ
. َ ثزسّيزٗ فمظٌٛىٕٕب ٔمٚ ًِبريىيبٛساوً ثؼٍّٗ ارَٚ اٛب ثً رمٌٙ ػًّ ػذادٌٝ الرؾزبط اFor Loop اٌــ
ًزا اٌشىَٙ ثىزبثخ اٌغٍّخ ثٛ فبٕٔب ٔم11 .... 1 ِٓ َ ِضالً اسدٔب عجبػخ األسلبٍٛ ف
For I in 1 .. 10 Loop DBMS_OUTPUT.PUT_LINE ( I );
For I in 1 .. 10 : ٌَٝ وزبثخ اٌغٍّخ ثبٌشىً اٌزبٛ فبٔٓ ٔم1 ُ اٌشلٝ ؽز11 ُ ِٓ اٌشلٝ اسدٔب عجبػخ األسلبَ ثشىً ػىسٌٛٚ
Reverse Loop DBMS_OUTPUT.PUT_LINE (I);
. (1) ٝ٘ بٙالً ليّٗ يغت اْ ٔجذأ ثٚ ثذايخ اٌؼذادٝ فNull َالٔسزغيغ اسزخذا
. ٔفس اٌغٍّخّٝب فٙ داخً ثؼضLoop ِٓ ٔسزغيغ اسزخذاَ اوضش
CHAPTER 6
Working with Composite
Data Types
b. Nested table.
c. Varray.
PL/SQL Records
Records
: ظتٍِٛغ
: ظتٍِٛغ
لذ لّٕبٚ ٖ ٘زDatatype وإٔٔب لّٕب ثؼًّ ِزغيشاْ داخً اٌـٚ Two Fields ٍٝ ػٜٛرؾزٚ Datatype ًّ إٔب لذ لّٕب ثؼٜ ٔش
.ً إسّبDatatype ثإػغبء ٘زٖ اٌـ
%ROWTYPE Attribute
Syntax
Variable_Name Table_Name%Rowtype ;
فإٕٔب سٕؾزبطScalar اٌـٝ٘ٚ اسزخذِٕب اٌغشيمخ اٌؼبديخٍٛي فٚ اسدٔب اسزخشاط عّيغ أػّذح اٌغذٌٛ %Rowtype ٔسزخذَ اٌــ
يٚ ثؼذد أػّذح اٌغذFields رؼشيفٌٝف ٔؾزبط اٛ فإٕٔب سRecord ًّ لّٕب ثؼٌٛٚ يٚ رؼشيف ِزغيشاد ثؼذد أػّذح اٌغذٌٝا
. %Rowtype ٘زا سجت إسزخذاَ خبطيخٚ ًأيضب
ِشحبت ؟ٚ لُ بـباػت ئعّتٚ 111 ُظف سلٌّٛ ئعخخشس صّيغ بيأاث ا
Exampl (I)
DECLARE
V_Rec Employees%Rowtype ;
BEGIN
Select * into V_Rec
From Employees
Where Employee_Id = 100 ;
DBMS_OUTPUT.PUT_LINE ( V_Rec.Last_Name || ' ' || V_Rec.Salary);
END;
Exampl (II)
DECLARE
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 ;
BEGIN
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_S al) );
END;
PL/SQL collections
INDEX BY Tables
ْيفضً اٚ Primary Key ْٛي ثيىٚد األّٛديٓ اٌؼّْٛ ِٓ ػٛ يزىٛ٘ٚ بٍَّٙ ثؼٛ ٔمٝ اٌزDatatype اع اٌـٛٔع ِٓ أٛٔ ٝ٘
. Composite ٚ اScalar ْٛ اِب اْ يىٝٔد اٌضبّٛاٌؼٚ ع اٌجيبٔبد ثٗ سلّيخٛٔ ْٛرى
Syntax
TYPE Type_Name Is Table Of ( Column_type | Table.Column%Type | Table%Rowtype )
INDEX BY (Datatype );
Variable_Name Type_Name;
: ظتٍِٛغ
Examples(I)
DECLARE
Type T_Name_Table Is Table Of Employees.Last_name%Type
Index By Number;
V_Name T_Name_Table;
BEGIN
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 , '1-JAN-2010' ,‟SA_REP‟ , „Dev_Habib@Yahoo.com‟ );
END;
Examples(II)
DECLARE
TYPE Emp_Table_Type Is Table Of Employees%Rowtype
INDEX BY PLS_INTEGER;
V_Emp Emp_Table_Type;
V_Max_Count Number := 104;
BEGIN
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;
END;
CHAPTER 7
Using Explicit Cursors
Syntax
DECLARE
Cursor Cursor_Name is Select_Statement;
BEGIN
Open Cursor_Name ;
Fetch Cursor_Name Into Variables ;
Close Cursor_Name ;
END;
ً بذالRecord باٌخغذيذ باعخخذاَ اٌـٚ Composite عٌٌٕٛىٓ باعخخذاَ ِخغيشاث ِٓ اٚ لُ بغً اٌّزاي اٌغابك
؟Scalar ِٓ اٌّخغيشاث اٌــ
DECLARE
Cursor Emp_Cursor is Select Employee_Id , Last_Name
From Employees
Where Department_Id = 30 ;
V_Rec Emp_Cursor %Rowtype ;
BEGIN
Open Emp_Cursor ;
LOOP
Fetch Emp_Cursor into V_Rec;
Exit When Emp_Cursor %Notfound ;
DBMS_OUTPUT.PUT_LINE ( V_Rec.Employee_Id || „ ‟ ||V_Rec.Last_Name );
End Loop ;
Close Emp_Cursor ;
END;
: ٗظٍِٛغ
Cursor ب ِٓ اٌـٙ صُ لّٕب ثإسزذػبئDatabase ٔشيذ٘ب ِٓ اٌــــٝضؼٕب ثٗ وً اٌجيبٔبد اٌزٚٚ Cursor ٌمذ لّٕب ثؼًّ اٌـ -
. Cursor اٌــٚ اVariable اء اٌـٛ سٜسّٛ اٌّيٝثسشػٗ ألْ األصٕبْ فٚ اٌّزغيشٌٝا
Example
DECLARE
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) ;
BEGIN
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 ;
END;
: ظتٍِٛغ
ٌىٓ رٌهٚ ٜ ثجيبٔبد اخشٜ ِشح اخشCursor ْ لذ لّٕب ثزغييش اٌجيبٔبد اوضش ِٓ ِشح ػٓ عشيك فزؼ اٌــٛزا اٌشىً ٔىٙث -
٘زٖ اٌّشىٍخ ٔسزخذَ اٌخبطيخٌٍٍٝزغٍت ػٚ ًػ ثبٌفؼٛ أٗ ِفزError ش ٌٕبٙاال سيظٚ ُ اٌمذيCursor يزغٍت ِٕب غٍك اٌــ
. Cursor_Name%Isopen
CHAPTER 8
Handling Exceptions
ب يزُ اٌزؼبًِ ِغٙفيٚ ب ِشؽٍخ ٘بِخٌٕٙىٚ بٕٙ ِشؽٍخ إخزيبسيخ ٔسغزيغ األسزغٕبء ػٝ٘ وّب روشٔب ِٓ لجً اْ ٘زٖ اٌّشؽٍخ -
ب ؽيش اْ األخغبءٙلشأرٚ بّٙٙس يسزغيغ فٛبس٘ب ٌٗ ثظٙإظٚ بِٙؼبٌغزٚ ٝبئٌٕٙش ٌٍّسزخذَ اٙ ِّىٓ اْ رظٝاألخغبء اٌز
. سح ثسيغخٛش٘ب ٌٗ ثظٙب ٌزٌه ٔظّٙٙ فٝبئٌٕٙساوً اليسزغيغ اٌّسزخذَ اٚش ِٓ اٙ رظٝاٌز
Example
DECLARE
V_Name Varchar2(20);
BEGIN
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‟);
END;
: ظتٍِٛغ
Syntax Exception
EXCEPTION
When Exception1 [Or Exception2] Then Statement ;
[When ………………………………………. Then Statement ; ]
[When Others
ٌىٓ ِغ وزبثخ اٌــٚ اْ ٕ٘بن اوضش ِٓ شخضError شٙف يظٛ فإٔٗ سKing ّٝظف يسِٛ ِٓ عذ اوضشٚ ٌٛ -
21 ِٓ اٌّشب٘يش ِٓ اٌـError ٘زا اٌــٚ وزجٕب٘بٍٝش اٌشسبٌخ اٌزٙ فسزظException
لّٕب ثىزبثخ ٘زٖ اٌغٍّخٌٛ -
Select Last_Name From employees Where salary = 2542184518 ;
ظف يأخز ٘زا اٌّشرتِٛ عذٛ ألٔٗ اليNo Data Found <== Error ش ٌٕب٘زا اٌــٙف يظٛفإٔٗ س
DECLARE
V_Name Varchar2(20);
V_Sal Number;
BEGIN
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);
END;
: ظتٍِٛغ
ّب عبءاٙٔ ألV_name ال اٌـٚ V_sal َ ثغجبػخ اٌــٌٛٓ يمٚ زا اٌّشرتٙظف ثِٛ عذٛش أٗ اليٙف يظٛسح سٛزٖ اٌظٙث -
فٛ فإٔٗ سSelect اٌـٍٝاألسُ اػٚ ضؼٕب عٍّخ اٌغجبػٗ اٌّشرتٚ ٌٛ اِبError اٌــٍٝ ػٜٛ رؾزٝ اٌزSelect ثؼذ عٍّخ
. Null َ ثغجبػخٛرم
ُٙ ِخؼاٌشف ػٍيError 21 اٙٔوّا لٍٕا ِٓ لبً اٚ سةٛٙاٌّشٚ اٙ اٌّخؼاسف ػٍيErrors َ األْ بؼشع اٌـٛف ٔمٛعٚ
: ُٝ٘ واألحٚ
ً داخNull ضغ ليّخٚ ي إٔب الٔسزغيغٛسسبٌزٗ رمٚ 11411- سلّخٛ٘ٚ Error شٙثبٌغجغ سيظ -
ُ شيئبً ٌزٌهٙ٘زا اٌشلُ ٌٓ يفٚ شد ٌٗ ٘زٖ اٌشسبٌخٙ ظٌٛ ٝبئٌٕٙ ٌىٓ اٌّسزخذَ اNot Null دّٛػ
. بّٙٙشٌٗ سسبٌٗ يسزغيغ فٙف ٔظٛس
Example
DECLARE
V_Error Exception;
Pragma Exception_init (V_Error , -01400);
BEGIN
Insert into Departments (Department_Id , Department_Name)
Values ( Null , 'Mo7amed Reda');
EXCEPTION
When V_Error Then
DBMS_OUTPUT.PUT_LINE ('دّٛػغ ليّت داخً اٌؼٚ ِٓ ; )'البذ
END;
Raise Raise_Application_Error
ٌُٚ ًد ٌُ يغجك فؼٍيبٌٛىٓ اٌىٚ PL/SQL Procedural Successfully ش ٌٕبٙعذ ِشىٍخ ألٔٗ يظٛ٘زٖ اٌّشح الر -
ب ٔغؾذ فؼٓ عشيكٙٔش اٙضؼ اْ اٌؼؼٍّيخ ٌُ رزُ يظٛ يError ش ٌٕبٌٙىٕٗ ثذالً ِٓ اْ يظٚ ةٍٛ رٕفيز اٌّغٝيٕغؼ ف
. ُضؼ اْ اٌؼٍّيخ ٌُ رزٛبس سسبٌخ رٙ اظٍٝة ِٕٗ فإٕٔب ٔغجشح ػٍٛد اٌّغٛٔسزغيغ ارا ٌُ يٕفز اٌى Raise َاسزخذا
Raise )1
Example
DECLARE
V_Error Exception ;
BEGIN
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 ('ُزا اٌشلٙظف بِٛ صذٛ;)' ال ي
END;
ظفِٛ دٛعٚ َ٘زا عجؼبً ٌُ يؾذس ٌؼذٚ ش ٌٕب سسبٌٗ ا ٔٗ رّذ ػٍّيخ اٌزؾذيش ثٕغبػٙ ٌىبْ ظRaise َ ٌُ ٔسزخذٌٛ -
. ُزا اٌشلٙث
فإرا وٕب وزجٕبٜسّٛ رأصشد ثبٌؼٍّيخ ِٓ خالي اٌّيٝف اٌزَٛ ثبٌمشاءح ػذد اٌظفٛ == < رم%ROWCOUNT -
ِٓ ٌٍؼٍّيبدSave ًَّ ثؼٛ رمCommit ْرٌه ألًٌٚٓ يغجغ شيئبٚ شٙ فإٔٗ ٌٓ يظDBMS ً لجCommit
. ٜسّٛ اٌّيٝ ِب فٝرّؾٚ Database اٌـٌٝ اٜسّٛاٌّي
Raise_Application_Error )2
ٌٗ ًساوٚ اError ً طشيؼ ِضError سُٛٙ ٌىٓ اٌّجشِظ ِٓ خالٌٗ يسزغيغ ظٙ ال اليٚ اError ٘زٖ اٌّشح ٕ٘بنٝف -
َػٗ ِٓ األسلبّٛع ِغٛساوً ثٌٚمذ لبِذ اٚ ًساوَٚ ثأسزخذاَ اسلبَ خبطخ ثبِٛٓ اٌّّىٓ اْ ٔمٚ سسبٌخٚ ُسل
ٖزَٙ ثٛ ٔمٝ ؽزRaise_Application_Error َٔسزخذٚ 21222 ٝ ؽز21111 ِٓ رجذأٝ٘ٚ بِٙٔسزغيغ اسزخذا
Executable ِٕغمخ اٌـٚ اException Section ّ٘ب اِب ِٕغمخ اٌــٚ ٓٔسزغيغ اْ ٔفؼً رٌه ثّىبٔيٚ اٌؼٍّيخ
. Section .
- Executable Section
BEGIN
Delete From Employees
Where Employee_Id = 123456;
IF SQL%Found Then
DBMS_OUTPUT.PUT_LINE (SQL%Rowcount );
Elsif SQL%Notfound Then
Raise_Application_Error (-20001, „;)‟ الرقم بهذا مىظف يىجد ال
End IF;
END;
- Exception Section
DECLARE
V_Name Varchar2(20);
BEGIN
Select Last_Name into V_Name
From Employees
Where Employee_Id = 123456;
EXCEPTION
When No_Data_Found Then
Raise_Application_Error (-20002, „صذ الٛظف يِٛ زاٙ;)‟ اٌشلُ ب
END;
PLSQL
Program Units
CHAPTER 1
Creating Stored Procedures
ِغ إخزالف ثسيظAnonymous ن اٌــٍٛيٕٗ شجيٗ ثبٌجٛرىٚ Subprogram يؼزجبس اؽذ افشاد ػبئٍخ اٌـٚ وبدٍٛاع اٌجٛٔع ِٓ اٛٔ ٛ٘ -
وّبٝاٌجبلٚ Variables رؼشيفٌٝ ٌُ ٔضغش اٌٛ ٝ ؽزAs ٚ اIs ِٕٗ ًٔسزخذَ ثذالٚ Declare الٔسزخذَ اٌــProcedure ِغ اٌــ
Database اٌــٝإٌذاء ػٍيٗ اوضش ِٓ ِشحألٔٗ ِخضْ فٚ ٔسزغيغ رٕفيزحٚ اؽذحٚ د ِش حَٛ ثىزبثخ اٌىٛ إٔب ٔمProcedure ِيضح اٌــٚ ٛ٘
... الٚد ثميّخ اٛ أٗ ِّىٓ اْ يؼٜ ا... ٕٗد ٘زا األعشاء ثميّخ ِؼيٛ اْ يؼٜسٌٚىٕٗ ٌيس ِٓ اٌضشٚ
Syntax
Create [ or Replace ] Procedure Procedure_Name
[ (Parameter1 [Mode1] Datatype1, Parameter2 [Mode2] Datatype2, . . .) ]
Is | As
Variables;
BEGIN
END [Procedure_Name];
: ظتٍِٛغ
. Procedure اٌـٍَٝ ثإسزخذاَ وٍّخ ٌٍزؼذيً ػٛ ٔم-
. الٚ اParameters رسزغيغ اْ رأخزProcedure اٌــ-
ٌيس ثٗ أخغبءSyntax ُ فإرا وبْ اٌـٙ ػٍيCheck ًَّ ثؼٛ يمCompiler فإْ اٌـFunction اٌــٚ اProcedure ػٕذ ػًّ اٌــ-
Warning: ش ٘زٖ اٌشسبٌخٙف رظٛ فسError ارا وبْ ٕ٘بنٚ Procedure Created يٛش سسبٌخ رمٙفإٔٗ رظ
. Function Created with Compilation Error
. Show Errors َ ثىزبثخٛد ٔمٛعٌّٛ ٌّؼشفخ اٌخغأ ا-
- BEGIN
Add_Dept ;
END;
: ظتٍِٛغ
. ًسِض ِغخمبالٛ اٌفٝ ال حؼًّ فٌٝٚ يفؼً ئعخخذاَ اٌـشيمت اٌزأيت ألْ اٌـشيمت األ-
Parameters
ثؼذ إسُ اٌـParameter َ ثزؼشيف اٌــٛٔمٚ َ ثؾًّ اٌميّخٛب اِب اٌّزغيش فيمٌٍٙىٕٗ رّشس اٌميّخ فمظ داخٚ ٗ ثبٌّزغيشادٙ شجيٝ٘ -
. Length اليأخزٚ Procedure
: ظتٍِٛغ
: ً ؽبٌخ األٔشبء ِضٝ فParameter اٌــٛ٘ - : Parameters Formal -
Create Procedure Add_Name (P_Name Varchar2 )
: ً ؽبٌخ إػغبء ليّخ ٌٗ ِضٝ فParameter اٌــٛ٘ - : Actual Parameters -
BEGIN
Add_Name („ Mo7amed Reda‟);
END;
: ٌخٕفيز٘اٚ
DECLARE
V_Name Varchar2(20);
V_Sal Number;
BEGIN
Query_Emp ( 171 , V_Name , V_Sal );
DBMS_OUTPUT.PUT_LINE ( V_Name || „ ‟ || V_Sal );
END;
- : ٌٍخٕفيزٜؿشيمت أخش
VARIABLE V_Name Varchar2(25)
VARIABLE V_Sal Number
EXECUTE Query_Emp (171, :V_Name , :V_Sal) ;
/
PRINT V_Name , V_Sal
: ظتٍِٛغ
. Out عٌٕٛ ِٓ اParameter بٙ ثProcedure اٌـٍَٝ ثبٌٕذاء ػٛ ػّٕب ٔمVariable ًّ الثذ ِٓ ػ-
- :ٌخٕفيز٘اٚ
DECLARE
V_Phone Varchar2(20) := '01009844556';
BEGIN
Format_Phone (V_Phone );
DBMS_OUTPUT.PUT_LINE (V_Phone );
END;
: ظتٍِٛغ
In Out عٌٕٛ ِٓ اParameter بٙ ثProcedure اٌــٍَٝ ثبٌٕذاء ػٛ ػٕذِب ٔمVariable ًّ الثذ ِٓ ػ-
Positiona Procedure اٌـٝد فٛصٌّٛ بٕفظ اٌخشحيب اParameter ػغ ليُ اٌـَٛ بٛ(اٌخشحيب) ٔم
- : ٌٍخٕفيز
• Passing by Positional Notation
Execute Add_Dept (‘Education’ , 2300 );
• Passing by Named Notation
Execute Add_Dept (P_Loc => 2400, P_Name => ‘Training’ );
Invoking Procedures
ايضبً ِٓ خاليٚ ٘زا اٌظذدٝرؼشضٕب ألِضٍخ وضيشح فٚ anonymous blocks ِٓ خاليParameters اٌــٍٝ ٔسزغيغ إٌذاء ػ-
. ٜ اخشProcedure
CREATE OR REPLACE PROCEDURE Process_Employees
IS
Cursor Emp_Cursor is Select Employee_Id
From Employees;
BEGIN
For Rec in Emp_Cursor Loop
Raise_Salary Rec.Employee_Id , .3);
End Loop;
Commit;
END Process_Employees;
Handled Exceptions
ب صُ لّٕبٙ يّىٓ اْ رمغ ثٝب ِٓ األخغبء اٌزٌٙ Exception ًّلّٕب ثؼٚ Add_Dept ّٝ رسProcedure ًّ إفزشاع إٔب لّٕب ثؼٍٝ ػ-
. Add_Dept ٍٝ إٌذاء ػٝ٘ بٙظيفزٚٚ ٜ اخشProcedure ًّثؼ
ٌُ ٔىٓ لذ لّٕا بّؼاٌضخٗ ؟ٚ Add_Dept اٌـٝ عذد خـأ فٌٛ ِارا يغذد
. ءٝلف وً شٛيٚ Error ش ٌٕبٙف يظٌُٛ يؼبٌظ فسٚ Error ارا و ٕب لذ لّٕب ثّؼبٌغزٗ فٍٓ يؾذس شيئبً اِب ارا وبْ ٕ٘بن-
Removing Procedures
Syntax
- DROP Procedure Procedure_Name ;
Example
- DROP Procedure Raise_Salary;
اٍّٙ لّج بؼٝ اٌخProcedure لذ لّج بىخابخٗ داخً اٌـٜد اٌزِٛؼشفت اٌىٚ ٌشؤيت-
Select *
From User_Source
Where Name = ' Add_Dept '
And Type = 'PROCEDURE'
Order by Line;
CHAPTER 2
Creating Stored Functions
ِغAnonymous اٌـٜن اٌؼبدٍْٛ شجيٗ ثبٌجٛيٕٗ يىٛرىٚ Subprogram يؼزجش اؽذ افشاد ػبئٍخ اٌـٛ٘ٚ وبدٍٛاع اٌجٛٔع ِٓ اٛٔ ٛ٘ -
ٌُ ٔضغشٌٛ ٝ ؽزAs ٚ اIs الثذ ِٓ وزبثخٚ As ٚ اIs بِٕٙ ًرسزخذَ ثذالٚ Function ِغ اٌــDeclare َإخزالف ثسيظ الرسزخذ
رٕفيزح اوضش ِٓ ِشحٚ إٌذاء ػٍيخٚ اؽذحٚ د ِشحَٛ ثىزبثخ اٌىٛ إٔب ٔمFunctionِيضح اٌــٚ ٛ٘ وّبٝ اِب اٌجبلVariables اٌخ رؼشيف
. ثميّخFunction د اٌــٛالثذ اْ رؼٚ Database اٌــٝب ِخضٔٗ فٙٔأل
؟Anonymous Block اٌــٚ Subprogram (Procedure , Function) ِاٌفشق بيٓ اٌـ
Syntax
CREATE [ OR REPLACE ] FUNCTION Function_Name [(Parameter1 [mode1] Datatype1, …....)]
RETURN Datatype
IS|AS
[Variables ; …]
BEGIN
RETURN expression;
END [function_name];
: ظتٍِٛغ
اْ إٌبرظ اٌّشادFunction يئخ اٌـَٙ ثزٛ إٔب ٔمٜ اReturn Datatype اٌـٝ فFunction اٌــٚ Procedure اٌفشق ثيٓ اٌـــ-
ٗ ٔشيذ اْ ٔضغ فيٜ فيٗ ٔؾذد اٌّزغيش اٌزٜ اٌزReturn Expression ٔسزمجٍٗ ِٓ خاليٚ لّذ ثزؾذيذحْٜ ِٓ اٌزٛإسزخشاعخ سيى
. اٌميّخ
. فمظIn عٌٕٛ اال ِٓ اParamerter َ اسزخذاFunction الٔسزغيغ ِغ اٌــ-
بٌٙ ال ٔؾذدDatatype ػٕذ رؾذيذ اٌــReturn ايضبً اٌـٚ Length بٙب فإٕٔب الٔؼغيٙػٕذ رؼشيفٚ ً وّب ػشفٕب٘ب سبثمبParamerter اٌــ-
. ً ايضبLength
: ظتٍِٛغ
. ٗ ألسزشعبع اٌميّخ فيFunction اٌــٍٝ الثذ ِٓ ػًّ ِزغيش ػٕذ إٌذاء ػ-
اٌؼشيبت اٌخاص بٗ ؟ٝ حؼـيٕا طافٝ٘ٚ ا اٌّشحبٙ ٔؼـيFunction ًّ لُ بؼ
CREATE OR REPLACE FUNCTION Tax (P_Value IN Number)
RETURN Number
IS
BEGIN
RETURN (P_Value * 0.08);
END Tax;
: ٌخٕفيز٘اٚ
Select Employee_Id, Last_Name, Salary, Tax(Salary)
From Employees
Where Department_Id = 100;
اٌؼىظ ؟ٌٛ False ٚ ٗعؾ ِشحباث اداسحٛ ِشحبٗ اوبش ِٓ ِخٌٛ True د بـٛحؼٚ ظفٌّٛا سلُ اٙ ٔؼـيFunction ًّ لُ بؼ
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;
BEGIN
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;
END;
:ٌخٕفيز٘اٚ
DECLARE
V_Check Boolean ;
BEGIN
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 ;
END;
: ظتٍِٛغ
. Show Errors ٌشؤيخ اٌخغأ ٔىزت-
Removing Functions
Syntax
DROP Function Function_Name ;
Example
DROP Function Get_Sal ;
CHAPTER 3
CREATING PACKAGES
: األ٘ذاف
. بٙٔبرِٛىٚ Backage اٌــٍٝاٌزؼشف ػ
.Exceptions – Functions – Procedures – Cursors – Variables ِٓ ػخّٛ رزضّٓ ِغBackage أشبء
. Backage رشغيً اٌــٚ ويفيخ اسزذػبءٍٝاٌزؼشف ػ
. ًالٚ اBody ؽيش أٗ اليّىٓ اشبء اٌـBody َ ثإٔشبء اٌــٛالً صُ ٔمٚ اSpecification الؽظ أٗ الثذ ِٓ اشبء اٌــ-
ٌٓىٚ (Public (اٌغضء اٌـSpecification اٌــٝدُ٘ فٛعٚ ثششطFunction ٚ اProcedure ٜ( ألCall) ًّ ػٚ يّىٕه إسزذػبء ا-
. ) فمظPrivate فمظ (اٌغضء اٌـPackage Body اٌـٝديٓ فٛعٌّٛ اFunction ٚ اProcedure اليّىٓ أسزذػبء
َٛ ثذالً ِٓ اْ ٔمBackage Specification اٌــٝ رؼذيً فٜ ٔزّىٓ ِٓ ػًّ اٝ ب ؽزَٙ ثىزبثزٛٔمٚ إخزيبسيخٝ٘ : Or Replace -
. بٙب صُ اٌزؼذيً فيٙثإصاٌز
ُٓ ثؼذ رٌه ػِٙيّىٓ إسزخذاٚ Specification اٌــُٝ فٙ ؽيش يزُ رؼشيفFunction اٌـٚ Procedure اٌــ: Subprogramme -
. Backage عشيك اٌــ
Parameters Description
Package_name Package ح ؼبش ػٓ األعُ اٌخاص باٌــ
Public Type and item Declare
Declaration Variable, Cursor, Constant , Exception , or Types
Subprogram Specification Function اٌــٚ Procedure حؼشيف والً ِٓ اٌــ
: ِزاي
Comm ْ اٌــٛ اٌششوخ الثذ أْ يىٝظف عذيذ يزُ رؼييٕٗ فِٛ َٜ ثبٌزأوذ ِٓ أْ اٛ رمPackage أشبءٛ٘ ٌٝذف ِٓ اٌّضبي اٌزبٌٙ ا-
. اٌششوخٝ فComm اٌخبص ثٗ الً ِٓ اوجش
ُب صَٙ ثإصاٌزٛ ثذالً ِٓ اْ ٔمBackage Body اٌــٝ رؼذيً فٜ ٔزّىٓ ِٓ ػًّ اٝب ؽزَٙ ثىزبثزٛٔمٚ إخزيبسيخٝ٘ : Or Replace -
. بٙاٌزؼذيً في
َ ٕ٘بٛٔمٚ ُٙ ال يزُ رؼشيفٚ اSpecification اٌــُٝ فٙ ؽيش يزُ رؼشيفFunction اٌـٚ Procedure اٌــ: Subprogramme -
. Backage Body اٌــُٝ فٙد اٌخبص ثٛثىزبثخ اٌى
ٔم َٛداخً اٌــ Package Bodyبأشاء أ Subprogramme ٜح ُ حؼشيفٙا ف ٝاٌــ Specificationا ٌُ ٚيخُ حؼشيفٙا وّا ف ٝاٌّزاي اٌغابك . -
ٍِغٛظت :
-يغت اْ يى ْٛإسُ اٌــ Packageف ٝاٌغضء األٚي )ٔ ٛ٘ (Specificationفس األسُ ف ٝاٌغضء اٌضبٔ. (Body) ٝ
-ف ٝاٌّضبي اٌسبثك رُ رٕفيز اٌــ Packageػٓ عشيف ٔفس اٌّسزخذَ ا ٚاٌــ USERاٌز ٜلبَ ثإٔشبؤ٘ب .
-ا ٞاسُ اٌؾضِخ اٚال صُ ٔمغخ صُ اسُ االعشاء ا ٚاٌٛظيفخ .
-ف٘ ٝزا اٌّضبي رُ رٕفيز اٌــ Packageػٓ عشيك ِسزخذَ اخش ِضً ٚ SCOTTرٌه ػٓ عشيك ِٕؼ ٘زا اٌّسزخذَ اٌــ Privilageاٚ
اٌظالؽيخ إٌّبسجخ ٌٗ ٌى ٝيزّىٓ ِٓ إسزخذاَ ٘زٖ اٌــ . Package
-ف٘ ٝزا اٌّزاي لّٕا بخؼشيف Variablesداخً اٌـــ ٚ Package Specificationباٌخاٌ ٝحى٘ ْٛزٖ اٌــ ِٓ Variableإٌٛع اٌــ Global
ٚلذ لّٕا بأشاء اٌــ Packageاٌغابمٗ ٝ٘ٚحغخ ٜٛػٍِ ٝضّٛػت ِٓ اٌـ ٘ٚ Variablesزٖ اٌــ Variablesحغخ ٜٛػٍ ٝليُ ئفخشاػيت .
-رُ ٔم َٛبأشاء اٌــ Procedureاٌخاٌيت ٝ٘ٚحٛػظ ئِىأيت ئعخخذاَ اٌــ Packageداخً اٌــ . Procedure
Removing Package
ٍِغٛظت :
ػٕذ عزف اٌــ Package Specificationيخُ عزف اٌــ Bodyبـشيمت أحِٛاحيىيت .
CHAPTER 4
More Package Concepts
ػٍّيت اٌــ - : Overloading
رزيؼ ٘زٖ اٌؼٍّيخ إسزخذاَ ٔفس األسُ ٌؼذح Proceduresا Functions ٚداخً ٔفس اٌــ ٘ٚ Packageزٖ اٌؼٍّيخ رغٍت اْ يىٕ٘ ْٛبن -
إخزالف ثيٓ ٘زٖ اٌــ Subprogrammeف ٝػذد اٌــ Parametersا ٚرشريج ُٙا ٚأٛاع ثيبٔبر ُٙوّب سٛف يزُ ششؽٗ ٚرزيؼ ٘زٖ
اٌؼٍّيخ وزبثخ ٚرغٛيش اٌجشاِظ ثّشٔٚخ اوضش .
الؽظ اْ ٘زٖ اٌؼٍّيخ اليّىٓ اْ رؾذس ٌــ Proceduresا Functions ٚخبسط اٌـ . Package -
٘زٖ اٌؼٍّيخ رّىٓ اٌّجشِظ ِٓ رؼشيف ػذح ثشِغيبد ِخزٍفخ ثٕفس األسُ داخً ٔفس اٌــ ٚ. Packageيزُ اٌزفشيك ٚاٌزؼشف ػٍ ٝاٌـ -
Subprogrammeاٌّشاد إسزخذاِٗ ثٛاسغخ األخزالف ف ٝػذد اٌـ Parametersاٛٔ ٚع اٌجيبٔبٔبد ٌٙزٖ اٌــ Parametersاٚ
رشريج. ُٙ
: ٔزيغخ رٕفيزّ٘بٚ Package Specification اٌــُٝ فٙ اٌسبثك رؼشيفProceduersرٕفيز وال اٌـٚ يجيٓ ويفيخ إسزذػبء: ٌٝاٌشىً اٌخا
ٍِ غٛظت:
ِؼظُ اٌذٚاي اٌذاخٍيخ ٌألٚساوً ِغجك ثٙب ِف َٛٙاٌــ . Overloading -
ِضبي ػٍ ٝرٌه داٌخ اٌــ To_Charوّب ف ٝاٌّضبي اٌسبثك ٔٚش ٜف ٝاٌّضبي اٌسبثك اسثغ رؼشيفبد ِخزٍفخ ٌٕفس اٌذاٌخ ٚثٕفس األسّٛرٌه -
ف Package ٝثإسُ . Standard
األ ٌٝٚثٙب ٚ Parameterاؽذ ٔٛػٗ ٚ Dateرشعغ . Varchar2 -
اٌضبٔيخ ثٙب ٚ Parameterاؽذ ٔٛػٗ ٚ Numberرشعغ . Varchar2 -
اٌضبٌضخ ثٙب إصٕبْ Parametersاألٚي ٔٛػٗ ٚ DATEاٌضبٔٚ Varchar2 ٝرشعغ . VARCHAR2 -
اٌشاثؼٗ ثٙب إصٕبْ Parametersاألٚي ٔٛػٗ ٚ Numberاٌضبٔٚ Varchar2 ٝرشعغ . VARCHAR2 -
ٍِ غٛظت :
ارا رُ ػًّ داٌخ اخش ٜثٕفس األسُ ٌذٚاي داخٍيخ يزُ إسزجذاي اٌذٚاي اٌمذيّخ ٚٚضغ اٌذٚاي اٌغذ يذح اٌز ٝػٍّٙب اٌّسزخذَ ٚرٌه ف ٝاٌذٚاي -
اٌخبطخ ثبٌــ . Standard Package
فف ٝاٌّضبي اٌسبثك ٔالؽظ ػذَ إِىبٔيخ إسزخذاَ اٌــ Procedureاٌّسّ Calc_rating ٝؽيش لّٕب ثإسزخذاَ اٌــ Procedureلجً -
رؼشيفٗ ٘ٚزا ِاليّىٓ إسزخذاِٗ ف ٝاٌــ Pl\SQLفٍىٔ ٝزّىٓ ِٓ إسزخذاَ رٍه اٌــ Procedureالثذ ِٓ رؼشيفٗ اٚالً ف ٝاٌغضء
اٌخبص ثبٌـــ Declartionصُ ٔم َٛثؼذ رٌه ثإسزخذاَ ٘زٖ اٌــ Procedureف ٝاٌغضء اٌخبص ثبٌــ Bodyوّب ف ٝاٌّضبي اٌزبٌ: ٝ
-ف ٝاٌّضبي اٌسبثك رُ ِؼبٌغخ رٍه اٌّشىٍخ ٚرٌه ػٓ عشيك رؼشيف ) Procedure (Calc_Ratingف ٝاٌغضء اٌخبص ثبٌـ
. Declration
٘ٚزٖ اٌؼٍّيخ رزيؼ رغّيغ اوضش ِٓ ِ Subprogrammeشرجغخ ثجؼضٙب فٚ Package ٝاؽذح ثؾيش يزُ رؼشيف ُٙف ٝاٌــ
Specificationاٌخبص ثبٌــٚ Packageوزبثخ اٌىٛد داخً اٌــ ٚ Bodyرٌه يفيذ ف ٝإخفبء رفبطيً اٌىٛد ا ٜصيبدح ِٓ اٌسشيخ
). (security