oracle - pl / sql (procedural language / structured query language)

30
Oracle - PL / SQL (Procedural Language / Structured Query Language)

Upload: iria

Post on 10-Jan-2016

73 views

Category:

Documents


3 download

DESCRIPTION

Oracle - PL / SQL (Procedural Language / Structured Query Language). Problématique posée par SQL. SQL est un langage non procédural, répondant à la question QUOI ? Mais pas au COMMENT ?. Les développeurs ont besoin d’assembler des données et de les traiter ligne par ligne. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

Oracle - PL / SQL

(Procedural Language / Structured Query Language)

Oracle - PL / SQL

(Procedural Language / Structured Query Language)

Page 2: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

Problématique posée par SQLProblématique posée par SQL

Mise en place d’un langage de traitement procédural qui facilite la tâche des développeurs et qui permet de pallier aux carences du langage SQL : PL/SQL.

Mise en place d’un langage de traitement procédural qui facilite la tâche des développeurs et qui permet de pallier aux carences du langage SQL : PL/SQL.

Les développeurs ont besoin d’assembler des données et de les traiter ligne par ligne.

Les développeurs ont besoin d’assembler des données et de les traiter ligne par ligne.

Solution apportée par Oracle à partir de la version 6

Solution apportée par Oracle à partir de la version 6

SQL est un langage non procédural, répondant à la question QUOI ? Mais pas au COMMENT ?

SQL est un langage non procédural, répondant à la question QUOI ? Mais pas au COMMENT ?

Page 3: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

Présentation du langage PL/SQL

Présentation du langage PL/SQL

DD

NoyauNoyau

DICTIONNAIREDONNEES

SQL

DEVELOPPER

DESIGNER

Oracle APPLICATION (PGI)PL/SQL

Page 4: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

Présentation du langage PL/SQL

Présentation du langage PL/SQL

PL/SQLPL/SQL

SQL STATEMENT EXECUTORIntégré au noyau RDBMS.SQL STATEMENT EXECUTORIntégré au noyau RDBMS.

PROCEDURAL STATEMENT EXECUTORIntégré au noyau et aux outils (Forms, Rports, OAS, …)

PROCEDURAL STATEMENT EXECUTORIntégré au noyau et aux outils (Forms, Rports, OAS, …)

Déclarations possibles des variables.

Intégration de la majorité des ordres SQL..

Traitements séquentiels.

Exécution conditionnelle de blocs d’instructions.

Traitements répétitifs (boucles).

Gestion des exceptions.

Déclarations possibles des variables.

Intégration de la majorité des ordres SQL..

Traitements séquentiels.

Exécution conditionnelle de blocs d’instructions.

Traitements répétitifs (boucles).

Gestion des exceptions.

REGLESREGLES

Page 5: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

SQL & PL/SQLSQL & PL/SQL

LIDLID TRANSACTION

TRANSACTION

LMDLMD FONCTIONSFONCTIONS

SELECTSELECTINSERTUPDATEDELETE

LOCK TABLE

INSERTUPDATEDELETE

LOCK TABLE

COMMITROLLBACKSAVEPOINT

SET TRANSACTION

COMMITROLLBACKSAVEPOINT

SET TRANSACTION

SUMDECODE

MODUPPER

SYSDATETO_CHAR …

SUMDECODE

MODUPPER

SYSDATETO_CHAR …

Inté

gr

és

Non

in

tég

rés

EXPLAIN PLANEXPLAIN PLANCREATEALTERDRPO

CREATEALTERDRPO

GRANTREVOKEGRANT

REVOKE ALTER SESSIONSET ROLE

ALTER SYSTEM

ALTER SESSIONSET ROLE

ALTER SYSTEM

Page 6: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

STRUCRURE D’UN BLOC

PL/SQL

STRUCRURE D’UN BLOC

PL/SQL

BLOC PL/SQLBLOC PL/SQL

Partie déclarative

(optionnelle)

Partie déclarative

(optionnelle)

Partie exception

(optionnelle)

Partie exception

