You are on page 1of 67

PL/SQL Course

‫حخغشن‬ٚ ‫ي اٌغك‬ٛ‫يٕـك اٌٍغاْ بم‬ٚ ٍُ‫ػٕذِا يبذع اٌم‬


ٌُ‫اٌيذاْ ٌؼًّ اصًّ ِا يخُ ػٍّٗ ٌيٕخفغ بٗ وً ِٓ في اٌؼا‬
‫اٌخٍّيز ِؼا يبذػاْ وي‬ٚ ‫اٌؼشبي اصّغ فٕضذ االعخار‬
ً‫يٕششاْ ػٍّا سائؼا‬

Mo7amed Reda Abd El-Rahman


ORACLE FINANCIAL CONSULTANT
ACCOUNTANT UNDER ORACLE APPLICATIONS ENVIRONMENT
INSTRUCTOR ORACLE FINANCIAL R12
INSTRUCTOR ORACLE DEVELOPER
Scientific Computing Center – Mansoura University
Mobile : 01066734381

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

Introduction To PL/SQL

Index

Fundamental (I)

Chapter1: Introduction to PL/SQL

Chapter2: Declaring PL/SQL Variables

Chapter3: Writing Executable Statements

Chapter4: Interacting with the Oracle Server

Chapter5: Writing Control Structures

Chapter6: Working with Composite Data Types

Chapter7: Using Explicit Cursors

Chapter8: Handling Exceptions

PL/SQL Program Units Fundamental (II)

Chapter1: Creating Stored Procedure s

Chapter2: Creating Stored Functions

Chapter3: Creating Package

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

PL/SQL
Fundamental (I)

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


‫‪PL/SQL Course‬‬

‫‪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‬رسزخذَ ٌزىشاس عٍّٗ ِؼيٕٗ ػذد ِشاد ِؼيٕٗ ‪.‬‬
‫‪ ‬س‪ٛ‬ف ٔم‪ َٛ‬ثىزبثخ اٌى‪ٛ‬د ِشح ‪ٚ‬اؽذح ‪ٌٚ‬ىٕٕب ٔسزغيغ رٕفيزح اوضش ِٓ ِشح ‪.‬‬

‫‪ِّ ‬يضاث اٌـــ ‪: PL / SQL‬‬


‫‪ Modularized ‬حـ‪ٛ‬يش اٌبشٔاِش ‪:‬‬
‫‪ ‬ؽيش ٔسزغيغ ‪ٚ‬ضغ اوضش ِٓ ثٍ‪ٛ‬ن داخً ثؼض‪ّٙ‬ب )‪(Nested Blocks‬‬
‫‪ ‬األسزفبدح ِٓ اٌخجشاد ‪ٚ‬األو‪ٛ‬اد اٌسبثمخ ‪ٚ‬رٌه ثغّؼ‪ٙ‬ب ف‪ ٝ‬شىً ِىزجبد )‪ (Libraries‬يّىٓ األسزفبدح ِٕ‪ٙ‬ب ِٓ ثيٓ اد‪ٚ‬اد‬
‫ا‪ٚ‬ساوً اٌّخزٍفخ ‪.‬‬
‫‪ Integration ‬اٌخىاًِ ‪:‬‬
‫‪ ‬يزىبًِ ِغ ِٕزغبد ا‪ٚ‬ساوً ِضً اٌـــ ‪. Jdeveloper‬‬
‫‪ Portability ‬اٌّش‪ٔٚ‬ت ‪:‬‬
‫‪ ‬ؽيش ٔسزغيغ وزبثخ اٌى‪ٛ‬د ػٍ‪ ٝ‬ا‪ (Operating System) ٜ‬ا‪. (Platform) ٚ‬‬
‫‪ِ Exception ‬ؼاٌضت األخـاء ‪:‬‬
‫‪ ‬ؽيش ٔسزغيغ ِؼبٌغخ األخغبء ‪ٚ‬إظ‪ٙ‬بس٘ب ثبٌشىً اٌز‪ٔ ٜ‬شيذٖ ‪.‬‬

‫‪Eng. Mo7amed Reda‬‬ ‫‪E-mail:Dev-reda@hotmail.com‬‬ ‫‪Mobil: 01066734381‬‬


PL/SQL Course

PL/SQL Block Structure


: ِٓ ْٛ‫( يخى‬Block) ً‫و‬ٚ (Blocks) ‫ ِٓ ػذة‬PL ‫د اٌــ‬ٛ‫ْ و‬ٛ‫ يخى‬

: ٍٝ‫ ِاي‬ٍٝ‫ ػ‬ٜٛ‫حغخ‬ٚ ْ‫األػال‬ٚ ‫ ِٕـمت اٌخؼشيف‬ٝ٘


Optional
Variables – Cursors – Constants – And Other Types

Mandatory SQLStatement – Pl / SQL Statement ‫إٌّـمت اٌخٕفيزيت ٌٍـ‬

Optional ‫ِؼاٌضت األخـاء‬

Mandatory Block ‫ايت اٌــ‬ٙٔ

: ٗ‫ظ‬ٛ‫ ٍِغ‬
. End ٚ Begin ِٓ ً‫ األل‬ٍٝ‫ ػ‬Block ‫ْ اٌــ‬ٛ‫ يزى‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


‫‪PL/SQL Course‬‬

‫‪ ‬حٕفيز صًّ ‪ٚ‬ػباساث اٌـــ ‪: PL / SQL‬‬


‫‪ ‬يزُ ‪ٚ‬ضغ ػالِخ );( فبطٍخ ِٕم‪ٛ‬عخ ف‪ٙٔ ٝ‬بيخ وً عٍّٗ ا‪ ٚ‬ػجبسح ِٓ عًّ اٌــ ‪. PL / SQL‬‬
‫‪ ‬ػٕذ رٕفيز اٌجٍ‪ٛ‬ن ثذ‪ ْٚ‬أخغبء رظ‪ٙ‬ش اٌغٍّخ اٌزبٌيخ ٌز‪ٛ‬ضيؼ رّبَ ‪ٚ‬طؾخ اٌزٕفيز‬
‫‪PL / SQL procedure successfully completed .‬‬
‫‪ ‬الؽظ ػذَ ‪ٚ‬ع‪ٛ‬د ػالِخ اٌفبطٍخ إٌّم‪ٛ‬عخ ثؼذ ٔ‪ٙ‬بيخ وٍّخ ‪ Declare‬ا‪ Begin ٚ‬ا‪Exception ٚ‬‬
‫‪ ‬الؽظ ‪ٚ‬ع‪ٛ‬د ػالِخ اٌفبطٍخ إٌّم‪ٛ‬عخ );( ف‪ٙٔ ٝ‬بيخ وٍّخ ‪. End‬‬
‫‪ ‬يّىٓ وزبثخ أوضش ِٓ عٍّخ ا‪ ٚ‬ػجبسح ػٍ‪ٔ ٝ‬فس اٌسغش ‪ٚ‬اٌفظً ثيٕ‪ ُٙ‬ثؼالِخ اٌفبطٍخ إٌّم‪ٛ‬عخ );( ‪ٌٚ‬ىٓ اليؾجز رٌه ٌغؼً لشاءح‬
‫اٌجشٔبِظ اس‪ٚ ًٙ‬وزٌه اٌزؼذيً فيٗ ‪:‬‬

‫أ‪ٛ‬اع اٌبٍ‪ٛ‬واث ‪Block Types‬‬

‫العظ اْ أ‪ٛ‬اع اٌــ ‪ Blocks‬ف‪ٌ ٝ‬غت اٌـــ ‪ PL / SQL‬يّىٓ اْ حى‪ِٕ ْٛ‬فظٍت وٍياً ا‪ِ ٚ‬خذاخٍٗ ِغ بؼؼ‪ٙ‬ا اٌبؼغ‬ ‫‪‬‬
‫)‪ٚ (Nested Blocks‬حٕمغُ ٘زٖ اٌىخً اٌ‪ ٝ‬لغّيٓ ‪:‬‬

‫‪Blocks‬‬

‫‪Anonymous block‬‬ ‫‪Subprograms‬‬

‫‪ " Anonymous block " )1‬الكتلة المجهىلة ‪:‬‬


