13
Complément sur le langage SQL Nadhem Bel Hadj OCA DBA 1 [email protected] nom_table ( Nom_colonne1 type_données [ ], Nom_colonne_n type_données [ ], [ nom_contrainte] [ (nom_colonneA, nom_colonneB,…,nom_colonneX)]) ; nom_contrainte est un nom optionnel qui identifie la contrainte nom_colonneA à nom_colonneX représentent les colonnes qui composent la clé primaire de la table. Ligne_Facture ( Numfact Number(5), Codprod varchar2(5), Qtefact Number(9,3) NOT NULL CP_LIG_FACT (Numfact, Codprod)) ; La contrainte NOT NULL n’est pas utilisée pour les colonnes Numfact et Codprod car la contrainte Primary Key remplace, entre autre, NOT NULL. CREATE TABLE nom_table ( Spécification_colonne1, Spécification_colonneN, [ nom_contrainte_CE (nom_colonneF1,…,nom_colonneFN) table_référence (nom_colonneP1,…,nom_colonnePN),] [Constraint nom_contrainte_CP] [Primary key (nom_colonneA, nom_colonneB,…,nom_colonneX)]) ; Spécification_colonne1 à spécificatin_colonneN sont les spécifications des colonnes valides (décrites ci-après en détail). nom_contrainte_CE est le nom optionnel de la contrainte de clé étrangère. nom_colonneF1 à nom_colonneFN représentent les colonnes qui composent la clé étrangère. table_référence représente la table à laquelle se réfère la déclaration de la clé étrangère. Nom_colonneP1 à nom_colonnePN représentent la clé primaire de la table référencée. La syntaxe pour spécification colonne est la suivante : Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer Complément sur le langage SQL Nadhem Bel Hadj OCA DBA 2 [email protected] nom_colonne type_données [DEFAULT valeur_par_défaut] [Constraint nom_contrainte] [NULL] | [NOT NULL] | [UNIQUE] | CHECK (condition) valeur_par_défaul est une valeur affectée à la colonne lors d’une insertion. Nom_contrainte désigne le nom de la contrainte. Condition est un condition booléenne que doit vérifier les valeurs affectées à la colonne. CREATE TABLE Facture ( Numfact Number(5) , Datefact date SYSDATE, Mode_paie varchar2(10) CK_mode (mode_paie (‘cheque’,’espèce’)), Codcli varchar2(5), Constraint CP_FACT (Numfact), CE_CODCLI (Codcli) Client(codcli)) ; (chaîne) : cette fonction retourne la longueur d’une chaîne dans une colonne d’une table. Select nomcli, (nomcli) from client ; Si le nom est ‘ALI’ la fonction retourne 3 chaîne, position_départ, nombre_caractères) : :cette fonction permet d’extraire une portion d’une : Select nomcli, (nomcli,1,4) from client ; Si le nom est ‘mohamed‘ la fonction retourne ‘moha’ (chaîne, chaîne_existante, [chaîne_remplacement]) : cette fonction sert à remplacer une chaîne par une autre dans une colonne. Update Cours Set titre=REPLACE(titre, ’séminaire’,’formation’) ; si on ne spécifie pas la chaîne de remplacement, la chaîne existante sera supprimée de la colonne. (chaîne): cette fonction élimine les espaces (blanc) de début de chaîne (chaîne): cette fonction élimine les espaces de fin de chaîne (chaîne, n, chaîne_remplissage) : cette fonction permet de compléter une valeur de chaîne en lui ajoutant des caractères au début. n : est la longuer totale de la chaîne retournée par la fonction chaîne_remplissage : est la chaîne placée au début de chaîne Si la colonne nom est ‘ALI’ alors si on appelle la fonction : Create PDF with GO2PDF for free, if you wish to remove this line, click here to buy Virtual PDF Printer

Cours Pl SQL

Embed Size (px)

Citation preview

Page 1: Cours Pl SQL

ComplémentsurlelangageSQL

NadhemBelHadjOCADBA

[email protected]

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

[email protected]

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

Page 2: Cours Pl SQL

ComplémentsurlelangageSQL

NadhemBelHadjOCADBA

[email protected]

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

[email protected]

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

Page 3: Cours Pl SQL

ComplémentsurlelangageSQL

NadhemBelHadjOCADBA

[email protected]

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

[email protected]

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

Page 4: Cours Pl SQL

LelangagePL/SQL

NadhemBelHadjOCADBA

[email protected]

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

[email protected]

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

Page 5: Cours Pl SQL

LelangagePL/SQL

NadhemBelHadjOCADBA

[email protected]

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

[email protected]

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

Page 6: Cours Pl SQL

LelangagePL/SQL

NadhemBelHadjOCADBA

11

[email protected]

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

[email protected]

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

Page 7: Cours Pl SQL

LelangagePL/SQL

NadhemBelHadjOCADBA

13

[email protected]

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

[email protected]

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

Page 8: Cours Pl SQL

LelangagePL/SQL

NadhemBelHadjOCADBA

15

[email protected]

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

[email protected]

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

Page 9: Cours Pl SQL

LelangagePL/SQL

NadhemBelHadjOCADBA

17

[email protected]

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

[email protected]

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

Page 10: Cours Pl SQL

LelangagePL/SQL

NadhemBelHadjOCADBA

19

[email protected]

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

[email protected]

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

Page 11: Cours Pl SQL

LelangagePL/SQL

NadhemBelHadjOCADBA

21

[email protected]

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

[email protected]

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

Page 12: Cours Pl SQL

LelangagePL/SQL

NadhemBelHadjOCADBA

23

[email protected]

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

[email protected]

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

Page 13: Cours Pl SQL

LelangagePL/SQL

NadhemBelHadjOCADBA

25

[email protected]

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

[email protected]

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