(optionnelle)

Partie exécutable (obligatoire)

Partie exécutable (obligatoire)

• Chaque instruction se termine par un point virgule.

• Les commentaires sont possibles /* */.

• Possibilité d’imbrication des blocs.

• Chaque instruction se termine par un point virgule.

• Les commentaires sont possibles /* */.

• Possibilité d’imbrication des blocs.

DECLAREDECLARE EXCEPTIONEXCEPTIONBEGIN … ENDBEGIN … END

Page 7: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

LES VARIABLES & LES TYPES

Les variables locales : Elles ne sont pas visibles dans tous les blocs. Elles peuvent être simples ou structurées.

Les variables globales : elles sont déclarées dans la partie commune à tous les blocs. Elles peuvent être simples ou structurées.

Les variables externes (bind variables) : elles sont externes à tous les blocs. (variables sql+, variables pro*, champs dans les forms).

RemarqueLes variables externes sont précédées de :.

LES VARIABLES & LES TYPES

Les variables locales : Elles ne sont pas visibles dans tous les blocs. Elles peuvent être simples ou structurées.

Les variables globales : elles sont déclarées dans la partie commune à tous les blocs. Elles peuvent être simples ou structurées.

Les variables externes (bind variables) : elles sont externes à tous les blocs. (variables sql+, variables pro*, champs dans les forms).

RemarqueLes variables externes sont précédées de :.

Page 8: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

Type Syntaxe Remarques / Exemple

NUMBER NUMBER [(total [ , Décimal])] Total est max égal à 38.Salaire NUMBER(7,2)

CHAR CHAR [(longueur)] Nom CHAR(15)

VARCHAR2 VARCHAR2 [(longueur)] Le type chaîne le plus efficace sous Oracle

DATE DATE Date_Naiss DATE

RAW RAW (longueur) Géré comme le VARCHAR2, mais pas affichable.Seq RAW(100)

LONG LONG Permet de stocker des chaînes d'une longueur max de 2 Go.Texte LONG

LONG RAW LONG RAW Stockage de fichiers binaires comme les images, son et de la vidéo.Longueur max est 2GoPhoto LONG RAW

Types classiques

Types classiques

Page 9: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

Types propres à PL/SQL

Types propres à PL/SQL

Type Syntaxe Remarques / Exemple

BINARY_INTEGER

BINARY_INTEGER -2E31-1 à +2E31-1 -2.147.483.647 à + 2.147.483.647

PLS_INTEGER PLS_INTEGER -2.147.483.647 à + 2.147.483.647

BOOLEAN BOOLEAN Les valeurs : TRUE, FALSE, NULL

RemarquesLes types BINARY_INTEGER et PLS_INTEGER requièrent moins d’espaces que les types NUMBER.

RemarquesLes types BINARY_INTEGER et PLS_INTEGER requièrent moins d’espaces que les types NUMBER.

Page 10: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

Conversion de types Conversion implicite : effectuée par PL/SQL Conversion explicites par les fonctions.

Conversion de types Conversion implicite : effectuée par PL/SQL Conversion explicites par les fonctions.

BINARY_ INTEGER

CHAR VARCHAR2

LONG NUMBER

PLS_INTEGER

DATE RAW ROWID

BINARY_ INTEGER

OUI OUI OUI OUI OUI

CHAR OUI OUI OUI OUI OUI OUI OUI OUI

VARCHAR2 OUI OUI OUI OUI OUI OUI OUI OUI

LONG OUI OUI

NUMBER OUI OUI OUI OUI

PLS_INTEGER OUI OUI OUI OUI OUI

DATE OUI OUI OUI

RAW OUI OUI OUI

ROWID OUI OUIConversion explicites : TO_CHAR, TO_NUMBER, TO_DATE, TO_LOB, CHARTOROWID TO_SINGLE_BYTE, …

Conversion explicites : TO_CHAR, TO_NUMBER, TO_DATE, TO_LOB, CHARTOROWID TO_SINGLE_BYTE, …

Page 11: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

