ComplémentsurlelangageSQL
NadhemBelHadjOCADBA
COMPLE
MENT
SURLE
LANGAG
ESQL
1Lesco
ntrainte
sd’intég
ritéSpé
cificatio
nd’une
cléprim
aireCRE
ATETAB
LEnom_table(
Nom_colonne1type_données[NO
TNULL
],… Nom_colonne_ntype_données[NO
TNULL
],[Co
nstraint
nom_contrainte]
[Primar
ykey(n
om_colonneA,nom_colonneB,…,nom_colonneX)]);
ünom_contrainteestunnomoptionnelquiidentifielacontrainte
ünom_colonneAànom_colonneXreprésententlescolonnesquicomposentlacléprimaire
delatable.
Exempl
e:CRE
ATETAB
LELigne_Facture(
NumfactNumber(5),
Codprodvarchar2(5),
QtefactNumber(9,3)NOTNULL
Constra
intCP_LIG_FACT
Primary
key(Numfact,Codprod));
Remarqu
e:LacontrainteNOTNULLn’estpasutiliséepourlescolonnesNumfactetCodprodcarla
contraintePrimaryKeyremplace,entreautre,NOTNULL.
Spécific
ationd’
unecléé
trangère
CREATETABLEnom_table(
Spécification_colonne1,
… Spécification_colonneN,
[Constr
aintnom_contrainte_CEFor
eignKey
(nom_colonneF1,…,nom_colonneFN)
referenc
estable_référence(nom_colonneP1,…,nom_colonnePN),]
[Constraintnom_contrainte_CP]
[Primarykey(nom_colonneA,nom_colonneB,…,nom_colonneX)]);
üSpécification_colonne1
àspécificatin_colonneN
sontlesspécificationsdescolonnes
valides(décritesci-aprèsendétail).
ünom_contrainte_CEestlenomoptionneldelacontraintedecléétrangère.
ünom_colonneF1ànom_colonneFNreprésententlescolonnesquicomposentlaclé
étrangère.
ütable_référencereprésentelatableàlaquelleseréfèreladéclarationdelacléétrangère.
üNom_colonneP1ànom_colonnePNreprésententlacléprimairedelatableréférencée.
Lasyntaxepourspécificationcolonneestlasuivante:
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
ComplémentsurlelangageSQL
NadhemBelHadjOCADBA
nom_colonnetype_données[DEFAULTvaleur_par_défaut]
[Constraintnom_contrainte][NULL]|[NOTNULL]|[UNIQUE]|CHECK(condition)
üvaleur_par_défaulestunevaleuraffectéeàlacolonnelorsd’uneinsertion.
üNom_contraintedésignelenomdelacontrainte.
üConditionestunconditionbooléennequedoitvérifierlesvaleursaffectéesàlacolonne.
Exempl
e:CREATETABLEFacture(
NumfactNumber(5),
Datefactdatedefa
ultSYSDATE,
Mode_paievarchar2(10)Con
straintC
K_modeCHE
CK(mode_paieIN
(‘cheque’,’espèce’)),
Codclivarchar2(5),
ConstraintCP_FACTPrim
arykey
(Numfact),
Constra
intCE_CODCLIFor
eignKey
(Codcli)refe
rencesC
lient(codcli));
2Lesfon
ctionsin
tégrées
deSQL
Manipul
ationde
schaîne
sv
LENGTH
(chaîne):cettefonctionretournelalongueurd’unechaînedansunecolonne
d’unetable.
Exemple
:Selectnomcli,LEN
GTH(nomcli)fromclient;
Silenomest‘ALI’lafonctionretourne3
vSUB
STR(cha
îne,position_départ,nombre_caractères)::cettefonctionpermetd’extraire
uneportiond’une
Exemple
:Selectnomcli,SUB
STR(nomcli,1,4)fromclient;
Silenomest‘mohamed‘lafonctionretourne‘moha’
vREP
LACE(c
haîne,chaîne_existante,[chaîne_remplacement]):cettefonctionsertà
remplacerunechaîneparuneautredansunecolonne.
Exemple
:UpdateCours
Settitre=REPLACE(titre,’séminaire’,’formation’);
Note:si
onnespécifiepaslachaînederemplacement,lachaîneexistanteserasupprimée
delacolonne.
vLTR
IM(chaîne):cettefonctionéliminelesespaces(blanc)dedébutdechaîne
vRTR
IM(chaîne):cettefonctionéliminelesespacesdefindechaîne
vLPA
D(chaîne,n,chaîne_remplissage):cettefonctionpermetdecompléterunevaleurde
chaîneenluiajoutantdescaractèresaudébut.
Øn:estlalonguertotaledelachaîneretournéeparlafonction
Øchaîne_remplissage:estlachaîneplacéeaudébutdechaîne
Exemple
:Silacolonnenomest‘ALI’alorssionappellelafonction:
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
ComplémentsurlelangageSQL
NadhemBelHadjOCADBA
LPAD(nom,5,’*’)
Lerésultatsera‘ALI**’
Note:si
onnespécifiepaslachînederemplissagelachîneseracomplétéepardes
espaces.
vRPA
D(chaîne,n,chaîne_remplissage):cettefonctionfaitlamêmechosequeLPADmais
àlafindelachaîne.
vLOW
ER(chaîne):convertittouslescaractèresdelachaîneenminuscules
vUPP
ER(chaîne):convertittouslescaractèresdelachaîneenmajuscules
vDEC
ODE(expression,valeur1,valeur1_retourné,…,
valeurN,valeurN_retournée
[,valeur_défaut_retournée])
ØvaleurNestunevaleurpossibleàlaquellevaleurNpeutêtreégale.
ØvaleurN_retournéeestlavaleurretournéeparDECODEsiexpressionestégaleà
valeurN.
Øvaleur_défaut_retournéeestlavaleurretournéesiexpressionn’estégaleàaucunedes
valeursdevaleur1àvaleurN.
Exemple:
Selectjour,DECODE(jour,1,’DIM’,2,’LUN’,3,’MAR’,4,’MER’,5,’JEU’,6,’VEN’,7,’SAM’)
Fromvente;
vASC
II(chaîn
e)retournelecodeASCIIdupremiercaractèrede
chaîne.
Manipul
ationde
sdates
Oraclepossèdeuncertainnombredevaleurappeléespseudo-colonnesauquellesilest
possibledeseréférerdansdesinstructionsSQL.UnedecesvaleursestSYS
DATEq
ui
retourneladateactuelle(heurecompriseàlasecondeprès).
Voiciàprésentuntableaucontenantlesformatsdedatepossibles:
Tableau
1:lesfo
rmatsd
edate
Format
Descrip
tionPlag
edevale
ursSS
Seconde
0-59
SSSS
Secondeaprèsminuit
0-86399
MI
Minute
0-59
HH
Heure
0-12
HH24
Heuremilitaire
0-23
DD
Jourdumois
1-31
DAY
Jourdelasemaineenentier
DIMANCHE-SAMDI
DJourdelasemaine
1-7
DDD
Jourdel’année
1-366
MM
Numérodumois
1-12
MON
Moisabrégé
JAN-DEC
MONTH
Moisenentier
JANVIER-DECEMBRE
YY
Deuxdernierschiffresdel’années99parexemple
YYYY
Annéeenentier
1999parexemple
YEAR
Annéeenentier
MIILLENEUFCENTQUATREVI
NGTDIXNEUFparexemple
CC
Siècle
19parexemple
QTrimestre
1-4
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
ComplémentsurlelangageSQL
NadhemBelHadjOCADBA
WSemainedumois
1-5
WW
Semainedel’année
1-52
Remarqu
e:Leformatdedatepardéfautd’oracleestDD-MON-YY,parexemple01-JAN-99.
vTO_
CHAR(v
aleur_date,format_date)cettefonctionpermetdeconvertirunedateenune
chaînedecaractères.
Pourlesformatsdedatevalidesvoirle
tableau
1:lesfo
rmatsde
dateci_dessus.
Exemple
:Selectcodetud,TO_CHAR(date_naiss,’MONTHDD,YYYY’)DATE_NAISS
fromEtudiant;
Unelignerésultatdecetterequêteserait:
Codetud
DATE_NAISS
-------------------------------------------------------------------------
ET001
AVRIL
12,1978
vTO_
DATE(c
haîne,format_date)cettefonctionpermetdeconvertirunechaînede
caractèresenunedate,leparamètreformat_dateestlemêmequelafonction
TO_CHAR.
Exemple
:SelectSYSDATE–TO_DATE(‘07-06-1978’,’MM-DD-YYYY’)fromdual;
Leresultatdecetterequêteest:
SYSDATE-TO_DATE('07-06-1978','MM-DD-YYYY')
------------------------------------------
7882,41
303
Remarqu
e:dualestunetablesystèmeàlaquellel’utilisateurnepeutajouteraucunelignecarcette
tablenedoitcontenirqu’uneseuleligneveillantaufonctionnementcorrectedecertain
outilsOracle.SYSDATEestunecolonnedelatabledual.
Manipul
ationde
snombr
esv
TO_CHA
R(nombre,[,format])cettefonctionpermetdeconvertirunnombreenune
chaînedecaractères,formatestlemodèledeformatoptionnelquelafonctionpeut
utiliser.Pourspécifierlenombredechiffresaffichés,ilfautremplacerchaquechiffrepar
un9commel’indiquelesexemplessuivants:
Exemple
s:Selectcred_cli,TO_CHAR(cred_cli)fromclient;
SelectTO_CHAR(cred_cli,’9,999.99’)fromclient;
SelectTO_CHAR(cred_cli,’09.99’)fromclient;
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
ComplémentsurlelangageSQL
NadhemBelHadjOCADBA
SelectTO_CHAR(cred_cli,’$999.99’)fromclient;
vTO_
NUMBER
(chaîne[,format])cettefonctionpermetdeconvertirunechaîneenun
nombre,formatestlemodèledeformatoptionnelquelafonctionpeututiliser
Exemple:
UpdateproduitsetPuprod=TO_NUMBER(‘$2.81’,’$999.99’)
Wherecodprod=‘po888’;
vROU
ND(valeur,[échelle])cettefonctionpermetd’arrondirunnombre,ellereçoitdeux
paramètres:uneexpressionnumériqueetunnombreoptionnelcorrespondantaunombre
dechiffresutiliséslorsducalculdel’arrondi.Siledeuxièmeparamètren’estpasfournila
fonctionarrondil’expressionnumériqueàl’entierleplusproche.Sienrevancheilest
indiquélavaleurnumériqueseraarrondieaunombredécimalleplusprocheavec,àdroite
delavirgule,lenombredechiffresspécifié(échelle).
Exemple:
SelectROUND(123.2)fromdual;
Lerésultatsera:
ROUND(123.2)
------------
123
SelectROUND(123.27,1)fromdual;
ROUND(123.27,1)
---------------
123,3
SelectROUND(101.8)fromdual;
ROUND(101.8)
------------
102
vTRU
NC(valeur,[échelle])cettefonctionestsimilaireàlafonctionROUND.Toutefois,
aulieud’arrondir,ellesupprimelapartiedécimaledesonparamètrenumérique.
Exemple:
SelectTRUNC(123.33),TRUNC(123.567,2)fromdual;
TRUNC(123.33)TRUNC(123.567,2)
-----------------------------
123
123,56
vFLO
OR(valeur)cettefonctionestpresqueidentiqueàlafonctionTRUNC,àcette
différenceprèsqu’ellenepeuttronquerunnombredécimal.Elleretournel’entierquiest
inférieurouégaleàsonparamètre.
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
ComplémentsurlelangageSQL
NadhemBelHadjOCADBA
Exemple
:SelectFLOOR(128.3),FLOOR(129.8)fromdual;
FLOOR(128.3)FLOOR(129.8)
------------------------
128
129
vCEI
L(valeur)cettefonctionretournel’entierimmédiatementsupérieurouégaleàson
paramètrenumérique.
Exemple
:SelectCEIL(128.3),CEIL(129.8)fromdual;
CEIL(128.3)CEIL(129.8)
----------------------
129
130
vNVL
(valeur_colonne,valeur_substitution)cettefonctionretournevaleur_substitutionsi
valeurcolonneestNULLsinonvaleur_colonne.
Exemple
:Selectcocli,NVL(cred_cli,0)fromclient;
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
LELAN
GAGE
PL/SQL
1/INTR
ODUCTI
ON:
SQLestunlangagecompletpourtravaillersurunebasededonnéerelationnelle,maisilne
comportepasdesinstructionsprocédurales.PL/SQLcomprendquantàlui:
vLapartieLID(Langaged’Interrogationdesdonnées)deSQL(Select),
vlapartieLMD(LangagedeManipulationdesDonnées)deSQL(Update,Insert,…)
vlagestiondestransaction(Commit,Rollback…)
vlesfonctionsstandarddeSQL
vplusunepartieprocédurale(IF,WHILE,…)
PL/SQLestdoncunl
angage
algorith
miquec
omplet
REMARQ
UE:PL
/SQLnecomportepasd’instructionsdeLDD(Create,Alter…)
2/STRU
CTURE
D’UNB
LOCPL/
SQLPL/SQLn'interprètepasunecommande,maisunensembledecommandescontenuesdansun
programmeoublocPL/SQL.
Lastructured’unblocestlasuivante:
DECLAR
EDéclarationsdevariables,constantes,exception;
BEGIN
SectionobligatoirecontenantdesinstructionsSQLetPL/SQLoudesblocsfils(Possibilités
d’imbricationdeblocs)
EXCEPT
IONTraitementdesexceptions(gestiondeserreurs)
END;
REMARQ
UES:
LessectionsDeclareetExceptionsontoptionnelles
Chaqueinstructionden’importequellesectiondoitseterminerparun‘;’
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
Exempled’unblocPL/SQL:
DECLAR
Eqte_stocknumber(5);
BEGIN Selectquantiteintoqte_stockfromPRODUITS
wherecodprod=‘p1’;
--contrôledustocksuffisant
Ifqte_stock>0
thenupdateproduitssetquantite=quantite-1
wherecodprod=‘p1’;
Insertintoachatvalues(‘p1',SYSDATE)
else Insertintoachetervalues('Plusdep1',SYSDATE);
endIf,
commit,
END;
3/.LES
DECLAR
ATIONS
PL/SQL
LapartiedéclarativedansunblocPL/SQL,peutcomportertroistypesdedéclarations.Elle
estdélimitéeparlesmots-clé:
vDEC
LARE,q
uispécifieledébutet
vBEG
IN,quisignifielafindeladéclarationetledébutdelapartiedescommandes.
vLestypesdedéclarationspossiblesdanscettepartiesontlessuivants:
üdéclarationdesvariablesetdesconstantes,
üdéclarationdecurseurs,
üdéclarationdesexceptions.
3.1Types
dedonn
éesChaquevariableouconstanteutiliséedansunblocPL/SQL,possèdeuntypededonnées.
PL/SQLoffredeuxvariétésdetypesdedonnéesprédéfinies:scalaireetcomposé.
Lestype
sscalaire
s:Bin
ary_inte
ger:entiersentre–231et231-1
Number
:unnumérique
Positive
:entierspositifs
Natural
:entiersnaturels
Decima
l,float,
integer,
realsontdessous-typesdenumber
Char:c
haînedecaractèreàtaillefixeallantjusqu’à32767caractère(aulieude255dansla
définitiondescolonnesdestables)
Varcha
r2:estunechaînedecaractèredelongueurvariableallantjusqu’à32767(aulieude
2000dansladéfinitiondescolonnesdestables)
Boolean
:typebooléensesvaleurspossiblessontTRUE,FALSE,NULL
Date:typedated’Oracle
Rowid:
typeinterneàOraclecomposéde6octetsquipermetd’identifieruneligneunique
d’unetableetd’offrirunaccèsrapideauxdonnées.
Lestype
sCompo
sés:Rec
ord:c’estletypeenregistrement
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
Table:c’estletypetableau
3.2Var
iablese
tconstan
tesLadéclarationd'unevariableconsisteàallouerunespacepourstockeretmodifierunevaleur.
elleesttypéeetpeutrecevoirunevaleurpardéfautet/ouunstatutNOTNULL.
Uneconstanteestdéfiniecommeunevariable,maisl'utilisateurnepeutpasmodifierson
contenu.
3.2.1.L
adéfinit
iondes
variable
senPL/
SQLLesvariablessedéfinissentdanslapartieDECLARE,dublocPL/SQLenutilisantlasyntaxe
suivante:
nomvariable[CO
NSTANT
]{type|variable%TYPE|colonne_de_table.%
ROWTYP
E}[NO
TNULL
][{:=|DE
FAULT}
expressionPL/SQL]
Remarq
ues:
L'attributCON
STANT
permetdefigerl'affectationd'unevariable.
L'attributNot
NULLre
ndobligatoired'initialiserlavariablelorsdesadéfinition.
Onpeutfaireréférenceàunecolonned'unetableparladéclaration:
♦nom_variable
TABLE.COLONNE%TYPE,
Onpeutfaireréférenceàuneligned'unetableparladéclaration
♦Nom_variable
TABLE%ROWTYPE,
Onpeutfaireréférenceàunevariableprécédemmentdéfinieparl'instruction
♦Nom_variable
Pnomvariable%TYPE
♦L'initialisationd'unevariablesefaitparl'opérateur‘:=’suivi
üd'uneconstante,
üd'uneexpressionPL/SQL,
üd'unefonctionPL/SQL.
Lesvariablespeuventégalementêtredéfiniesdansl'environnementextérieurauBlocPL/SQL
parexemplecommedeschampsdel'écranenFormBuilder.Cesvariablesserontutilisées
préfixéesde':'.
Exempl
esdedé
claratio
ndevari
ables:
Total
NUMBER(9,3);
Nom
CHAR(4):=‘ISET’;
Longeur
NUMBERNOTNULL:=LENGTH(Nom)*2;
Date_CréationDATE;
Numéro
EMPLOYE.EMPNO%TYPE;
Dpt
DEPARTEMENT%ROWTYPE;
Prénom
Nom%TYPE;
Pi
CONSTANTNUMBER:=3.14;
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
10
3.2.2L’
affectat
iondes
variable
sPL/SO
LDeuxpossibilitésd’affectationoud’assignementsontdisponibles:
parl'opérateurd'affectation:':=',
parlaclauseSelect...Into…
Ladifficultédansl'utilisationdelaclauseSelectrésultedunombredelignesoud'occurrences
retourné.
SileSelectretourneuneetuneseulevaleurl'affectations'effectuecorrectement.Parcontre
SileSELECTneretourneaucuneligne,l’erreurPL/SQLNO_
DATA_F
OUND
seragénérée.
SileSELECTretourneplusieurslignes:l’erreurTOO_MANY_ROWSseragénérée.
3.3.Les
tableaux
enPL/SQ
LNousavonsvuprécédemmentquelelangagePL/SQLfournitdeuxtypesd'objetscomposés:
•lestableaux(TABLE),
•lesenregistrements(RECORD).
Lestableauxsontconçuscommelestablesdelabasededonnées.Ilspossèdentuneclé
primaire(index)pouraccéderauxlignesdutableau.
Untableau,commeunetable,nepossèdepasdelimitedetaille.Decettefaçon,lenombre
d'élémentsd'untableauvacroîtredynamiquement.
3.3.1La
déclarat
iond'un
tableau
LestableauxPL/SQLdoiventêtredéclarésendeuxétapes.
1.DéclarationdutypedelaTABLE
2.Déclarationd’unetabledecetype.
OnpeutdéclareruntypeTABLEdanslapartiedéclaratived'unblocoud'unsous-programme
enutilisantlasyntaxesuivante:
TYPEno
m_type
ISTABL
EOF
{typecolonne|variable%TYPE|table.colonne%TYPE}[NOTNULL]
INDEX
BYBIN
ARY_IN
TEGER
;Norn_type:utiliséultérieurementdansladéclarationdestablesPL/SQL.
typecolonne:typededonnéescommeCHAR,DATE,ouNUMBER.
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
11
Lorsqueletypeestdéclaré,onpeutdéclarerdestableauxdecetypedelafaçonsuivante:
Nom_tab
nom_typ
e;3.3.
2L'accè
sauxélé
mentsd
'untabl
eauPouraccéderàunélémentdutableau,ondoitspécifierunevaleurdecléprimaireen
respectantlasyntaxesuivante: Nom
_tab(val
eur_clé_
primaire
);Valeurclé_primaire:doitêtredutypeBINARY_INTEGER
Pouraffecterlavaleurd'uneexpressionPL/SQLàunélémentdutableau,ondoitutiliserla
syntaxesuivante:
nom_tab
(valeur_
clé_prim
aire):=
expressio
n_Pl/sq
l;Exe
mple:
DECLAR
ETYPEnom_tab_typeISTABLEOFCHAR(25)INDEXBYBINARY-INTEGER;
… tab_nom
nom_tab_type;
BEGIN
… tab_nom(l):='TUNISIE';
… END;
3.4.Les
enregist
rements
prédéfin
is(recor
dPL/SO
L)Larestrictionposéeparl'utilisationdutype%ROWTYPEpourdéclarerunenregistrement
résidedanslemanquedespécificationdestypesdedonnéesauniveaudel'enregistrement.
L'implémentationdunouveautypecomposénomméRECORDapermisdelevercette
restriction.
3.4.1La
déclarat
iond'un
enregistr
ement
CommelestableauxPL/SQL,ladéclarationd'unenregistrementsefaitendeuxétapes:
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
12
1.Déclarationdutypedel'enregistrement
2.Déclarationdelavariabledutypedéfini.
OnpeutdéclarerunTypeREC
ORDda
nslapartiedéclaratived'unblocoud'unsous-
programmeenutilisantlasyntaxesuivante:
TYPEno
m_typeISR
ECORD
(champ{type_champ|table.colonne%TYPE[NOTNULL],
champ(type_champ|table.colonne%TYPE[NOTNULL],...)
nomtype:utiliséensuitedansladéclarationdesenregistrementsPL/SQL.
Type-champ:typededonnéescommeCHAR,DATEouNUMBER.
Lorsqueletypeestdéclaré,Onpeutdéclarerdesenregistrementsdecetypedelafaçon
suivante:
Nom_erg
nom_typ
e;3.4.
2L'accè
sauxch
ampsd'u
nenregi
stremen
tPouraccéderàunélémentd'unevariabledetyperecord,ilsuffitd'utiliserlasyntaxesuivante
Nom_erg
.nom_ch
ampPouraffecterlavaleurd'uneexpressionPL/SQLàunélémentdel'enregistrement,ondoit
utiliserlasyntaxesuivante:
Nom_erg
.nom_cha
mp:=
expressio
n_pl/sql
;Exe
mple:
DECLAR
ETYPEADRESSEISRECORD
(Numero
positive,
Rue
varchar2(35),
CodePostchar(5),
Ville
varchar2(25),
Pays
varchar2(30));
TYPECLIENTISRECORD
(NumCIi
positive,
NomCli
varchar2(40),
Adrcli
ADRESSE,
CA
number(12,3));
monclientCLIENT;
BEGIN
monclient.NumCIi:=
1234;
monclient.NomCIi
:=‘BenHUSSEIN’;
monclient.AdrCli.Numero:=10;
END;
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
13
4STRU
CTRES
DECON
TROLE
4.1.Les
traitem
entsCon
ditionne
lsIFc
ondition_plsql
THEN co
mmandes
[ELSEc
ommandes]
[ELSIF
condition_plsql
THEN co
mmandes
[ELSEc
ommandes]]
ENDIF ;
Laconditionpeututiliserlesvariablesdéfiniesainsiquetouslesopérateursprésentsdans
SQL=,<,>,<=,>=,<>,ISNULL,ISNOTNULL.
Exempl
e:DEC
LARE
vjob
CHAR(10);
vnom
employés.ename%type:=‘BENSALAH’;
msg
CHAR(30);
BEGIN
Selectjobintovjobfromemployéswhereename=vnom;
--contrôledelavaleurdevjob
ifvjobisNULL
thenmsg:=vnom||‘pasdetravail';
elsifvjob=‘Vendeur’then
UPDATEemployéssetcomm=100whereename=vnom;
Msg:=vnom||‘a100dinarsdecommission’;
ElseUPDATEemployéssetcomm=0whereename=vnom;
Msg:=vnom||‘n’apasdecommission’;
Endif; DBMS_OUTPUT.PUT_LINE(msg);
commit;
END;
4.2LesT
raiteme
nts.Rép
étitifs
4.2.1.l’
instruct
ionLOO
PLOOPpermetderépéteruneséquencedecommandes.Cetteséquenceestcompriseentrele
mot-cléLOOP,indiquantledébutd’uneboucleetENDLOOP,spécifiantsafin.
Syntaxe:
LOOP
instructions
ENDLOOP;
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
14
Lescommandes
EXIT,E
XITWH
ENcon
ditionpe
rmettentdequitterlaboucle.
Exempl
e:DEC
LARE
sommenumber(10):=0;
nombrenumber(5);
BEGIN
nombre:=0;
LOOP Nombre:=nombre+1;
somme:=somme+nombre;
ifnombre>=10
then
EXIT;
endif;
ENDLOO
P;DBMS_OUTPUT.PUT_LINE(‘lasommedes10premiersentiersest‘||to_char(somme));
END;
4.2.2.L
'instruct
ionFOR
…LOO
PFOR
compteurIN[
REVERS
E]var_debut..var_finLOO
Pinstructions
ENDLOO
P;compteur.estunevariabledetypeentier,localeàlaboucle.Savaleurdedépartestégalepar
défautàlavaleurdel'expressionentièredegauche(var_debut).Elles'incrémentede1,après
chaquetraitementducontenudelaboucle,jusqu'àcequ'elleatteignelavaleurdedroite
(var_fin).
5.LES
CURSEU
RSEN
PL/SQL
PourtraiterunecommandeSQL,PL/SQLouvreunezonedecontextepourexécuterles
commandesetstockerlesinformations.
5.1.Défi
nition
Lecurseurpermetdenommercettezonedecontexte,d'accéderauxinformationset
éventuellementdecontrôlerletraitement.Cettezonedecontexteestunemémoiredetaille
fixe,utiliséeparlenoyaupouranalyseretinterprétertoutordreSQL.
5.2.Les
typesde
curseurs
vLec
urseure
xplicite
Ilestcrééetgéréparl'utilisateurpourtraiterunordreSelectquiramèneplusieurslignes.
Letraitementduselectseferaligneparligne.
vLec
urseuri
mplicite
IlestgénéréetgéréparlenoyaupourlesautrescommandesSQL.
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
15
5.3.Les
étapesd
'utilisati
ond'un
curseur
explicite
Pourtraiterunerequêtequiretourneplusieurslignes,l'utilisateurdoitdéfiniruncurseurqui
luipermetd’extrairelatotalitédeslignessélectionnées.
L’utilisationd'uncurseurpourtraiterunordreSelectramenantplusieurslignes,nécessite4
étapes:
1.Déclarationducurseur
2.Ouvertureducurseur
3.Traitementdeslignes
4.Fermetureducurseur.
5.3.1.L
adéclar
ationd'
uncurse
urLadéclarationducurseurpermetdestockerl'ordreSelectdanslecurseur.
LaSymtaxededéfinition..
LecurseursedéfinitdanslapartieDECALREd'unblocPL/SQL.
Cursor
nomcurseur[(nompararntype[,nomparamtype,...)]
ISComm
ande_SE
LECT
Exempl
e:DeclareCursorDEPT_10is
selectename,salfromempwheredepno=10;
5.3.2.L
'ouvertu
reetla
fermetur
ed’unc
urseur
L'étaped'ouverturepermetd'effectuer:
1.l'allocationmémoireducurseur,
2.l'analysesémantiqueetsyntaxiquedel'ordre
3.lepositionnementdeverrouséventuels(siselectforupdate...)
L'étapedefermeturepermetdelibérerlaplacemémoireréservé.
Lasynta
xe:OPENnomcurseur[(nomparam1[,nomparam2,...)]
/*traitementdeslignes*/
CLOSEnomcurseur
Exempl
e:Begin…
OPENDEPT_10
/*traitementdeslignes*/
CLOSEDEPT_10
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
16
5.3.3.L
etraitem
entdes
lignes
Ilfauttraiterleslignesuneparuneetrenseignerlesvariablesréceptricesdéfiniesdansla
partieDeclaredubloc.
Lasynta
xe:Danslapartietraitementdubloc.PL/Sql,ilfautcommencerparouvrirlecurseurpuis
FETCH
nomcurseurINT
O{nomvariable[,nomvariable]|nomrecord}
L’ordrefetchneramènequ’uneseuleligneàlafois.Decefaitilfautrecommencerl’ordre
pourtraiterlalignesuivante.
Exempl
e:Declare
CursorDEPT_10is
selectename,salfromempwheredepno=10;
Vnom
emp.name%TYPE;
Vsalaire
emp.sal%TYPE;
BeginOPENDEPT_10;
LOOPFETCHDEPT10intovnom,vsalaire;
--Traitementligne
ENDLOOP;
CLOSEDEPT_10;
End; 5.4L
esattrib
utsd’un
curseur
Lesattributsd’uncurseurnousfournissentdesinformationssurl’exécutiond’unordre.Ils
sontconservésparPL/SQLaprèsl’exécutionducurseur(impliciteouexplicite)
Cesattributspermettentdetesterdirectementlerésultatdel’exécution.Ilssontrésumésdans
letableausuivant:
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
17
Curseur
simplic
itesCur
seursex
plicites
Sql%Found
Nomcurseur%Found
Sql%Notfound
Nomcurseur%Notfound
Sql%Isopen
Nomcurseur%Isopen
Sql%Rowcount
Nomcurseur%Rowcount
Sql%Rowtype
Nomcurseur%Rowtype
5.4.1l’a
ttribut%
Found
cetattributestdetypebooléen(vraioufaux)
Pourlescurseursimplicites,cetattributestvraisilesinstructionsinsert,update,deletetraitent
aumoinsuneligne.Pourlescurseursexplicites,ilestvraisilefetchramèneaumoinsune
ligne.
Exempl
e:DeclareCURSORnum_cur1ISSELECTnumfromtab1;
CURSORnum_cur2ISSELECTnumfromtab2;
Num1number;
Num2number;
sommenumber:=0;
Begin
OPENnum_cur1;
OPENnum_cur2;
LOOP
FFTCHnum_cur1INTOnum1;
FFTCHnum_cur2INTOnum2;
IF(num_cur1%Found)AND(num_cur2%Found)THEN
somme:=num1+num2;
INSERTINTOsum_tabVALUES(somme);
ELSEExit;
ENDIF;
ENDLOOP;
CLOSEnuml_cur1;
CLOSEmun_cur2;
COMMIT;
END;
5.4.2.L
'attribut
%NotFo
undcetattributestdetypebooléen(vraioufaux)
Pourlescurseursimplicites,cetattributestvraisilesinstructionsinsert,update,deletene
traitentaucuneligne.Pourlescurseursexplicites,ilestvraisilefetchneramèneplusde
ligne.
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
18
Exempl
e:DeclareCURSORnum_cur1ISSELECTnumfromtab1;
CURSORnum_cur2ISSELECTnumfromtab2;
Num1number;
Num2number;
sommenumber:=0;
Begin
OPENnum_cur1;
OPENnum_cur2;
LOOP
FFTCHnum_cur1INTOnum1;
FFTCHnum_cur2INTOnum2;
EXITWHEN(num_cur1%NotFound)OR(num_cur2%NotFound);
somme:=num1+num2;
INSERTINTOsum_tabVALUES(somme);
ENDLOOP;
CLOSEnuml_cur1;
CLOSEmun_cur2;
END;
5.4.3.L
'attribut
%IsOpe
nCetattributestdetypebooléensoitvrai,soitfaux.
LecurseurimpliciteesttoujoursfauxcarOraclerefermetoujourslescurseursqu'ilouvre
aprèschaqueutilisation.
Lecurseurexpliciteestvraisilecurseurestouvert.
Exempl
e:Declare
CursorDept10is
Selectename,salfromempwheredeptno=10;
Begin
Ifnot(Dept10%lsopen)then
openDept10;
Endif,
FetchDept10into…
--traitement
End;
5.4.4.'L
'attribut
%RowC
ount
Cetattributestdetypenumérique.Lecurseurimpliciteindiquelenombredelignestraitéspar
lesordresinsert,update,delete.
Lecurseurexpliciteestincrémentéàchaqueordrefetch,donccetattributtraduitlanième
lignetraitée.
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
19
Exempl
eDeclare
cursorC1is
selectename,empno,salfromemporderbysaldesc;
nomchar(10);
numeronumber(4);
salairenumber(7,2);
Begin
OpenCl;
Loop.
Fetchclintonom,numéro,salaire;
exitwhen(c1%rowcount>25)or(cl%notfound);
insertintotempvalues(salaire,numéro,nom);
EndLoop;
CloseC1;
commit;
End; 5.4.5.L
'attribut
%Rowt
ypeCetattributpermetladéclarationimplicited'unestructuredontlesélémentssontd'untype
identiqueauxcolonnesramenéesparlecurseur.
Syntaxe:
Danslapartiedéclarativedubloc.
CURSORnomcurseurISordreselect;
nomrecordnomcurseur%Rowtype;
Lesélémentsdelastructuresontidentifiéspar:nom
record.n
omcolon
neLastructureestrenseignéeparleFetch:Fetc
hnomcu
rseurin
tonomr
ecord;
Exempl
eDeclare
/*lafonctionnvlpermetdetesterlavaleurNulld'unecolonnesicomm=NULLalorsnvl
retourne0sinonnvlretournelavaleurdecomm*/
cursorc1isselectsal+nvl(comm)saltot,enamefromemp;
/*l'enregistrementcomportedeuxcolonnes:saltot,ename
c1_recordc1%Rowtype;
Begin
openc1;
Loop
Fetchc1intoc1_record;
Exitwhenc1%notfound;
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
20
ifc1_record.saltot>2000then
insertintotempvalues(c1_record.saltot,c1_record.ename);
endif,
EndLoop;
closec1;
End; 5.5.Les
boucles
etlescu
rseurs
L'objectifestdefournirauprogrammeurunestructuresimpleetefficacepourutiliserles
structuresdeboucleetlescurseurs.
Declare
Cursornomcurseurisordre_select;
Begin Fornom
recordi
nnomcu
rseurLo
op
/*traitement
EndLoop;
End;
LeblocPL/SQLci-dessupermetd'obtenirunegénérationimplicitedelastructuresuivante:
Declare
Cursornomcurseurisordreselect;
nomrecordnomcurseur%rowtype;
Begin
Opennomcurseur;
Loop
Fetchnomcurseurintonomrecord;
Exitwhennomcurseur%notfound;
/*traitement
EndLoop;
Closenomcurseur;
End; 5.6.Lec
urseurp
aramètre
Ilpermetd'utiliserdesvariablesdanslecurseur.Principalementdanslaclausewhere.
Ilfautpourcelaspécifierlesnomsetlestypesdesparamètresdansladéclarationducurseur.
Cursornomcurseur(paramltype,param2type,...)
isselectordre_select,
L'ordre_selectutiliselesparamètres.
Lestypespossiblessont:char,number,date,booleansansspécifierlalongueur.
Begin
Opennomcurseur(valeurl,vaieur2,....);
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
21
Exempl
e:Declare
cursorc1(departnumber)
isselectsal,nvl(comm,0)commi
fromempwheredeptno=depart;
totalnumber(11,2):=0;
sal_supnumber(4):=0;
comm_supnumber(4):=0;
Begin
forc1_recinc1(20)Loop
total:=total+c1_rec.sal+c1_rec.commi;
ifc1_rec.sal>4000
thensal_sup:=sal_sup+1;
endif;
ifc1_rec.commi>3000
thencommi_sup:=commi_sup+1;
endif;
EndLoop;
insertintotemp
values(sal_Sup,comm_sup,'totalsalaire’||to_Char(total));
commit;
End; 5.7.Lac
lause"c
urrento
f…"Cetteclausepermetd'accéderdirectementàlaligneramenéeparl'ordreFetchafindela
traiter(update,delete).
vIlfautseréserverlalignelorsdeladéclarationducurseurparlepositionnementd'un
verroud'intention:(Forupdateofnom_colonne)
vIlfautspécifierquel'onveuttraiterlalignecouranteauFetchparlaclause:(Where
currentofnom_curseur)
Exempl
e:Declare
Cursorclisselectename,salfromemp
forupdateofsal;
Begin
Forc1_recordinc1Loop
Ifc1_record.sal>1500then
insertintoresultatvalues(c1_record.sal,c1_record.sal*1.3,c1_record.ename);
updateempsetsal=sal*1.3wherecurrentofc1;
endif,
Endloop;
Commit;
End;
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
22
6Utilis
ationde
sous-p
rogram
mesPL/SQLaccepteaussil’utilisationdesous-programmese,nommésprocéduresetfonctions.
UneprocédurePL/SQLexécutecertainesactionsetpeutaccepterdesparamètresoptionnels.
UnefonctionPL/SQLretourneunevaleurd’uncertaintypeetpeutaussiaccepterdes
paramètresoptionnels.
6.1Déc
laration
d’unepr
océdure
Lasyntaxededéclarationd’uneprocédureest:
PROCEDURE
nom_pro
cédure[(
paramètr
e1…[,
pramètre
N]IS
[ déclara
tiondes
variable
slocales
]BEGIN
Instructio
nsPL/SQ
L[sec
tion_exc
eption]
END[ nom
_procédu
re]•
Paramètr
e1àpara
mètreNr
eprésententladéclarationdesparamètresdelaprocéduresous
laforme:nom_paramètre[IN|OUT|INOUT]type_données[{:=|default}valeur].
•décl
aration
desvari
ablesloc
alesreprésententlesdéclarationsoptionnellesdevariables,
deconstantes,defonctionsetdeprocédureslocalesàlaprocédure.
•sect
ion_exce
ptiones
tlasectionoptionnelledegestiondesexceptionsdelaprocédure.
Exempl
e:Declare
Vpatient_IDPatient.Patient_ID%type;
Fièvre_elevéeconstantreal:=42;
Procedureenregistrer_Temp_Deg_C_Patient(patient_IDvarchar2,
Temp_Corps_Deg_Creal)is
Temp_Deg_Freal;
Begin
Temp_Deg_F:=(9/5)*Temp_Corps_Deg_C+32;
InsertintoPatient(Patient_ID,Temp_Corps_Deg_F)
Values
(patient_ID,Tem_Deg_F);
Commit;
End;
BeginVpatient_ID:=‘ES8888’;
enregistrer_Temp_Deg_C_Patient(Vpatient_ID,Fièvre_elevée);
End;
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
23
6.2Déc
laration
d’unefo
nction
Lasyntaxededéclarationd’unefonctionest:
FUNCTION
nom_fon
ction[(
paramètr
e1…[,
pramètre
N]RETURN
type_don
nées_fon
ctionIS
[déclara
tiondes
variable
slocales
]BEGIN
Instructio
nsPL/SQ
LRETURN
val_à_re
tournée
[section
_exceptio
n]END[ nom
_fonctio
n]Exe
mple:
Soitl’extraitsuivantd’unebasededonnéesrelationnelled’uneapplicationdegestionde
scolaritéd’uneuniversité:
Etudiant(code
tu,nometu,adretu)
Matière(cod
mat,description_mat,coefmat)
Moyenne(code
tu,codm
at ,moyenne_mat)
Lafonctionmeilleur_étu_matretournelecodedumeilleurétudiantd’unematièredonnée.
Declare
CodmatièreMatière.codmat%type;
Vcode_etuetudiant.codetu%type;
FUNCTIONmeilleur_étu_mat(pcodmatvarchar2)RETURNvarchar2IS
Vcodetuetudiant.codeetu%type;
BEGIN
SelectcodetuintoVcodetu
FromMoyenneM
WhereM.moyenne_matin(Selectmax(moyenne_matfromMoyenneM
WhereM.codmat=pcodmat);
ReturnVcodetu;
End;
BeginCodmatière:=‘M001’;
Vcode_etu:=meilleur_étu_mat(Codmatière);
DBMS_OUTPUT.PUT_LINE(‘Lemeilleurétudiantdelamatière’||Codmatière||‘est
:‘||Vcode_etu);
End;
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
24
6.3Par
amètres
deprocé
dureet
fonction
Unouplusieursparamètrespeuventêtrepassésàuneprocédureouàunefonction,detrois
façons:IN,OUTouINOUT
Exempl
e:Declare
Param1number;
Param2number;
Param3number;
ProcedureDifférents_Param(P1IN
number,P2OUTnumber,P3INOUTnumber)Is
BeginP2:=P1;
P3:=P3+1;
END;
BeginParam1:=3.14;
Param3:=15;
Différents_Param(Param1,Param2,Param3);
DBMS_OUTPUT.PUT_LINE('param1='||to_char(param1)||'param2='||
to_char(param2)||
'param3='||to_char(param3));
End; 7.GEST
IONDES
ERREUR
SLemécanismedegestiond'erreursdansPL/SQLestappelégestionnairedesexceptions.
Ilpermetauprogrammeurdeplanifiersagestionetd'abandonneroudecontinuerle
traitementenprésenced'uneerreur.
IlfautaffecteruntraitementappropriéauxerreursapparuesdansunblocPL/SQL.
C'estpourquoiondistingue2ty
pesd'er
reursou
d'except
ions:
1.
Erreur
interne
Oracle(Sqlcode<=0):danscecaslamainestrenduedirectementau
systèmeenvironnant.
2.Anomalie
détermi
néepar
1'utilisa
teur.
Lasolution:
1.Donnerunnomàl'erreur(siellen'estpasdéjàprédéfinie),
2.Définirlesanomaliesutilisateurs,leurassocierunnom,
3.Définirletraitementàeffectuer.
7.1.Les
exceptio
nsintern
esUneerreurinterneestproduitequandunblocPL/SQLvioleunerègled'Oracleoudépasse
unelimitedépendantdusystèmed'exploitation.LeserreursOraclegénéréesparlenoyausont
numérotées,orlegestionnairedesexceptionsdePL/SQL,nesaitquegérerdeserreurs
nommées.
PourcelaPL/SQLaredéfiniquelqueserreursOraclecommedesexceptions.Ainsi,pourgérer
d'autres
erreurs
Oracle,
1'utilisateurdoit
utiliserle
gestionnaire
OTHERS
ou
EXCEPTION_INITpournommerceserreurs.
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
25
LesexceptionsfourniesparOraclesontregroupéesdanscetableau:
Nomd'ex
ception
ValeurS
qlCode
Erreur
Oracle
CURSOR_ALREADY_OPEN
-6511
ORA-06511
DUP_VAL_ON_INDEX
-1ORA-00001
INVALID_CURSOR
-1001
ORA-01001
INVALID_NUMBER
-1722
ORA-01722
LOGIN_DENIED
-1017
ORA-01717
NO_DATA_FOUND
-1403
ORA-01413
NOT_LOGGED_ON
-1012
ORA-01012
PROGRAM_ERROR
-6501
ORA-06501
STORAGE_ERROR
-6500
ORA-06500
TIMEOUT_ON_RESOURCE
-51
ORA-00051
TOO_MANY_ROWS
-1422
ORA-01422
TR.ANSACTION_BACKED_OUT
-61
ORA-00061
VALUE_ERROR
-6502
ORA-06502
ZERO_DIVIDE
-1476
ORA-01476
OTHERS
:touteslesautreserreursnonexplicitementnommées.
Pourgérerlesexceptionsleprogrammeurdoitécrireungestionnairedesexceptionsquiprend
lecontrôledudéroulementdublocPL/SQLenprésenced'uneexception.
Legestionnaired'exceptionfaitpartiedublocPL/SQLetsetrouveaprèslescommandesIl
commenceparlemotcléEXC
EPTION
etsetermineaveclemêmeEND
dubloc.
Chaquegestiond'exceptionconsisteàspécifiersonnomd'erreuraprèslaclause
WHEN
etla
séquencedelacommandeàexécuteraprèslemotcléTHE
N,commelemontrel'exemple
suivant:
DECLARE
Wsal
emp.sal%type;
BEGIN
selectsalintowsalfromemp;
EXCEPTION
WHENTOO_MANY_ROWSthen…
--gérererreurtropdelignes
WHENNO_DATA_FOUNDthen…
--gérererreurpasdeligne
WHENOTHERSthen…
--gérertouteslesautreserreurs
END;
Remarq
ues:
üL'exceptionoptionnelleOTHERSesttoujourssituéeàlafindesexceptions.
üPourrattacheruneséquencedecommandesàplusd'uneexception,l'utilisateurpeut
utiliserl'opérateurbooléenORcommesuit:
WHENerreurlORerreur2THEN--gérererreurl2
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter
LelangagePL/SQL
NadhemBelHadjOCADBA
26
7.2.Les
exceptio
nsutilis
ateur(ex
ternes)
PL/SQLpermetàl'utilisateurdedéfinirsespropresexceptions.
LagestiondesanomaliesutilisateurpeutsefairedansunblocPL/SQLeneffectuantles
opérationssuivantes:
1.Nommerl'anomalie(typeexception)danslapartieDéclaredubloc.
DECLARE
Nom_ano
Exception;
2.Déterminerl’erreuretpasserlamainautraitementappropriéparlacommandeRai
se.BEGIN
… If(condition_anomalie)thenraiseNom_ano
3.EffectuerIetraitementdéfinidanslapartieEXCEPTIONduBloc.
EXCEPTION
WHEN(Nom_ano)then(traitement);
Exempl
e:DECLARE
wsal
emp.sal%type;
sal_zeroException;
BEGIN
Selectsalintowsalfromempwhereempno=5;
Ifwsal=0then
Raisesal_zero;
EXCEPTION
WHENsal_zerothen…
--gérererreursalaire
WHENTOO_MANY_ROWSthen...
--gérererreurtropdelignes
WHEN_NO_DATA_FOUNDthen...
--gérererreurpasdeligne
WHENOTRERS
then...
--gérertouteslesautreserreurs
END;
LeprogrammeurPeututiliserlesfonctionsSqlcodeetSqlerrmpourcoderleserreursOracle
enException.
sqlcodeestunefonctionpropreàPL/SQLquiretournelenuméro(généralementnégatif)
del'erreurcourante.
Sqlerrmreçoitenentréelenumérodel'erreuretrenvoieensortielemessagedel'erreurcodé
sur196octets.
Cre
ate
PD
F w
ith
GO
2P
DF
fo
r fr
ee
, if y
ou
wis
h to
re
mo
ve
th
is lin
e, clic
k h
ere
to
bu
y V
irtu
al P
DF
Prin
ter