‫‪ٌ ‬يس ٌٗ اسُ ‪ٚ‬يزُ رؼشيفٗ ػٕذ ٔ مغخ اٌزغجيك ‪ٚ‬يٕفز سبػز‪ٙ‬ب ‪ٚ‬يزُ اسسبٌٗ اٌ‪ِ ٝ‬ؼبٌظ ا‪ٚ‬ساوً ٌزشعّز‪ٙ‬ب ‪ٚ‬رٕفيز٘ب ‪.‬‬
‫‪ " Subprograms " )2‬وحدات برمجية ‪:‬‬
‫‪ٚ ٝ٘ ‬ؽذاد ا‪ Blocks ٚ‬رمجً ِؼبِالد )‪ (Parameters‬يّىٓ اْ رسزٕذ ػٍي‪ٙ‬ب ف‪ ٝ‬رٕفيز اٌجشٔبِظ ‪ٚ‬رٕمسُ ٘زٖ اٌ‪ٛ‬ؽذاد‬
‫اٌ‪٘ٚ (Function) ٚ (Procedure)ٝ‬زٖ اٌ‪ٛ‬ؽذاد يزُ ؽفظ‪ٙ‬ب داخً اٌــ ‪ٚ Database‬يزُ اسزذػبئ‪ٙ‬ب ػٕذ اٌؾبعخ اٌي‪ٙ‬ب ‪.‬‬

‫‪Eng. Mo7amed Reda‬‬ ‫‪E-mail:Dev-reda@hotmail.com‬‬ ‫‪Mobil: 01066734381‬‬


PL/SQL Course

Blocks Types

Anonymous Procedure Function

 Differences between Anonymous Blocks and Subprograms

Anonymous Block Subprogram


ُ‫ٌيظ ٌٗ ئع‬ ُ‫ٌٗ ئع‬
‫ ٌٗ ػٕذ وً ػٍّيت حٕفيز‬Compile ًّ‫َ بؼ‬ٛ‫ٔم‬ ‫اعذة فمؾ‬ٚ ‫ ٌٗ ِشة‬Compile ًّ‫َ بؼ‬ٛ‫ٔم‬
Database ‫ اٌــ‬ٝ‫اليخضْ ف‬ Database ‫ اٌــ‬ٝ‫يخضْ ف‬
ٜ‫ اخش‬App ِٓ ٖ‫الٔغخـيغ حٕفيز‬ ٜ‫ أخش‬App ِٓ ٖ‫ٔغخـيغ حٕفيز‬
Parameters ‫اليّىٓ اْ يأخز‬ Parameters ‫ِّىٓ اْ يأخز‬

‫ ؟‬Function ‫اٌــ‬ٚ Procedure ‫ اٌفشق بيٓ اٌــ‬ٛ٘ ‫ِا‬ 


. ‫د ثميّخ‬ٛ‫ ال رؼ‬ٚ‫ اوضش ا‬ٚ‫د ثميّخ ا‬ٛ‫ ِّىٓ رؼ‬Procedure ‫اٌــ‬ 

. ‫د ثميّخ‬ٛ‫أْ رؼ‬ٚ ‫ الثذ‬Function ‫ اٌــ‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

: ‫ ِزاي‬
111 ُ‫ظف سل‬ٌّٛ‫اعخخشس اعُ ا‬ 
Declare
V_fname varchar2 (20);
Begin
Select First_name into V_fname
From employees
Where employee_id = 100 ;
End ;

PL/SQL procedure successfully completed.


: ‫ ملحىظة‬
‫٘زٖ اٌضٍّت حىخب ِشة‬ٚ Set Serveroutput On ‫ البذ هي تهيئة البزًبهح ألستخزاج خول الطببعه عي طزيق كتببة األهز التبلى‬
. ‫ َ باغالق اٌبشٔاِش‬ٛ‫ ٔم‬ٝ‫ظت عخ‬ٛ‫حظً ِغف‬ٚ Session ‫ اٌــ‬ٝ‫اعذة ف‬ٚ

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 ;

the first name of the employee is : Steven


PL/SQL procedure successfully completed.

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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 ٗ‫ْ ٔاحش اٌـباػ‬ٛ‫ اٌخٕفيز ٌزٌه عيى‬ٝ‫ا األعك ف‬ٙٔ‫أل‬

Types of Variables ‫اع اٌّخغيشاث‬ٛٔ‫أ‬

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' ;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


‫‪PL/SQL Course‬‬

‫‪ ِٓ ‬األفؼً حؼشيف وً ‪ Variable‬ػٍ‪ ٝ‬عـش عخ‪ ٝ‬يغ‪ ًٙ‬ػٍيٕا ػٍّيت اٌمشاءة ‪ٚ‬أيؼاً ِؼاٌضت األخـاء ‪ٚ‬ع‪ٌٛٙ‬ت اٌ‪ٛ‬ط‪ٛ‬ي‬
‫اٌي‪ٙ‬ا‪.‬‬
‫‪ ‬ع‪ٛ‬ف ٔخٕا‪ٚ‬ي ف‪٘ ٝ‬زا اٌــ ‪ Chapter‬إٌ‪ٛ‬ع األ‪ٚ‬ي ‪ ٛ٘ٚ‬اٌـــ ‪ Scalar‬اٌـــ ‪ٚ PL/SQL Variables‬ع‪ٛ‬ف ٔخٕا‪ٚ‬ي إٌ‪ٛ‬ع‬
‫األخيش اٌخاص باٌــ ‪. Non Pl/sql Varciables‬‬

‫‪Declaring Scalar Variables‬‬

‫‪ ‬اٌّخغيشاث اٌّفشدة )‪: (Scalar Variables‬‬


‫‪ِ ٝ٘ )1‬خغيشاث حغخ‪ ٜٛ‬ػٍ‪ ٝ‬ليُ ِفشدة ‪ٚ‬اليّىٓ حضضء اٌ‪ ٝ‬ليُ ِفشدة أطغش ِٕ‪ٙ‬ا ف‪ ٝٙ‬أ‪ٛ‬اع اليّىٓ اْ يغخ‪ٜٛ‬‬
‫اٌّخغيش في‪ٙ‬ا ع‪ ٜٛ‬ػٍ‪ ٝ‬ليّت ‪ٚ‬اعذ فمؾ ‪ Number‬ا‪ Varchar2 ٚ‬ا‪ Date ٚ‬ا‪ٚ Boolean ٚ‬غيش ُ٘ ‪.‬‬
‫‪DECLARE‬‬
‫‪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‬خغيش عشف‪ ٝ‬رابج اٌغؼت ع‪ٛ‬اء حُ ِأل٘ا باٌبيأاث ا‪ ٚ‬حشوج فاسغت ‪٘ٚ‬زا إٌ‪ٛ‬ع ِؼش ف‪ٝ‬‬ ‫‪‬‬
‫اٌّغاعت ٌىٕٗ اعشع ف‪ ٝ‬اٌخؼاًِ ‪.‬‬
‫)‪ِ : Varchar2 (length‬خغيش عشف‪ ٝ‬راث عؼٗ ِؼيٕت ٌىٓ ٘زٖ اٌغؼت ِخغيشة ‪ٚ‬يخُ ِأل اٌّخغيش بغؼت إٌض فمؾ بغذ‬ ‫‪‬‬
‫الظ‪ ٝ‬عؼت ٘زا اٌّخغيش فّزالً ِخغيش عشف‪ ٝ‬راث عؼت ‪ 31‬عشف ‪ ٌُٚ‬ي‪ٛ‬ػغ فيٗ ع‪ 6 ٜٛ‬عش‪ٚ‬ف يّالء باٌغش‪ٚ‬ف اي ‪6‬‬
‫‪ٚ‬يخُ ح‪ٛ‬فيش اٌبال‪٘ٚ ٝ‬زا إٌ‪ٛ‬ع ِفيذ ف‪ ٝ‬اٌّغاعت ٌىٕٗ ابـ‪ٝ‬ء ِٓ إٌ‪ٛ‬ع اٌغابك )‪. (char‬‬
‫‪ ٛ٘ : Long‬إٌ‪ٛ‬ع األعاع‪ٌٍ ٝ‬بيأاث إٌظيت راث عؼٗ بغذ الظ‪ 32761 ٝ‬بايج ‪.‬‬ ‫‪‬‬
‫‪ِ ٛ٘ : Long Raw ‬زً اٌــ ‪ٌ Long‬ىٕٗ اليخُ اٌخؼاًِ بٗ ‪ٚ‬ال يف‪.PL/SQL ّٗٙ‬‬
‫)‪ِ ٛ٘ : number (p, s‬خغيش سلّ‪ ٝ‬يأخز ٔـاق ِٓ خأٗ ‪ٚ‬اعذة اٌ‪ 33 ٝ‬خأت ‪ٚ‬وزٌه وغش ػشش‪ 23 ِٓ ٜ‬اٌ‪127 ٝ‬‬ ‫‪‬‬
‫‪ : p‬ػذد خأاث األسلاَ اٌظغيغت ‪.‬‬ ‫‪‬‬
‫‪ : S‬ػذد خأاث األسلاَ اٌؼششيت ‪.‬‬ ‫‪‬‬
‫‪ ٛ٘ : Binary_integer‬إٌ‪ٛ‬ع اٌشلّ‪ ٝ‬اٌظغيظ ٌيأخز وغ‪ٛ‬س ػششيت خالي ‪2147433 +‬‬ ‫‪‬‬
‫‪ِ ٛ٘ : Pls_integer‬زً إٌ‪ٛ‬ع اٌغابك ٌىٕٗ اعشع ‪ٚ‬يأخز ِغاعت الً ‪.‬‬ ‫‪‬‬
‫‪ٛٔ ٛ٘ : Boolean‬ع يأخز رالد ليُ فمؾ )‪ٚ (true , false m null‬يغخخذَ ف‪ ٝ‬عاالث اٌشش‪ٚ‬ؽ ‪ٚ‬اٌّماسٔاث إٌّـميت‬ ‫‪‬‬
‫فمؾ ‪.‬‬
‫‪ٛٔ : Date‬ع اٌّخغيشاث اٌخاسيخيت ‪ٚ‬يغخ‪ ٜٛ‬ػٍ‪ ٝ‬بيأاث حاسيخ ا‪ٚ ٚ‬لج ا‪ ٚ‬صِٓ ‪ ٛ٘ٚ‬يبذأ ِٓ ‪ 4712‬لبً اٌّيالد اٌ‪ٝ‬‬ ‫‪‬‬
‫‪ 9999‬بؼذ اٌّيالد ‪.‬‬

‫‪Eng. Mo7amed Reda‬‬ ‫‪E-mail:Dev-reda@hotmail.com‬‬ ‫‪Mobil: 01066734381‬‬


PL/SQL Course

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 ‫ا‬ٙ‫د ب‬ٛ‫ حؼ‬ٝ‫ اٌميُ اٌخ‬

‫ ؟‬111 ُ‫ يغًّ سل‬ٜ‫ظف اٌز‬ٌّٛ‫ِشحب ا‬ٚ ُ‫ ئعخخشاس ئع‬


DECLARE
V_Name Employees.Last_Name%Type ;
V_Sal Number ;
V_Id Employees.Employee_id%Type := 100 ;
BEGIN
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 ;
---------------------------------------------------------------------------------------------

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

Bind Variables

: ‫ظت‬ٛ‫ٍِغ‬
. Host Variable ّٝ‫حغ‬ٚ Block ‫ٌيظ داخً اٌــ‬ٚ Session ‫ع ِٓ اٌّخغيشاث يخُ ئٔشاؤة داخً اٌـ‬ٌٕٛ‫ ٘زا ا‬
. Pl/Sql ‫اٌــ‬ٚ Sql ‫ اٌــ‬ٝ‫حغخخذَ أيؼاً ف‬ٚ Variable ‫ا وٍّت‬ٍٙ‫ػغ لب‬ٛ‫ ي‬
: ٌٝ‫ْ شىٍت واٌخا‬ٛ‫ يى‬Semi Colon (;) ‫ػغ بؼذة‬ٛ‫ الي‬Bind Variable ‫ ػٕذ وخابت‬
Variable Variable Name Datatype
:Variable Name ٍٝ‫ وّا ي‬Colon ( : ) ٍٗ‫ئعخذػائت البذ اْ ٔؼغ لب‬ٚ ‫ ػٕذ إٌذاء ػٍيت‬
. Bind Variable ‫ ٔغخـيغ ئعخخذاَ صٍّت اٌـباػٗ اٌؼاديت ِغ اٌــ‬

‫ ؟‬173 ُ‫ظف سل‬ٌّٛ‫ ئعخخشاس ِشحب ا‬


Variable V_Sal Number
BEGIN
Select Salary into :V_Sal
From Employees
Where Employee_Id = 178 ;
END ;
/
Print V_Sal
: ‫ظت‬ٛ‫ٍِغ‬
. SQL ‫ اٌــ‬ٝ‫ ف‬Bind Variable ‫ يّىٓ اعخخذاَ اٌــ‬
: ‫ِزاي‬
‫ٔفخشع إٔا‬ٚ 173 ُ‫ظف سل‬ٌّٛ‫ ِشحب ا‬ٍٝ‫ ػ‬ٜٛ‫ اٌّزاي اٌغابك يغخ‬ٝ‫س ف‬ٛ‫ اٌّزو‬V_Sal ّٝ‫ اٌّغ‬Bind Variable ‫ اٌـ‬
‫ ٘زا اٌّشحب ؟‬ٍٝ‫ْ ػ‬ٍٛ‫ظفيٓ اٌزيٓ يغظ‬ٌّٛ‫ٔشيذ األعخؼالَ ػٓ ا‬

Select Last_Name
From Employees
Where Salary = :V_Sal ;
. Set Autoprint On ّٝ‫حغ‬ٚ ً‫ِاحيىيا‬ٛ‫ اٌـباػت اح‬ٝ‫ حغخخذَ ف‬ٝ٘ٚ Bind Variable ‫ ٕ٘ان صٍّت الحؼًّ اال ِغ اٌــ‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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
DECLARE
V_Id Number(6) := & Empno ;
BEGIN
Select Salary into :V_Sal
From Employees
Where Employee_Id = V_Id ;
END ;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

CHAPTER 3
Writing Executable Statements

Lexical Units in a PL/SQL Block


: ‫ظت‬ٛ‫ٍِغ‬
. Single Quotition ٓ‫ا بي‬ٙ‫ػؼ‬ٚ ِٓ ‫اسيخ البذ‬ٛ‫اٌخ‬ٚ ‫ ػٕذ اٌخؼاًِ ِغ األعشف‬
. ‫ اوزش ِٓ عـش‬ٍٝ‫د ػ‬ٛ‫ ٔغخـيغ وخابت اٌى‬
: ٍٝ‫د بـشيمخيٓ وّا ي‬ٛ‫ ( حؼٍيك ) ٌٍى‬Comment ًّ‫ ٔغخـيغ ػ‬
. -- َ‫اعذ ٔغخخذ‬ٚ ‫ ٌغـش‬Comment ًّ‫) ٌؼ‬1
.*/ ‫ٔمفٍٗ بـ‬ٚ /* َ‫ ألوزش ِٓ عـش ٔغخخذ‬Comment ًّ‫) ٌؼ‬2
‫ع‬ٚ‫ ارا صاء ِبشِش اخش ٌيىًّ اٌّشش‬ٝ‫عخ‬ٚ ‫د‬ٛ‫ظيفت وً و‬ٚ ‫اد ٌششط‬ٛ‫ األو‬ٍٝ‫ ػ‬comment ‫َ بىخابت اٌــ‬ٛ‫ ِٓ األفؼً اْ ٔم‬
. ‫اد بشىً عشيغ‬ٛ‫ُ األو‬ٙ‫يغخـيغ اْ يف‬
SQL Functions in PL/SQL
PL ‫ داخً اٌـ‬SQL ‫دة باٌـ‬ٛ‫ص‬ٌّٛ‫ ا‬Functions ‫ ٔغخـيغ اعخخذاَ صّيغ اٌــ‬
. Decode & Group Functions ‫ِاػذا اٌــ‬
DECLARE
V_Lname Varchar2(20) := Initcap( ' KING' ) ;
V_Name Varchar2(20) ;
BEGIN
Select First_Name into V_Name
From Employees
Where Last_Name Like V_Lname And Salary = 24000 ;
END;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

: ‫ظت‬ٛ‫ٍِغ‬
ِٓ ‫ٌىٓ البذ‬ٚ ٗ‫ن اٌّشاد إٌذاء ػٍي‬ٍٛ‫ ٔخّىٓ ِٓ حغذيذ اٌب‬ٝ‫ ئعُ ٔشيذة عخ‬ٜ‫حغّيخٗ بأ‬ٚ ‫ن‬ٍٛ‫ ٌٍب‬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

DBMS_OUTPUT.PUT_LINE(scc. V_Date_of_Birth ); ==== >>> 04-Apr-1965


DBMS_OUTPUT.PUT_LINE( V_Child_Name ); ==== >>> Mohamed
DBMS_OUTPUT.PUT_LINE( V_Date_of_Birth ); ==== >>> 04-Dec-1985
END;
END;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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;

1) eligible for commission .


2) 15000
3) SALESMAN eligible for commission .

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

CHAPTER 4
Interacting with the Oracle Server

Using PL/SQL to Manipulate Data

INSERT UPDATE DELETE MERGE

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;
-----------------------------------------------------------------------------------

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

SQL Cursor

IMPLICIT EXPLICIT
ٝ‫ اٌخ‬ٝ٘ ً‫ساو‬ٚ‫ اْ ا‬ٜ‫ ا‬ّٕٝ‫ع اٌؼ‬ٌٕٛ‫ ِٓ ا‬ٛ٘ ‫ٌت‬ٚ‫ف ٔخٕا‬ٛ‫ع‬ٚ ٍّٗ‫َ بؼ‬ٛ‫ يم‬ٜ‫ اٌز‬ٛ٘ ‫اٌّبشِش‬
ٗ‫يؼًّ حٍمائياً بّضشد إٌذاء ػٍي‬ٚ ٍّٗ‫لاِج بؼ‬ Chapter (7) ٝ‫باٌخفظيً ف‬

: ‫ظت‬ٛ‫ٍِغ‬
‫ب اٌجيبٔبد اٌمبدِخ ِٓ اٌــ‬ٙ‫رضغ ث‬ٚ SQL ‫ِبريىي ًب ِغ وً عٍّخ‬ٛ‫يض٘ب ار‬ٙ‫ساوً ثزغ‬ٚ‫َ ا‬ٛ‫ اٌشاَ رم‬ٝ‫ يؼزجش ِسبؽخ ف‬Cursor ‫ اٌــ‬
. SQL

SQL Cursor Attributes for Implicit Cursors

SQL%FOUND False ‫َ ثإسزشعبع‬ٛ‫ ٌُ يغذ يم‬ٌٛٚ True ‫َ ثإسزشعبع‬ٛ‫عذ ثيبٔبد يم‬ٚ ٌٛ

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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

‫ ؟‬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 ‫ اِب اٌــ‬
. ‫ء‬ٝ‫رغذ فٍٓ رفؼً ش‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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 ‫ ثؼذ‬ٜ‫األِش اٌز‬

IF Condition Then Action


True  ‫ ـ‬Action‫ف يٕفز اٌـ‬ٛ‫س‬
False  ‫ ـ‬Action‫ٌُ يٕفز اٌـ‬

. ‫ ٔفس اٌغٍّخ‬ٝ‫ ف‬If ِٓ ‫ضغ اوضش‬ٚ ‫ ) ٔسزغيغ‬2


. IF ‫بيخ عٍّخ‬ٙٔ ٝ‫اؽذح ف‬ٚ ‫ ِشح‬ٝ‫ رأر‬Else ‫ ) وٍّخ‬3
. IF ‫بيخ‬ٙٔ ٝ‫ِٕٕسبش ٔضغ ) ; ( ف‬ٚ End if ; ‫ط ٔضغ وٍّخ‬ٚ‫بيخ اٌشش‬ٙٔ ٝ‫ ) ف‬4

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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 ‫ِغ‬ 

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

LOOP Statements

Basic Loop While Loop For Loop

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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

: ‫ظت‬ٛ‫ٍِغ‬
‫ يّضً ػذد‬ٜ‫ ثّضبثخ ػذاد اٌز‬ٛ٘ ‫ ػشفذ ِزغيش‬ٝٔٛ‫بيخ ؟ ثبٌغجغ ال ػٍشبْ وذٖ ٘زالل‬ٙٔ‫ ِبال‬ٌٝ‫ رؼًّ ا‬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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

: ‫ظت‬ٛ‫ٍِغ‬
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 ِٓ ‫ٔسزغيغ اسزخذاَ اوضش‬

‫ ؟‬While Loop َ‫الغ باعخخذا‬ِٛ 3 ‫ لُ باػافت‬


DECLARE
V_Country_id Locations.Country_id%Type:= 'CA';
V_Loc_id Locations.Location_id%Type;
V_New_City Locations.City%Type := 'Montreal';
BEGIN
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;
END;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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
: ‫ظت‬ٛ‫ٍِغ‬

. Scalar ‫ ػىس اٌــ‬ٍٝ‫ يؾًّ ثذاخٍٗ اوضش ِٓ ليّخ ػ‬Record ‫ اٌـ‬


ٝ‫يزُ أشبء ٘زٖ اٌخبٔبد ثٕفس اٌغشيمخ اٌز‬ٚ 3 Generation Language (3GL) Fields ٍٝ‫ ػ‬Record ‫ اٌــ‬ٜٛ‫ يؾز‬
C++ ‫اٌـ‬ٚ C ‫ب ٌغبد اٌـ‬ِٙ‫رسزخذ‬
ٌٗ Record ‫إػغبء اٌـ‬ٚ Variable ‫ب ايضبًصُ ػًّ اٌـ‬ٙ‫رسّيز‬ٚ Fields ‫زٖ اٌـ‬ٙ‫ اٌخبطخ ث‬DataType ‫َ ثزؼشيف اٌـ‬ٛ‫ اٌّجشِظ يم‬
‫ٌىٓ األخزالف ٘ز ٖ اٌّشح اْ اٌـ‬ٚ ٌٗ Datatype ‫ الثذ ِٓ رؾذيذ‬Variable ٜ‫ اْ ا‬ٜ‫ع ثيبٔبد ٌٗ ا‬ٛٔ ‫ ِزغيش الثذ ِٓ رؾذيذ‬ٜ‫ ا‬
‫ثؼذ رٌه‬ٚ ً‫ال‬ٚ‫ ا‬Datatype ‫ٌزٌه يغت ػٍيٕب أشبء اٌـ‬ٚ ‫اؽذح‬ٚ ‫ٌيسذ‬ٚ Datatypes ‫ػخ ِٓ اٌـ‬ّٛ‫ ػجبسح ػٓ ِغ‬ٝ٘ Datatype
. ‫يزُ إػغبؤ٘ب ٌٍّزغيش‬

Syntax Create Datatype and Variable .

Type Type_Name is Record (Field1 Datatype , Field2 Datatype , ….) ;


Variable ;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

: ‫ظت‬ٛ‫ٍِغ‬
‫لذ لّٕب‬ٚ ٖ‫ ٘ز‬Datatype ‫وإٔٔب لّٕب ثؼًّ ِزغيشاْ داخً اٌـ‬ٚ Two Fields ٍٝ‫ ػ‬ٜٛ‫رؾز‬ٚ Datatype ًّ‫ إٔب لذ لّٕب ثؼ‬ٜ‫ ٔش‬
.ً‫ إسّب‬Datatype ‫ثإػغبء ٘زٖ اٌـ‬

‫ ؟‬Record ‫ باعخخذاَ اٌــ‬111 ُ‫ظف سل‬ٌّٛ‫ظيفت ا‬ٚٚ ُ‫ ئعخخشس ئع‬


DECLARE
Type Emp_Rec is Record (R_Name Varchar2(20) , R_Job Varchar2(20));
V_Rec Emp_Rec ;
BEGIN
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 ) ;
END;
: ‫ظت‬ٛ‫ٍِغ‬
. (Variable.Field name) ‫د اسُ اٌفيٍذ‬ٚ‫ اسُ اٌّزغيش د‬ٝ‫ ؽبٌخ اٌغجبػٗ الثذ ِٓ وزبث‬ٝ‫ ف‬
. Record ‫ اٌـ‬ٝ‫د ف‬ٛ‫ع‬ٌّٛ‫ اٌزشريت ا‬ٝ‫ضغ اٌميُ داخً اٌّزغيش يغت اْ يشاػ‬ٚٚ َ‫ ػٕذ األسزؼال‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

%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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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;
: ‫ظت‬ٛ‫ٍِغ‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

CHAPTER 7
Using Explicit Cursors

‫ فائذحت ؟‬ٝ٘‫ِا‬ٚ Cursor ‫ اٌـ‬ٛ٘‫ ِا‬


‫ ػجبسح‬ٛ٘ٚ ٗ‫غٍم‬ٚ ٗ‫رؼجئز‬ٚ ٗ‫فزؾ‬ٚ ٍّٗ‫َ ثؼ‬ٛ‫ يم‬ٜ‫ اٌز‬ٛ٘ ‫ اْ اٌّجشِظ‬ٜ‫ ا‬ّٕٝ‫ع اٌض‬ٌٕٛ‫ ٌيس ِٓ ا‬ٛ٘ Explicit Cursors ‫اٌـ‬ -
ٝ‫ ف‬Database ‫ب ِٓ اٌـ‬ٙ‫ ٔؾزبؽ‬ٝ‫َ ثزخضيٓ وً اٌجيبٔبد اٌز‬ٛ‫ إٔب ٔم‬ٜ‫َ فيٗ ثؼًّ ػٍّيٗ ِؼيٕٗ ا‬ٛ‫ رم‬ٜ‫س‬ّٛ‫ اٌّي‬ٝ‫ػٓ ِىبْ ف‬
ً‫لزب‬ٚ ‫فش‬ٛ‫ي‬ٚ ‫٘زا عجؼبً اسشع ثىضيش‬ٚ ‫ اٌجيبٔبد‬ٝ‫ٔسزذػ‬ٚ Database ‫ اٌـ‬ٌٝ‫ وً ِشح ا‬ٝ‫ ثذالً ِٓ اْ ٔز٘ت ف‬Cursor ‫اٌـ‬
‫ اٌّزغيش‬ٝ‫ ف‬Database ‫ األسزؼالِؼٓ اٌجيبٔبد فجذالً ِٓ اْ ٔضغ اٌميّٗ ِٓ اٌــ‬ٝ‫ اٌسشػخ ف‬ٝ‫ ف‬ٜ‫وجيشاً اراً فبئذرٗ اٌىجش‬
. ‫ اٌّزغيش‬ٌٝ‫ب ا‬ٍٙ‫ صُ ٔم‬ٜ‫س‬ّٛ‫ اٌّي‬ٝ‫ ثغجيؼزٗ ِخضْ ف‬ٜ‫ اٌز‬Cursor ‫اؽذ ٖ ِٓ اٌـ‬ٚ ‫ ٔشيذ٘ب ِشح‬ٝ‫ ثىً اٌجيبٔبد اٌز‬ٝ‫فٕأر‬

Syntax
DECLARE
Cursor Cursor_Name is Select_Statement;
BEGIN
Open Cursor_Name ;
Fetch Cursor_Name Into Variables ;
Close Cursor_Name ;
END;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

‫؟‬31 ُ‫ األداسة سل‬ٝ‫ظف‬ِٛ ‫أعّاء‬ٚ َ‫ ئعخخشس أسلا‬


DECLARE
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 ;
BEGIN
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 ;
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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

: ٗ‫ظ‬ٛ‫ٍِغ‬
Cursor ‫ب ِٓ اٌـ‬ٙ‫ صُ لّٕب ثإسزذػبئ‬Database ‫ ٔشيذ٘ب ِٓ اٌــــ‬ٝ‫ضؼٕب ثٗ وً اٌجيبٔبد اٌز‬ٚٚ Cursor ‫ٌمذ لّٕب ثؼًّ اٌـ‬ -
. Cursor ‫ اٌــ‬ٚ‫ ا‬Variable ‫اء اٌـ‬ٛ‫ س‬ٜ‫س‬ّٛ‫ اٌّي‬ٝ‫ثسشػٗ ألْ األصٕبْ ف‬ٚ ‫ اٌّزغيش‬ٌٝ‫ا‬

Explicit Cursor Attributes

Cursor FOR Loops


For ‫ رؼشيف ِزغيش ثبٌٕسجخ ٌٍـ‬ٌٝ‫ ِٓ األشيبء اٌشبئؼخ األسزخذاَ ؽيش إٔب الٔؾزبط ا‬Cursor ‫ ِغ اٌـ‬For Loop َ‫اسزخذا‬ -
ً‫ساو‬ٚ‫َ ا‬ٛ‫رم‬ٚ ‫ فمظ‬Cursor ‫ اراً فٍٓ ٔؾزبط اال ٌؼًّ اٌــ‬Cursor ‫ال ٌغٍك اٌـ‬ٚ ‫ال ٌزؼجئخ‬ٚ ‫أيضبً الٔؾزبط ٌفزؼ‬ٚ Loop
. ‫غٍمخ‬ٚ ٗ‫رؼجئز‬ٚ ‫ِبريىيبً ثفزؾخ‬ٛ‫ر‬ٚ‫ا‬

‫ ؟‬For Loop ‫ باعخخذاَ اٌــ‬31 ٓ‫ األداسة سل‬ٝ‫ظف‬ِٛ ‫اعّاء‬ٚ َ‫ اعخخشس اسلا‬


DECLARE
Cursor Emp_Cursor is Select Employee_Id , Last_Name
From Employees
Where Department_Id = 30 ;
BEGIN
For Rec in Emp_Cursor Loop
DBMS_OUTPUT.PUT_LINE ( Rec.Employee_Id || „ ‟ ||Rec.Last_Name );
End Loop ;
END;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

Syntax %ISOPEN Attribute


BEGIN
IF NOT c_emp_cursor%ISOPEN THEN
OPEN c_emp_cursor;
END IF;
LOOP.................
. %ROWCOUNT ٚ %NOTFOUND ‫ اعخخذاَ اٌخاطيت‬ٍٝ‫ ِزاي ػ‬
ECLARE
Cursor C_Emp Is Select Employee_Id, last_name
From Employees;
V_Rec C_Emp%Rowtype;
BEGIN
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 ;
END ;
: ‫ظت‬ٛ‫ٍِغ‬
‫ب‬ٙ‫ رُ سؾج‬ٝ‫ف اٌز‬ٛ‫ ػذد اٌظف‬ٚ‫ اطجؼ فبسغبً ا‬Cursor ‫اء اٌـ‬ٛ‫ س‬Loop ‫الً رخشط اٌــ‬ٚ‫ ششط يزؾمك ا‬ٜ‫ ٘زٖ اٌؾبٌخ ا‬ٝ‫ف‬ -
. 11 ِٓ ‫اوجش‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

. Cursor FOR Loops Using Subqueries ‫ اعخخذاَ اٌــ‬ٍٝ‫ ِزاي ػ‬


BEGIN
For R in ( Select Employee_Id, Last_Name From Employe es
Where Department_Id =30 ) LOOP
DBMS_OUTPUT.PUT_LINE ( R.Employee_Id ||' '||R.Last_Name);
End Loop;
END;
: ‫ظت‬ٛ‫ٍِغ‬
ٝ‫ ف‬Cursor ‫ ِىبْ اٌـ‬Subquey ًّ‫ضغ عٍّخ األسزؼالَ داخٍٗ لّٕب ثؼ‬ٚٚ Cursor ‫وً ِبفؼٍٕبٖ إٔب ثذالً ِٓ ػًّ اٌــ‬ -
. ‫ٌىٓ ٌيس ثٕفس اٌسشػخ‬ٚ ٗ‫ظيف‬ٌٛ‫َ ثٕفس ا‬ٛ‫ رم‬ٝ٘ٚ ‫ فمظ‬for Loop ‫اٌــ‬

. Cursors with Subqueries ‫ اعخخذاَ اٌــ‬ٍٝ‫ ِزاي ػ‬


DECLARE
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;
BEGIN ………
: ‫ظت‬ٛ‫ٍِغ‬
. ٓ‫ظفي‬ِٛ 3 ٜٚ‫ يسب‬ٚ‫ظفيٓ اوجش ِٓ ا‬ِٛ ‫ب‬ٙ‫ ث‬ٝ‫اسّبء األداساد اٌز‬ٚ َ‫ اسلب‬ٛ٘ Cursor ‫ٔبرظ ٘زا اٌـ‬ -

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

Cursors with Parameters


. ‫ارظ‬ٌٕٛ‫ ٌزغييش ا‬Parameters ‫ ػٓ عشيك إدخبي‬Cursor ‫اٌفبئذح ِٕٗ إٔب ٔسزغيغ رغييش اٌميُ إٌبرغخ ػٓ اٌـ‬ -

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

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

CHAPTER 8
Handling Exceptions

‫ب يزُ اٌزؼبًِ ِغ‬ٙ‫في‬ٚ ‫ب ِشؽٍخ ٘بِخ‬ٕٙ‫ٌى‬ٚ ‫ب‬ٕٙ‫ ِشؽٍخ إخزيبسيخ ٔسغزيغ األسزغٕبء ػ‬ٝ٘ ‫وّب روشٔب ِٓ لجً اْ ٘زٖ اٌّشؽٍخ‬ -
‫ب ؽيش اْ األخغبء‬ٙ‫لشأر‬ٚ ‫ ب‬ّٙٙ‫س يسزغيغ ف‬ٛ‫بس٘ب ٌٗ ثظ‬ٙ‫إظ‬ٚ ‫ب‬ٙ‫ِؼبٌغز‬ٚ ٝ‫بئ‬ٌٕٙ‫ش ٌٍّسزخذَ ا‬ٙ‫ ِّىٓ اْ رظ‬ٝ‫األخغبء اٌز‬
. ‫سح ثسيغخ‬ٛ‫ش٘ب ٌٗ ثظ‬ٙ‫ب ٌزٌه ٔظ‬ّٙٙ‫ ف‬ٝ‫بئ‬ٌٕٙ‫ساوً اليسزغيغ اٌّسزخذَ ا‬ٚ‫ش ِٓ ا‬ٙ‫ رظ‬ٝ‫اٌز‬

Predefined Oracle Server


‫ٔض‬ٚ ُ‫ايضبً سل‬ٚ Error ‫ُ إسُ ٌٍـ‬ٙ‫ْ ٌذي‬ٛ‫يى‬ٚ ٓ‫سي‬ٛٙ‫ُ٘ اٌّش‬ٚ ً‫ساو‬ٚ‫ُ ِٓ لجً ا‬ٙ‫ ِزؼبسف ػٍي‬Error 21 ٌٝ‫ا‬ٛ‫ٕ٘بن ؽ‬ -
. ‫ٌٍشسبٌخ‬

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

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

‫ٌىٓ ِغ وزبثخ اٌــ‬ٚ ‫ اْ ٕ٘بن اوضش ِٓ شخض‬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 ‫َ ثغجبػخ‬ٛ‫رم‬

SQLCODE Error ‫ بشلُ اٌـ‬ٝ‫حأح‬

SQLERRM Error ‫ بٕض سعاٌت اٌـ‬ٝ‫حأح‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

ُٙ‫ ِخؼاٌشف ػٍي‬Error 21 ‫ا‬ٙٔ‫وّا لٍٕا ِٓ لبً ا‬ٚ ‫سة‬ٛٙ‫اٌّش‬ٚ ‫ا‬ٙ‫ اٌّخؼاسف ػٍي‬Errors ‫َ األْ بؼشع اٌـ‬ٛ‫ف ٔم‬ٛ‫ع‬ٚ
: ٝ‫ُ٘ واألح‬ٚ

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

Non predefined Oracle Server


‫ٌىٓ اٌّشىٍخ إٔب الٔسزغيغ إٌذاء‬ٚ ٌٗ‫ٌذيٗ سسب‬ٚ ُ‫ٌذيٗ ثبٌغجغ سل‬ٚ ُ‫ ال يّزٍه اس‬ٜ‫يخ ا‬ٛ٘ ‫ اليّزٍه‬Error ‫ ٘زٖ اٌؾبٌٗ اٌـ‬ٝ‫ف‬ -
‫ٔضغ‬ٚ Error ‫ أٗ يؾًّ ثذاخٍخ‬ٜ‫ ا‬Exception ‫ع‬ٌٕٛ‫َ ثؼًّ ِزغيش ِٓ ا‬ٛ‫ػٍيٗ ألْ ٌيس ٌٗ إسُ ٌزٌه ٔم‬
ً‫ داخ‬Error ‫رضغ اٌــ‬ٚ ‫ رشثظ‬ٝ‫ اٌز‬ٝ٘ٚ Paragma ‫ ثبٌـ‬ّٝ‫ ثذاخٍٗ ػٓ عشيك ِبيس‬Error‫اٌـ‬
Variable‫اٌـ‬
‫ ؟‬Not Null ‫د‬ّٛ‫ ػ‬ٝ‫ ف‬Null ‫ٌٕب اضبفخ ليّخ‬ٚ‫ يؾذس ارا ؽب‬ٜ‫ِبٌز‬ -

ً‫ داخ‬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;

User Defined Exceptions


- : ‫وهما نىعان‬

Raise Raise_Application_Error

ٌُٚ ً‫د ٌُ يغجك فؼٍيب‬ٛ‫ٌىٓ اٌى‬ٚ PL/SQL Procedural Successfully ‫ش ٌٕب‬ٙ‫عذ ِشىٍخ ألٔٗ يظ‬ٛ‫٘زٖ اٌّشح الر‬ -
‫ب ٔغؾذ فؼٓ عشيك‬ٙٔ‫ش ا‬ٙ‫ضؼ اْ اٌؼؼٍّيخ ٌُ رزُ يظ‬ٛ‫ ي‬Error ‫ش ٌٕب‬ٙ‫ٌىٕٗ ثذالً ِٓ اْ يظ‬ٚ ‫ة‬ٍٛ‫ رٕفيز اٌّغ‬ٝ‫يٕغؼ ف‬

. ُ‫ضؼ اْ اٌؼٍّيخ ٌُ رز‬ٛ‫بس سسبٌخ ر‬ٙ‫ اظ‬ٍٝ‫ة ِٕٗ فإٕٔب ٔغجشح ػ‬ٍٛ‫د اٌّغ‬ٛ‫ٔسزغيغ ارا ٌُ يٕفز اٌى‬ Raise َ‫اسزخذا‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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 ‫ اٌـ‬ٌٝ‫ ا‬ٜ‫س‬ّٛ‫اٌّي‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

PLSQL
Program Units

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

CHAPTER 1
Creating Stored Procedures

‫ ِغ إخزالف ثسيظ‬Anonymous ‫ن اٌــ‬ٍٛ‫يٕٗ شجيٗ ثبٌج‬ٛ‫رى‬ٚ Subprogram ‫ يؼزجبس اؽذ افشاد ػبئٍخ اٌـ‬ٚ ‫وبد‬ٍٛ‫اع اٌج‬ٛٔ‫ع ِٓ ا‬ٛٔ ٛ٘ -
‫ وّب‬ٝ‫اٌجبل‬ٚ Variables ‫ رؼشيف‬ٌٝ‫ ٌُ ٔضغش ا‬ٌٛ ٝ‫ ؽز‬As ٚ‫ ا‬Is ِٕٗ ً‫ٔسزخذَ ثذال‬ٚ Declare ‫ الٔسزخذَ اٌــ‬Procedure ‫ِغ اٌــ‬
Database ‫ اٌــ‬ٝ‫إٌذاء ػٍيٗ اوضش ِٓ ِشحألٔٗ ِخضْ ف‬ٚ ‫ٔسزغيغ رٕفيزح‬ٚ ‫اؽذح‬ٚ ‫د ِش ح‬ٛ‫َ ثىزبثخ اٌى‬ٛ‫ إٔب ٔم‬Procedure ‫ِيضح اٌــ‬ٚ ٛ٘
... ‫ ال‬ٚ‫د ثميّخ ا‬ٛ‫ أٗ ِّىٓ اْ يؼ‬ٜ‫ ا‬... ٕٗ‫د ٘زا األعشاء ثميّخ ِؼي‬ٛ‫ اْ يؼ‬ٜ‫س‬ٚ‫ٌىٕٗ ٌيس ِٓ اٌضش‬ٚ

‫ ؟‬Anonymous Block ‫اٌــ‬ٚ Subprogram (Procedure , Function) ‫ ِاٌفشق بيٓ اٌـ‬

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 ‫َ ثىزبثخ‬ٛ‫د ٔم‬ٛ‫ع‬ٌّٛ‫ ٌّؼشفخ اٌخغأ ا‬-

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

‫َ باػافت اداسة صذيذة ؟‬ٛ‫ حم‬Procedure ًّ‫ لُ بؼ‬


CREATE PROCEDURE Add_Dept
IS
V_Dept_Id Number := 280 ;
V_Dept_Name Varchar2(20) := 'Outbox';
BEGIN
Insert into Departments ( Department_Id,Department_Name)
Values (V_Dept_Id , V_Dept_Name ); DBMS_OUTPUT.PUT_LINE ('Inserted '||
SQL%Rowcount ||' row ');
END;
: ‫ّ٘ا‬ٚ ٓ‫اْ اسدٔا اْ ٕٔفز٘ا فاْ رٌه يخُ بـشيمخي‬ٚ ‫ا ٌُ حٕفز بؼذ‬ٕٙ‫ٌى‬ٚ Procedure ًّ‫زا اٌشىً لذ ِٕا بؼ‬ٙ‫ب‬
- Execute Add_Dept ;

- BEGIN
Add_Dept ;
END;
: ‫ظت‬ٛ‫ٍِغ‬
. ً‫سِض ِغخمبال‬ٛ‫ اٌف‬ٝ‫ ال حؼًّ ف‬ٌٝٚ‫ يفؼً ئعخخذاَ اٌـشيمت اٌزأيت ألْ اٌـشيمت األ‬-

Parameters
‫ ثؼذ إسُ اٌـ‬Parameter ‫َ ثزؼشيف اٌــ‬ٛ‫ٔم‬ٚ ‫َ ثؾًّ اٌميّخ‬ٛ‫ب اِب اٌّزغيش فيم‬ٍٙ‫ٌىٕٗ رّشس اٌميّخ فمظ داخ‬ٚ ‫ٗ ثبٌّزغيشاد‬ٙ‫ شجي‬ٝ٘ -
. Length ‫اليأخز‬ٚ Procedure

P_Name Varchar2(20) x P_Name Varchar2 √

- : ٝ٘ٚ ‫اع‬ٛٔ‫ ٌٗ ا‬Parameter ‫اٌـ‬ٚ 

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

: ‫ظت‬ٛ‫ٍِغ‬
: ً‫ ؽبٌخ األٔشبء ِض‬ٝ‫ ف‬Parameter ‫ اٌــ‬ٛ٘ - : Parameters Formal -
Create Procedure Add_Name (P_Name Varchar2 )
: ً‫ ؽبٌخ إػغبء ليّخ ٌٗ ِض‬ٝ‫ ف‬Parameter ‫ اٌــ‬ٛ٘ - : Actual Parameters -
BEGIN
Add_Name („ Mo7amed Reda‟);
END;

Using IN Parameters: Example


‫زٖ إٌغبت ؟‬ٙ‫ ِشحبٗ ب‬ٝ‫ باٌخؼذيً ف‬ٝ٘ َٛ‫حم‬ٚ ‫افض‬ٛ‫ٔغبت اٌغ‬ٚ ‫ظف‬ٌّٛ‫ا سلُ ا‬ٙ‫َ باػـائ‬ٛ‫ ٔم‬Procedure ًّ‫َ بؼ‬ٛ‫ ل‬
CREATE OR REPLACE PROCEDURE Raise_Salary
( P_Id IN Employees.Employee_Id%Type, P_Percent IN Number)
IS
BEGIN
Update Employees
Set Salary = Salary + (Salary * P_Percent)
Where Employee_Id = P_Id;
END Raise_Salary;
:‫ٌخٕفيز٘ا‬ٚ
BEGIN
Raise_Salary ( 100 , .4 );
END;

Using OUT Parameters: Example


‫ِشحبٗ ؟‬ٚ ّٗ‫ حؼـيٕا ئع‬ٝ٘ٚ ‫ظف‬ٌّٛ‫ا سلُ ا‬ٙ‫َ باػـائ‬ٛ‫ ٔم‬Procedure ًّ‫ لُ بؼ‬
CREATE OR REPLACE PROCEDURE Query_Emp
(P_Id IN Number ,P_Name OUT Varchar2, P_Sal OUT Number)
IS
BEGIN
Select Last_Name, Salary Into P_Name, P_Sal
From Employees
Where Employee_Id = P_Id;
END Query_Emp;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

: ‫ٌخٕفيز٘ا‬ٚ
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 ًّ‫ الثذ ِٓ ػ‬-

Using IN OUT Parameters: Example


‫( ؟‬010)0984-455 ً‫زا اٌشى‬ٙ‫اسيذ اعخخشاصٗ ب‬ٚ ً‫باي‬ِٛ ُ‫ف أػـيه سل‬ٛ‫ ع‬

CREATE OR REPLACE PROCEDURE Format_Phone


(P_Phone_No IN OUT Varchar2)
IS
BEGIN
P_Phone_No := '(' || Substr (P_Phone_No,1,3) ||
')' || Substr (P_Phone_No,4,3) ||
'-' || Substr (P_Phone_No,7);
END ;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

- :‫ٌخٕفيز٘ا‬ٚ
DECLARE
V_Phone Varchar2(20) := '01009844556';
BEGIN
Format_Phone (V_Phone );
DBMS_OUTPUT.PUT_LINE (V_Phone );
END;
: ‫ظت‬ٛ‫ٍِغ‬
In Out ‫ع‬ٌٕٛ‫ ِٓ ا‬Parameter ‫ب‬ٙ‫ ث‬Procedure ‫ اٌــ‬ٍٝ‫َ ثبٌٕذاء ػ‬ٛ‫ ػٕذِب ٔم‬Variable ًّ‫ الثذ ِٓ ػ‬-

Syntax for Passing Parameters

- : ً‫ ثأوضش ِٓ شى‬Parameters ‫ اٌــ‬ٍٝ‫ ٔسزغيغ إٌذاء ػ‬-

Positiona Procedure ‫ اٌـ‬ٝ‫د ف‬ٛ‫ص‬ٌّٛ‫ بٕفظ اٌخشحيب ا‬Parameter ‫ػغ ليُ اٌـ‬ٛ‫َ ب‬ٛ‫(اٌخشحيب) ٔم‬

: ٗ‫اسة اٌميُ ةاٌخاطت ب‬ٛ‫بض‬ٚ Parameter ‫َ بىخابت ئٍَ اٌـ‬ٛ‫(األعُ) ٔم‬


Named
P_Name => „Mo7amed Reda‟
Combination ً‫َ بىخابت اٌميُ باٌـشيمخيٓ اٌغابمخيٓ ِؼا‬ٛ‫اٌخشحيب) ٔم‬ٚ ٍَ‫(األ‬

‫ ؟‬1 ‫حضيذ بّؼذي‬ٚ 1111 ِٓ ‫ حبذأ‬Sequence ‫ لُ بأشاء‬


Create Sequence Reda_Seq Start With 1000 Increment By 1 ;
‫ا باٌزالد ؿشق‬ٙ‫َ بإٌذاء ػٍي‬ٛ‫ِشحبٗ رُ ل‬ٚ ّٗ‫ حؼـيٕا ئع‬ٝ٘ٚ ‫ظف‬ٌّٛ‫ا سلُ ا‬ٙ‫َ باػـائ‬ٛ‫ ٔم‬Procedure ًّ‫ لُ بؼ‬
‫اٌغابمت ؟‬

CREATE OR REPLACE PROCEDURE Add_Dept


( P_Name Varchar2, P_Loc IN Number )
IS
BEGIN
Insert Into Departments ( Department_Id, Department_Name,
Location_Id)
Values (Reda_Seq.Nextval , P_Name, P_Loc);
END Add_Dept;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

- : ‫ٌٍخٕفيز‬
• 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
‫ايضبً ِٓ خالي‬ٚ ‫ ٘زا اٌظذد‬ٝ‫رؼشضٕب ألِضٍخ وضيشح ف‬ٚ 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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

Viewing Procedures in the Data Dictionary

‫ا‬ٍّٙ‫ لّج بؼ‬ٝ‫ اٌخ‬Procedure ‫ لذ لّج بىخابخٗ داخً اٌـ‬ٜ‫د اٌز‬ٛ‫ِؼشفت اٌى‬ٚ ‫ ٌشؤيت‬-
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';

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

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

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

‫ حؼـيٕا ِشحب ؟‬ٝ٘ٚ ‫ظف‬ٌّٛ‫ا سلُ ا‬ٙ‫ ٔؼـي‬Function ًّ‫ لُ بؼ‬


CREATE OR REPLACE FUNCTION Get_Sal ( P_Id Number )
RETURN Number
IS
V_Sal Number:= 0;
BEGIN
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
BEGIN
RETURN (P_Value * 0.08);
END Tax;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

: ‫ٌخٕفيز٘ا‬ٚ
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;

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

:‫ٌخٕفيز٘ا‬ٚ
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 ;

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';

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

CHAPTER 3
CREATING PACKAGES
: ‫األ٘ذاف‬
. ‫ب‬ٙ‫ٔبر‬ٛ‫ِى‬ٚ Backage ‫ اٌــ‬ٍٝ‫اٌزؼشف ػ‬ 
.Exceptions – Functions – Procedures – Cursors – Variables ِٓ ‫ػخ‬ّٛ‫ رزضّٓ ِغ‬Backage ‫أشبء‬ 
. Backage ‫رشغيً اٌــ‬ٚ ‫ ويفيخ اسزذػبء‬ٍٝ‫اٌزؼشف ػ‬ 

: ‫ّ٘ا‬ٚ ٓ‫ ِٓ صضئي‬Backage ‫ْ اٌـــ‬ٛ‫حخى‬


Body )2 Specification )1

. ً‫ال‬ٚ‫ ا‬Body ‫ ؽيش أٗ اليّىٓ اشبء اٌـ‬Body ‫َ ثإٔشبء اٌــ‬ٛ‫الً صُ ٔم‬ٚ‫ ا‬Specification ‫ الؽظ أٗ الثذ ِٓ اشبء اٌــ‬-
ٓ‫ٌى‬ٚ (Public ‫ (اٌغضء اٌـ‬Specification ‫ اٌــ‬ٝ‫دُ٘ ف‬ٛ‫ع‬ٚ ‫ ثششط‬Function ٚ‫ ا‬Procedure ٜ‫( أل‬Call) ًّ‫ ػ‬ٚ‫ يّىٕه إسزذػبء ا‬-
. )‫ فمظ‬Private ‫ فمظ (اٌغضء اٌـ‬Package Body ‫ اٌـ‬ٝ‫ديٓ ف‬ٛ‫ع‬ٌّٛ‫ ا‬Function ٚ‫ ا‬Procedure ‫اليّىٓ أسزذػبء‬

: ‫ اٌشعُ اٌغابك‬ٝ‫ ف‬-


. Specification ‫ اٌـ‬ٝ‫ ف‬Procedure ‫) ؽيش رُ رؼشيف ٘زٖ اٌــ‬Procedure A( ‫ ػٓ عشيك اٌــ‬Backage ‫يّىٕٕب إسزخذاَ اٌـ‬ 
. Specification ‫ اٌـ‬ٝ‫ ف‬Procedure ‫) ؽيش ٌُ رؼشف ٘زٖ اٌــ‬Procedure B( ‫ ػٓ عشيك اٌــ‬Backage ‫اليّىٕٕب إسزخذاَ اٌـ‬ٚ 
. ً‫ساو‬ٚ‫ عضئيٓ ِٕفظٍيٓ داخً األ‬ٝ‫ ف‬Backage ‫ اٌخبطيٓ ثبٌــ‬Body ‫اٌــ‬ٚ Specification ‫الؽظ أٗ يزُ ؽفظ اٌــ‬ 

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

- : Backage ‫د اٌخاص باٌــ‬ٛ‫ساوً بخٕفيز اٌى‬ٚ‫َ ا‬ٛ‫ ويف يم‬-

. Text File ٝ‫الً ف‬ٚ‫د ا‬ٛ‫يزُ وزبثخ اٌى‬ )1


. Isql*plus Environment. ‫ اٌـ‬ٌٝ‫ رُ وزبثزٗ ا‬ٜ‫د اٌز‬ٛ‫ ٌٍى‬Load ًّ‫يزُ ػ‬ )2
ٝ‫ارا وبْ ف‬ٚ Database ‫ اٌــ‬ٝ‫ ف‬Backage ‫د سٍيُ يزُ رخضيٓ اٌـ‬ٛ‫ ارا وبْ اٌى‬Backage ‫ ٌٍـ‬Compile And Store ًّ‫يزُ ػ‬ )3
‫رٌه ٌّؼشفخ اٌــ‬ٚ Show Errors ‫َ ثىزبثخ األِش‬ٛ‫ٌشؤيخ اٌخغأ ٔم‬ٚ ‫ب اخغبء‬ٙ‫عذ ث‬ٛ‫ ي‬Backage ‫ اْ اٌـ‬ٜ‫ خغأ سٕش‬ٜ‫د ا‬ٛ‫اٌى‬
. Compilation Errors
. Body ‫اٌــ‬ٚ Specification ‫ ٌىً ِٓ اٌــ‬Execute ًّ‫يزُ ػ‬ )4

Backage Specification ‫ئٔشاء اٌـ‬

َٛ‫ ثذالً ِٓ اْ ٔم‬Backage Specification ‫ اٌــ‬ٝ‫ رؼذيً ف‬ٜ‫ ٔزّىٓ ِٓ ػًّ ا‬ٝ‫ ب ؽز‬ٙ‫َ ثىزبثز‬ٛ‫ٔم‬ٚ ‫ إخزيبسيخ‬ٝ٘ : Or Replace -
. ‫ب‬ٙ‫ب صُ اٌزؼذيً في‬ٙ‫ثإصاٌز‬
ٓ‫ُ ثؼذ رٌه ػ‬ِٙ‫يّىٓ إسزخذا‬ٚ Specification ‫ اٌــ‬ٝ‫ُ ف‬ٙ‫ ؽيش يزُ رؼشيف‬Function ‫اٌـ‬ٚ Procedure ‫ اٌــ‬: Subprogramme -
. Backage ‫عشيك اٌــ‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


PL/SQL Course

Parameters Description
Package_name Package ‫ح ؼبش ػٓ األعُ اٌخاص باٌــ‬
Public Type and item Declare
Declaration Variable, Cursor, Constant , Exception , or Types
Subprogram Specification Function ‫ اٌــ‬ٚ Procedure ‫حؼشيف والً ِٓ اٌــ‬

: ‫ِزاي‬
Comm ‫ْ اٌــ‬ٛ‫ اٌششوخ الثذ أْ يى‬ٝ‫ظف عذيذ يزُ رؼييٕٗ ف‬ِٛ ٜ‫َ ثبٌزأوذ ِٓ أْ ا‬ٛ‫ رم‬Package ‫ أشبء‬ٛ٘ ٌٝ‫ذف ِٓ اٌّضبي اٌزب‬ٌٙ‫ ا‬-
. ‫ اٌششوخ‬ٝ‫ ف‬Comm ‫اٌخبص ثٗ الً ِٓ اوجش‬

0.10 ‫يأخز ليّخ إفزشاضيخ‬ٚ G_comm ُ‫ ثإس‬Variable ‫ رُ رؼشيف‬-


. Number ٗ‫ػ‬ٛٔ ‫اؽذ‬ٚ Parameter ‫ب‬ٌٙ Reset_comm ُ‫ ثإس‬Procedure ‫أيضبً رُ رؼشيف‬ٚ -
Specification ‫ اٌــ‬ٝ‫ُ ف‬ٙ‫رٌه ألٔٗ رُ رؼشيف‬ٚ public ‫ع‬ٌٕٛ‫ األصٕبْ ِٓ ا‬Reset_comm ‫اٌــ‬ٚ G_comm ‫ْ اٌـــ‬ٛ‫ يى‬ٌٝ‫ث بٌزب‬ٚ -
. Package Body ‫ إٔشبء اٌــ‬-

ُ‫ب ص‬ٙ‫َ ثإصاٌز‬ٛ‫ ثذالً ِٓ اْ ٔم‬Backage Body ‫ اٌــ‬ٝ‫ رؼذيً ف‬ٜ‫ ٔزّىٓ ِٓ ػًّ ا‬ٝ‫ب ؽز‬ٙ‫َ ثىزبثز‬ٛ‫ٔم‬ٚ ‫ إخزيبسيخ‬ٝ٘ : Or Replace -
. ‫ب‬ٙ‫اٌزؼذيً في‬
‫َ ٕ٘ب‬ٛ‫ٔم‬ٚ ُٙ‫ ال يزُ رؼشيف‬ٚ‫ ا‬Specification ‫ اٌــ‬ٝ‫ُ ف‬ٙ‫ ؽيش يزُ رؼشيف‬Function ‫اٌـ‬ٚ Procedure ‫ اٌــ‬: Subprogramme -
. Backage Body ‫ اٌــ‬ٝ‫ُ ف‬ٙ‫د اٌخبص ث‬ٛ‫ثىزبثخ اٌى‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


‫‪PL/SQL Course‬‬

‫حابغ اٌّزاي اٌغابك ‪:‬‬

‫ٔم‪ َٛ‬داخً اٌــ ‪ Package Body‬بأشاء أ‪ Subprogramme ٜ‬ح ُ حؼشيف‪ٙ‬ا ف‪ ٝ‬اٌــ ‪ Specification‬ا‪ ٌُ ٚ‬يخُ حؼشيف‪ٙ‬ا وّا ف‪ ٝ‬اٌّزاي اٌغابك ‪.‬‬ ‫‪-‬‬

‫ٍِغ‪ٛ‬ظت ‪:‬‬
‫‪ -‬يغت اْ يى‪ ْٛ‬إسُ اٌــ ‪ Package‬ف‪ ٝ‬اٌغضء األ‪ٚ‬ي )‪ٔ ٛ٘ (Specification‬فس األسُ ف‪ ٝ‬اٌغضء اٌضبٔ‪. (Body) ٝ‬‬

‫‪ -‬ويف يّىٓ ئعخذػاء ‪ٚ‬حشغيً اٌــ ‪. Package‬‬

‫‪ -‬ف‪ ٝ‬اٌّضبي اٌسبثك رُ رٕفيز اٌــ ‪ Package‬ػٓ عشيف ٔفس اٌّسزخذَ ا‪ ٚ‬اٌــ ‪ USER‬اٌز‪ ٜ‬لبَ ثإٔشبؤ٘ب ‪.‬‬
‫‪ -‬ا‪ ٞ‬اسُ اٌؾضِخ ا‪ٚ‬ال صُ ٔمغخ صُ اسُ االعشاء ا‪ ٚ‬اٌ‪ٛ‬ظيفخ ‪.‬‬

‫‪ -‬ف‪٘ ٝ‬زا اٌّضبي رُ رٕفيز اٌــ ‪ Package‬ػٓ عشيك ِسزخذَ اخش ِضً ‪ٚ SCOTT‬رٌه ػٓ عشيك ِٕؼ ٘زا اٌّسزخذَ اٌــ ‪ Privilage‬ا‪ٚ‬‬
‫اٌظالؽيخ إٌّبسجخ ٌٗ ٌى‪ ٝ‬يزّىٓ ِٓ إسزخذاَ ٘زٖ اٌــ ‪. Package‬‬

‫‪Eng. Mo7amed Reda‬‬ ‫‪E-mail:Dev-reda@hotmail.com‬‬ ‫‪Mobil: 01066734381‬‬


‫‪PL/SQL Course‬‬

‫‪ -‬حؼشيف ‪ Package‬بذ‪. Package Body ْٚ‬‬


‫ِزاي ‪:‬‬

‫‪ -‬ف‪٘ ٝ‬زا اٌّزاي لّٕا بخؼشيف ‪ Variables‬داخً اٌـــ ‪ٚ Package Specification‬باٌخاٌ‪ ٝ‬حى‪٘ ْٛ‬زٖ اٌــ ‪ ِٓ Variable‬إٌ‪ٛ‬ع اٌــ ‪Global‬‬
‫‪ٚ‬لذ لّٕا بأشاء اٌــ ‪ Package‬اٌغابمٗ ‪ ٝ٘ٚ‬حغخ‪ ٜٛ‬ػٍ‪ِ ٝ‬ضّ‪ٛ‬ػت ِٓ اٌـ ‪٘ٚ Variables‬زٖ اٌــ ‪ Variables‬حغخ‪ ٜٛ‬ػٍ‪ ٝ‬ليُ ئفخشاػيت ‪.‬‬
‫‪ -‬رُ ٔم‪ َٛ‬بأشاء اٌــ ‪ Procedure‬اٌخاٌيت ‪ ٝ٘ٚ‬ح‪ٛ‬ػظ ئِىأيت ئعخخذاَ اٌــ ‪ Package‬داخً اٌــ ‪. Procedure‬‬

‫‪Removing Package‬‬

‫عزف اٌـ ‪: Package‬‬


‫‪ -‬ػشفٕا عابم اً اْ اٌــ ‪ِ Package‬مغّٗ اٌ‪ ٝ‬صضئيٓ (سأط ‪(ٚ ( Specification‬صغُ ‪(Body‬‬
‫‪ٌ -‬زٌه يّىٓ ئصاٌت اٌضغُ ‪ٚ Body‬بماء اٌشأط ‪ Specification‬حؼًّ بذ‪ ْٚ‬اٌضغُ ‪ٚ‬رٌه ٌٍىائٕاث اٌخ‪ٌ ٝ‬يظ ٌ‪ٙ‬ا ػاللت ا‪ِ ٚ‬شحبـت باٌــ ‪Body‬‬
‫ِزً اٌّخغيشاث اٌخ‪ٌٙ ٝ‬ا ليُ ئبخذائيت ‪ٚ‬اٌـ ‪ٚExceptions‬اٌـــ ‪ Cursors‬اِا األصشاءاث ‪ ٚ‬اٌذ‪ٚ‬اي فأٔ‪ٙ‬ا الحؼًّ ‪ٚ‬حٕخش خـأ ‪.‬‬

‫‪Eng. Mo7amed Reda‬‬ ‫‪E-mail:Dev-reda@hotmail.com‬‬ ‫‪Mobil: 01066734381‬‬


‫‪PL/SQL Course‬‬

‫ٍِغ‪ٛ‬ظت ‪:‬‬
‫ػٕذ عزف اٌــ ‪ Package Specification‬يخُ عزف اٌــ ‪ Body‬بـشيمت أح‪ِٛ‬احيىيت ‪.‬‬

‫ِضايا اعخخذاَ اٌــ ‪: Package‬‬


‫‪ )1‬يّىٕه حضّيغ بؼغ اٌــ ‪ Subprogramme‬اٌّشحبـت ببؼؼ‪ٙ‬ا ف‪ٚ Package ٝ‬اعذة ‪.‬‬
‫‪ )2‬يّىٓ ػًّ ئخفاء ٌٍى‪ٛ‬د )‪ ِٓ (Hiding Information‬خالي اٌــ ‪ٚ Package‬رٌه ف‪ ٝ‬اٌضضء اٌــ ‪. Private‬‬
‫‪ )3‬اداء افؼً ‪.‬‬
‫‪ )4‬اُ٘ ش‪ٝ‬ء ٘‪ ٛ‬ػٍّيت اٌظيأٗ عيذ حغ‪ ًٙ‬ػٍّيت اٌظيأت بأعخخذاَ اٌـــ ‪ Backage‬ا‪ ٚ‬اٌغضَ ‪.‬‬

‫‪Eng. Mo7amed Reda‬‬ ‫‪E-mail:Dev-reda@hotmail.com‬‬ ‫‪Mobil: 01066734381‬‬


‫‪PL/SQL Course‬‬

‫‪CHAPTER 4‬‬
‫‪More Package Concepts‬‬
‫‪ ‬ػٍّيت اٌــ ‪- : Overloading‬‬
‫رزيؼ ٘زٖ اٌؼٍّيخ إسزخذاَ ٔفس األسُ ٌؼذح ‪ Procedures‬ا‪ Functions ٚ‬داخً ٔفس اٌــ ‪٘ٚ Package‬زٖ اٌؼٍّيخ رغٍت اْ يى‪ٕ٘ ْٛ‬بن‬ ‫‪-‬‬
‫إخزالف ثيٓ ٘زٖ اٌــ ‪ Subprogramme‬ف‪ ٝ‬ػذد اٌــ ‪ Parameters‬ا‪ ٚ‬رشريج‪ ُٙ‬ا‪ ٚ‬أ‪ٛ‬اع ثيبٔبر‪ ُٙ‬وّب س‪ٛ‬ف يزُ ششؽٗ ‪ٚ‬رزيؼ ٘زٖ‬
‫اٌؼٍّيخ وزبثخ ‪ٚ‬رغ‪ٛ‬يش اٌجشاِظ ثّش‪ٔٚ‬خ اوضش ‪.‬‬
‫الؽظ اْ ٘زٖ اٌؼٍّيخ اليّىٓ اْ رؾذس ٌــ ‪ Procedures‬ا‪ Functions ٚ‬خبسط اٌـ ‪. Package‬‬ ‫‪-‬‬
‫٘زٖ اٌؼٍّيخ رّىٓ اٌّجشِظ ِٓ رؼشيف ػذح ثشِغيبد ِخزٍفخ ثٕفس األسُ داخً ٔفس اٌــ ‪ٚ. Package‬يزُ اٌزفشيك ‪ٚ‬اٌزؼشف ػٍ‪ ٝ‬اٌـ‬ ‫‪-‬‬
‫‪ Subprogramme‬اٌّشاد إسزخذاِٗ ث‪ٛ‬اسغخ األخزالف ف‪ ٝ‬ػذد اٌـ ‪ Parameters‬ا‪ٛٔ ٚ‬ع اٌجيبٔبٔبد ٌ‪ٙ‬زٖ اٌــ ‪ Parameters‬ا‪ٚ‬‬
‫رشريج‪. ُٙ‬‬

‫‪ٍِ ‬غ‪ٛ‬ظٗ ‪:‬‬


‫الرزُ ػٍّيخ اٌــ ‪ Overloading‬ارا وبْ األخزالف فمظ ثيٓ اٌــ‪ Parameters‬ف‪ٛٔ ٝ‬ع اٌجيبٔبد ‪٘ٚ‬زٖ اٌجيبٔبد ِٓ ٔفس اٌؼبئٍخ ِضً‬ ‫‪-‬‬
‫(‪ّ٘ ) Number , Decimal‬ب ِٓ ٔفس ػبئٍخ إٌ‪ٛ‬ع اٌشلّ‪ٔ ِٓ ُ٘ ) Varchar2, char ( ٚ ٝ‬فس ػبئٍخ إٌ‪ٛ‬ع اٌؾشف‪. ٝ‬‬
‫اْ يى‪ ْٛ‬األخزالف فمظ ف‪ ٝ‬اٌميّخ اٌّشعؼخ )‪ٚ (Return‬رٌه ف‪ ٝ‬اٌذ‪ٚ‬اي ؽز‪ ٌٛ ٝ‬وبْ أ‪ٛ‬اع ثيبٔبد اٌشع‪ٛ‬ع ِٓ ػبئالد ِخزٍفخ ‪.‬‬ ‫‪-‬‬
‫ارا ؽذس ِبسجك ِٓ ِالؽظبد يؾذس خغبء ‪ٚ‬اليؾذس ػٍّيخ ‪. Overloading‬‬ ‫‪-‬‬

‫ِزاي ػٍ‪ ٝ‬اٌــ ‪: Overloading‬‬

‫ث‪ٙ‬زا ٔى‪ ْٛ‬لذ أشأٔب ‪. Package Specification‬‬ ‫‪-‬‬


‫ف‪ ٝ‬اٌّضبي اٌسبثك لذ أ شبؤٔب ‪ Package‬ثذاخٍ‪ٙ‬ب اصٕبْ ‪ Proceure‬ثٕفس األسُ ٌزغجيك اٌـ ‪. Overloading‬‬ ‫‪-‬‬
‫األخزالف ثيٓ اٌـ ‪ ٛ٘ Proceduers‬اْ ‪:‬‬ ‫‪-‬‬
‫اٌـ ‪ Procedure‬األ‪ ٌٝٚ‬رأخز صالصخ ‪. Parameters‬‬ ‫‪-‬‬
‫اٌـ ‪ Procedure‬اٌضبٔيخ رأخز إصٕبْ ‪ Parameter‬فمظ الغيش ‪.‬‬ ‫‪-‬‬

‫‪Eng. Mo7amed Reda‬‬ ‫‪E-mail:Dev-reda@hotmail.com‬‬ ‫‪Mobil: 01066734381‬‬


PL/SQL Course

: ٍٝ‫ وّب ي‬Package Body ‫َ ثإٔشبء اٌــ‬ٛ‫ثؼذ رٌه ٔم‬ -

: ‫ٔزيغخ رٕفيزّ٘ب‬ٚ Package Specification ‫ اٌــ‬ٝ‫ُ ف‬ٙ‫ اٌسبثك رؼشيف‬Proceduers‫رٕفيز وال اٌـ‬ٚ ‫ يجيٓ ويفيخ إسزذػبء‬: ٌٝ‫اٌشىً اٌخا‬

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381


‫‪PL/SQL Course‬‬

‫ِزاي اخش ػٍ‪ ٝ‬اٌــ ‪: 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 ٚ‬لجً األسزخذاَ‪.‬‬

‫‪Eng. Mo7amed Reda‬‬ ‫‪E-mail:Dev-reda@hotmail.com‬‬ ‫‪Mobil: 01066734381‬‬


‫‪PL/SQL Course‬‬

‫فف‪ ٝ‬اٌّضبي اٌسبثك ٔالؽظ ػذَ إِىبٔيخ إسزخذاَ اٌــ ‪ Procedure‬اٌّسّ‪ Calc_rating ٝ‬ؽيش لّٕب ثإسزخذاَ اٌــ‪ Procedure‬لجً‬ ‫‪-‬‬
‫رؼشيفٗ ‪٘ٚ‬زا ِاليّىٓ إسزخذاِٗ ف‪ ٝ‬اٌــ ‪ Pl\SQL‬فٍى‪ٔ ٝ‬زّىٓ ِٓ إسزخذاَ رٍه اٌــ ‪ Procedure‬الثذ ِٓ رؼشيفٗ ا‪ٚ‬الً ف‪ ٝ‬اٌغضء‬
‫اٌخبص ثبٌـــ ‪ Declartion‬صُ ٔم‪ َٛ‬ثؼذ رٌه ثإسزخذاَ ٘زٖ اٌــ ‪ Procedure‬ف‪ ٝ‬اٌغضء اٌخبص ثبٌــ ‪ Body‬وّب ف‪ ٝ‬اٌّضبي اٌزبٌ‪: ٝ‬‬

‫‪ -‬ف‪ ٝ‬اٌّضبي اٌسبثك رُ ِؼبٌغخ رٍه اٌّشىٍخ ‪ٚ‬رٌه ػٓ عشيك رؼشيف )‪ Procedure (Calc_Rating‬ف‪ ٝ‬اٌغضء اٌخبص ثبٌـ‬
‫‪. Declration‬‬
‫‪٘ٚ‬زٖ اٌؼٍّيخ رزيؼ رغّيغ اوضش ِٓ ‪ِ Subprogramme‬شرجغخ ثجؼض‪ٙ‬ب ف‪ٚ Package ٝ‬اؽذح ثؾيش يزُ رؼشيف‪ ُٙ‬ف‪ ٝ‬اٌــ‬
‫‪ Specification‬اٌخبص ثبٌــ‪ٚ Package‬وزبثخ اٌى‪ٛ‬د داخً اٌــ ‪ٚ Body‬رٌه يفيذ ف‪ ٝ‬إخفبء رفبطيً اٌى‪ٛ‬د ا‪ ٜ‬صيبدح ِٓ اٌسشيخ‬
‫)‪. (security‬‬

‫‪Eng. Mo7amed Reda‬‬ ‫‪E-mail:Dev-reda@hotmail.com‬‬ ‫‪Mobil: 01066734381‬‬


PL/SQL Course

Mo7amed Reda Abd El-Rahman


ORACLE FINANCIAL CONSULTANT
INSTRUCTOR ORACLE FINANCIAL R12
INSTRUCTOR ORACLE DEVELOPER
**********************
Scientific Computing Center – Mansoura University
E-mail:mreda47@hotmail.com
https://www.facebook.com/Eng.mohamedreda.scc
Mobile: 01066734381

Eng. Mo7amed Reda E-mail:Dev-reda@hotmail.com Mobil: 01066734381

You might also like