Déclaration de variables

Déclaration de variables

InitialisationInitialisation

Dans la partie DECLAREDans la partie DECLARE

Syntaxe1 : <nom_var> <type> <initialisation> ;Syntaxe1 : <nom_var> <type> <initialisation> ;

Avec opérateur d’affectation :=Avec opérateur d’affectation :=

Par le mot clé DEFAULT (à la place de :=)Par le mot clé DEFAULT (à la place de :=)

Par la clause INTO de l’ordre SELECT Par la clause INTO de l’ordre SELECT

Par le biais d’un curseurPar le biais d’un curseur

Syntaxe2 : <nom_var> <nom_var_ref>%TYPE <init> ;Syntaxe2 : <nom_var> <nom_var_ref>%TYPE <init> ;

Syntaxe2 : <nom_var> <nom_table.nom_var_ref>%TYPE <init> ;

Syntaxe2 : <nom_var> <nom_table.nom_var_ref>%TYPE <init> ;

Page 12: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

Exemples de déclarationsExemples de déclarations-- Exemple 1DECLARE

num_emp NUMBER(10);date_jour DATE :=SYSDATE; -- Initialisée à la date du jourlogique BOOLEAN;trouve logique%TYPE DEFAULT FALSE;n NUMBER :=-5;carre NUMBER :=n**2;

-- Exemple 2DECLARE

nom_emp VARCHAR2(35) NOT NULL :="BENOIT’";chaine VARCHAR2(25) DEFAULT 6; -- Conversion implicitenombre NUMBER(3) :=‘5’; -- Conversion implicitepi CONSTANT NUMBER :=3.14; -- Déclaration d'une constante

-- Exemple 3 DECLARE

sal employe.salaire%TYPE :=0; -- Même type que la colonne salaire de la table employe.

Remarque La contrainte NOT NULL d’une colonne ne s’applique sur la variable.

-- Exemple 1DECLARE

num_emp NUMBER(10);date_jour DATE :=SYSDATE; -- Initialisée à la date du jourlogique BOOLEAN;trouve logique%TYPE DEFAULT FALSE;n NUMBER :=-5;carre NUMBER :=n**2;

-- Exemple 2DECLARE

nom_emp VARCHAR2(35) NOT NULL :="BENOIT’";chaine VARCHAR2(25) DEFAULT 6; -- Conversion implicitenombre NUMBER(3) :=‘5’; -- Conversion implicitepi CONSTANT NUMBER :=3.14; -- Déclaration d'une constante

-- Exemple 3 DECLARE

sal employe.salaire%TYPE :=0; -- Même type que la colonne salaire de la table employe.

Remarque La contrainte NOT NULL d’une colonne ne s’applique sur la variable.

Page 13: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

Les variables référencées à une table de la base Les variables référencées à une table de la base

Elles sont liées à des tables au niveau de la base. On les déclare par l’attribut : %ROWTYPE

Exemples DECLARE

agent employe%ROWTYPE -- employe est la table employe de la base.

Au niveau traitement, on pourra écrire :

BEGINSELECT * -- Sélection de tous les champsINTO agentFROM employeWHERE nom=‘DUMAS’;

END;Ou

BEGINSELECT nom,dt_entree -- Sélection de certains champsINTO agent.nom, agent.dt_entreeFROM employeWHERE nom=‘DUMAS';

END;

Elles sont liées à des tables au niveau de la base. On les déclare par l’attribut : %ROWTYPE

Exemples DECLARE

agent employe%ROWTYPE -- employe est la table employe de la base.

Au niveau traitement, on pourra écrire :

BEGINSELECT * -- Sélection de tous les champsINTO agentFROM employeWHERE nom=‘DUMAS’;

END;Ou

BEGINSELECT nom,dt_entree -- Sélection de certains champsINTO agent.nom, agent.dt_entreeFROM employeWHERE nom=‘DUMAS';

END;

Page 14: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

LES TYPES STRUCTURES -

RECORD

LES TYPES STRUCTURES -

RECORD

Syntaxe de déclaration du typeTYPE <nom_type_record> IS RECORD (

<membre1 > <type1>,

<membre2 > <type2>,… <membren > <typen>

);

Syntaxe de déclaration du typeTYPE <nom_type_record> IS RECORD (

<membre1 > <type1>,

<membre2 > <type2>,… <membren > <typen>

);

Utilisation<nom_variable>.<membre> := <expression>;

Utilisation<nom_variable>.<membre> := <expression>;

Déclaration des variables de type record

<nom_type_record> <nom_variable>, … ;

Déclaration des variables de type record

<nom_type_record> <nom_variable>, … ;

ExempleDECLARETYPE emp_type_rec IS RECORD (num employe.empno%TYPE,service e_service.nom%TYPE,salaire NUMBER(11,2),date_jour DATE :=SYSDATE);

var_emp1 emp_type_rec;var_emp2 emp_type_rec;

v_emp1.num:=2550;v_emp1.nom:='LAROUSSI'v_emp2:=v_emp1;

ExempleDECLARETYPE emp_type_rec IS RECORD (num employe.empno%TYPE,service e_service.nom%TYPE,salaire NUMBER(11,2),date_jour DATE :=SYSDATE);

var_emp1 emp_type_rec;var_emp2 emp_type_rec;

v_emp1.num:=2550;v_emp1.nom:='LAROUSSI'v_emp2:=v_emp1;

1

2

34

Page 15: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

LES TYPES STRUCTURES -

TABLEAUX

LES TYPES STRUCTURES -

TABLEAUX

Syntaxe de déclaration du type

TYPE <nom_type_tableau> IS TABLE OF <type_simple>| <type_record>|<Colonne_Table> …INDEX BY BINARY_INTEGER ;

Syntaxe de déclaration du type

TYPE <nom_type_tableau> IS TABLE OF <type_simple>| <type_record>|<Colonne_Table> …INDEX BY BINARY_INTEGER ;

Accès aux données

<var_tableau>(<indice>) := <expression> ;

Accès aux données

<var_tableau>(<indice>) := <expression> ;

Déclaration des variables de type tableau

<nom_type_tableau> <var_tableau> ;

Déclaration des variables de type tableau

<nom_type_tableau> <var_tableau> ;

Remarques

- La valeur de l'indice varie de : -2.147.483.647 à + 2.147.483.647.

- Les lignes intermédiaires existent potentiellement mais n'occupent aucun espace.

Remarques

- La valeur de l'indice varie de : -2.147.483.647 à + 2.147.483.647.

- Les lignes intermédiaires existent potentiellement mais n'occupent aucun espace.

1

2

3

Page 16: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

LES TYPES STRUCTURES - TABLEAUXLES TYPES STRUCTURES - TABLEAUX

Exemple

DECLARE TYPE t_tab_salaire TABLE OF

NUMBER(11,3);tab1 t_tab_salaire;

BEGINtab1(-100) := 2500;tab1(-50) := 1500;tab1(15) :=2000;

END;

Exemple

DECLARE TYPE t_tab_salaire TABLE OF

NUMBER(11,3);tab1 t_tab_salaire;

BEGINtab1(-100) := 2500;tab1(-50) := 1500;tab1(15) :=2000;

END;

Page 17: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE DECLARATIVE BLOC PL/SQL

PARTIE DECLARATIVE BLOC PL/SQL

TABLEAUX – Primitives de manipulation des indices -TABLEAUX – Primitives de manipulation des indices -

Primitives Rôle

EXISTS(n) Retourne TRUE si l'élément d'indice n existe.

COUNT Retourne le nombre d'éléments du tableau.

FIRST & LAST

La plus petite et la plus grande valeur de l'indice du tableau.

PRIOR(n) Valeur de l'indice qui précède n.

NEXT(n) Valeur de l'indice qui suit n.

DELETE Supprime tous les éléments du tableau.

DELETE(n) Supprime le nième élément du tableau.

DELETE(m,n)

Supprime les éléments de m à n.

Page 18: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE EXECUTABLEPARTIE EXECUTABLE

Type Rôle

ARITHMETIQUES

+ , - , * , ** , /

RELATIONNELS <> , != , < , > , = , IS NOT NULL , IN , LIKE , AND , OR , BETWEEN , …

AUTRES OPERATEURS

( ) , ; , , , . , := , || , /* .. */ ,

OpérateursOpérateurs

Remarques

- Un système de priorité est respecté pour l'évaluation des expressions ( ) , ** , * / , + - .

Remarques

- Un système de priorité est respecté pour l'évaluation des expressions ( ) , ** , * / , + - .

Page 19: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE EXECUTABLEPARTIE EXECUTABLE

STRUCTURES DE CONTROLESTRUCTURES

DE CONTROLE

STRUCTURES CONDITIONNELLES

STRUCTURES CONDITIONNELLES

STRUCTURES REPETITIVESSTRUCTURES REPETITIVES

IF… THEN … END IFIF… THEN … END IF

IF … THEN … ELSE … END IF

IF … THEN … ELSE … END IF

IF … THEN … ELSIF … ELSE … END IF

IF … THEN … ELSIF … ELSE … END IF

LOOP … END LOOPLOOP … END LOOP

WHILE … LOOP … END LOOP

WHILE … LOOP … END LOOP

FOR … LOOP … END LOOPFOR … LOOP … END LOOP

Page 20: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE EXECUTABLEPARTIE EXECUTABLE

IF <condition1> THEN-- Séquence1 instructions;

ELSIF <condition2> THEN-- Séquence2 Instructions;

ELSIF <condition3> THEN-- Séquence3 Instructions;

…ELSIF <conditionN> THEN

-- SéquenceN Instructions;

ELSE-- Séquence_else

Instructions;

END IF;

IF <condition1> THEN-- Séquence1 instructions;

ELSIF <condition2> THEN-- Séquence2 Instructions;

ELSIF <condition3> THEN-- Séquence3 Instructions;

…ELSIF <conditionN> THEN

-- SéquenceN Instructions;

ELSE-- Séquence_else

Instructions;

END IF;

IF <condition> THEN -- Séquence1 instructions;

ELSE -- Séquence2 instructions;

END IF;

IF <condition> THEN -- Séquence1 instructions;

ELSE -- Séquence2 instructions;

END IF;

IF <condition> THEN -- Séquence1

instructions;END IF;

IF <condition> THEN -- Séquence1

instructions;END IF;

STRUCTURES CONDITIONNELLES

STRUCTURES CONDITIONNELLES

Page 21: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE EXECUTABLEPARTIE EXECUTABLE

FOR <compteur> IN [REVERSE] b_inf..b_supLOOP… ;END LOOP;

- Compteur est déclarée implicitement.- Interdiction de modification de compteur dans la boucle.- La notion de pas n'existe pas (pas=1 ou -1).

FOR <compteur> IN [REVERSE] b_inf..b_supLOOP… ;END LOOP;

- Compteur est déclarée implicitement.- Interdiction de modification de compteur dans la boucle.- La notion de pas n'existe pas (pas=1 ou -1).

WHILE <condition>LOOP… ;END LOOP ;

WHILE <condition>LOOP… ;END LOOP ;

[<label<]LOOP… ;EXIT [label] [ WHEN <condition>] ;…END LOOP [label] ;

[<label<]LOOP… ;EXIT [label] [ WHEN <condition>] ;…END LOOP [label] ;

STRUCTURES REPETITIVES

STRUCTURES REPETITIVES

Page 22: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

PARTIE EXECUTABLEPARTIE EXECUTABLE

LES CURSEURSLES CURSEURS

Une zone mémoire de taille fixe contenant le résultat d'une requête.

Utilisée pour interpréter et analyser les ordres SQL.

Le nombre de curseurs ouverts simultanément est défini par le paramètre OPEN_CURSORS . dans le PFILE de la base.

Une zone mémoire de taille fixe contenant le résultat d'une requête.

Utilisée pour interpréter et analyser les ordres SQL.

Le nombre de curseurs ouverts simultanément est défini par le paramètre OPEN_CURSORS . dans le PFILE de la base.

CURSEURSCURSEURS

IMPLICITES

générés et gérés par le noyau Oracle pour

chaque ordre SQL

IMPLICITES

générés et gérés par le noyau Oracle pour

chaque ordre SQL

EXPLICITES

Déclaré par l'user dans la

section DECLARE d'un

bloc PLS

EXPLICITES

Déclaré par l'user dans la

section DECLARE d'un

bloc PLS

Page 23: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

LES CURSEURS EXPLICITES

LES CURSEURS EXPLICITES

Étapes de création d'un CURSEUR

explicite

Étapes de création d'un CURSEUR

expliciteDECLARATION DU

CURSEUR

CURSOR … IS

DECLARATION DU CURSEUR

CURSOR … IS

OUVERTURE DU CURSEUR

OPEN

OUVERTURE DU CURSEUR

OPEN

ACCES AU CURSEUR

FETCH … INTO

ACCES AU CURSEUR

FETCH … INTO

FERMETURE DU CURSEUR

CLOSE

FERMETURE DU CURSEUR

CLOSE

Page 24: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

DECLARATION DU CURSEUR

CURSOR … IS

DECLARATION DU CURSEUR

CURSOR … IS

LES CURSEURS EXPLICITES

LES CURSEURS EXPLICITES

Syntaxe

DECLARE

CURSOR <nom_curseur> ISSELECT col1, col2, col3, …FROM tab1, tab2, tab3, …WHERE <condition>;

… ;

Syntaxe

DECLARE

CURSOR <nom_curseur> ISSELECT col1, col2, col3, …FROM tab1, tab2, tab3, …WHERE <condition>;

… ;

Exemple

DECLARE

CURSOR c_employe ISSELECT empno, ename, salaireFROM employeWHERE salaire BETWEEN 1000 AND 2500 ;

Exemple

DECLARE

CURSOR c_employe ISSELECT empno, ename, salaireFROM employeWHERE salaire BETWEEN 1000 AND 2500 ;

Page 25: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

OUVERTURE D'UN CURSEUR

OPEN …

OUVERTURE D'UN CURSEUR

OPEN …

LES CURSEURS EXPLICITES

LES CURSEURS EXPLICITES

Syntaxe

BEGIN… ;OPEN <nom_curseur>;… ;END;

Syntaxe

BEGIN… ;OPEN <nom_curseur>;… ;END;

ExempleDECLARE

CURSOR c_employe ISSELECT empno, ename, salaireFROM employeWHERE salaire BETWEEN 1000 AND 2500 ;

BEGINOPEN c_employe;… ;

END;

ExempleDECLARE

CURSOR c_employe ISSELECT empno, ename, salaireFROM employeWHERE salaire BETWEEN 1000 AND 2500 ;

BEGINOPEN c_employe;… ;

END;

Page 26: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

TRAITEMENT DES LIGNES DU CURSEUR

FETCH … INTO

TRAITEMENT DES LIGNES DU CURSEUR

FETCH … INTO

LES CURSEURS EXPLICITES

LES CURSEURS EXPLICITES

Syntaxe

BEGIN… ;FETCH <nom_cur> INTO {<liste_var> |<var_record>};… ;END;

Syntaxe

BEGIN… ;FETCH <nom_cur> INTO {<liste_var> |<var_record>};… ;END;

ExempleDECLARE

no employe.empno%TYPE; -- Variables programmes

name employe.ename%TYPE;CURSOR c_employe IS -- CurseurSELECT empno, enameFROM employeWHERE salaire BETWEEN 1000 AND 2500 ;

BEGIN

OPEN c_employe;FETCH c_employe INTO no,ename; -- Accès aux

lignes du cruseurDBMS_OUTPUT.PUT_LINE(no,ename) ;

END;

ExempleDECLARE

no employe.empno%TYPE; -- Variables programmes

name employe.ename%TYPE;CURSOR c_employe IS -- CurseurSELECT empno, enameFROM employeWHERE salaire BETWEEN 1000 AND 2500 ;

BEGIN

OPEN c_employe;FETCH c_employe INTO no,ename; -- Accès aux

lignes du cruseurDBMS_OUTPUT.PUT_LINE(no,ename) ;

END;

Page 27: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

FERMETURE D'UN CURSEUR

CLOSE …

FERMETURE D'UN CURSEUR

CLOSE …

LES CURSEURS EXPLICITES

LES CURSEURS EXPLICITES

Syntaxe

BEGIN… ;CLOSE <nom_curseur>;… ;END;

Syntaxe

BEGIN… ;CLOSE <nom_curseur>;… ;END;

ExempleDECLARE

CURSOR c_employe ISSELECT empno, ename, salaireFROM employeWHERE salaire BETWEEN 1000 AND 2500 ;

BEGINOPEN c_employe;… ;CLOSE c_employe;

END;

ExempleDECLARE

CURSOR c_employe ISSELECT empno, ename, salaireFROM employeWHERE salaire BETWEEN 1000 AND 2500 ;

BEGINOPEN c_employe;… ;CLOSE c_employe;

END;

Page 28: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

ATTRIBUTS DES CURSEURS

ATTRIBUTS DES CURSEURS

LES CURSEURS EXPLICITES

LES CURSEURS EXPLICITES

Attribut Type Syntaxe Rôle

%NOTFOUND

Booléen

{<nom_cursor>}%ATTRIBUT

Retourne TRUE si la dernière commande FETCH n'a pas ramené de lignes.

%FOUND Booléen Retourne TRUE si la dernière commande FETCH a ramené une ligne.

%ROWCOUNT

Numérique

Retourne le nombre de lignes ramenées par la commande FETCH.

%ISOPEN Booléen Retourne TRUE si le curseur est ouvert et FALSE sinon.

Page 29: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

LES CURSEURS EXPLICITES

LES CURSEURS EXPLICITES

Parcours des lignes d'un curseurParcours des lignes d'un curseur

En passant par la boucle

LOOP … END LOOP

BEGINLOOP

FETCH … ;INTO … ;IF <curseur>%FOUND THEN…

ELSEEXIT ;

END IFEND LOOP;

En passant par la boucle

LOOP … END LOOP

BEGINLOOP

FETCH … ;INTO … ;IF <curseur>%FOUND THEN…

ELSEEXIT ;

END IFEND LOOP;

En utilisant la boucle

FOR enreg IN <nom_curseur>LOOP

END LOOP;

En utilisant la boucle

FOR enreg IN <nom_curseur>LOOP

END LOOP;

Exemple

FOR enreg IN c_employeLOOP

END LOOP;

Exemple

FOR enreg IN c_employeLOOP

END LOOP;

Page 30: Oracle -  PL / SQL (Procedural Language / Structured Query Language)

LES CURSEURS PARAMETRESLES CURSEURS PARAMETRES

Il est possible de paramétrer un curseur pour une utilisation commune à plusieurs traitements.

Syntaxe déclaration

DECLARECURSOR <nom_curseur> (p1 type_p1 [,p2 type_p2 [, …]) ISSELECT …FROM …WHERE <condition qui utilisent les paramètres>

…;

Utilisation du curseur paramétrerBEGIN

OPEN <nom_cur>(val1,[,val2 [,…]);FETCH <nom_cur>INTO …;CLOSE <nom_cur>;

END;

Il est possible de paramétrer un curseur pour une utilisation commune à plusieurs traitements.

Syntaxe déclaration

DECLARECURSOR <nom_curseur> (p1 type_p1 [,p2 type_p2 [, …]) ISSELECT …FROM …WHERE <condition qui utilisent les paramètres>

…;

Utilisation du curseur paramétrerBEGIN

OPEN <nom_cur>(val1,[,val2 [,…]);FETCH <nom_cur>INTO …;CLOSE <nom_cur>;

END;