52
PL/SQL M.M.Gammoudi Professeur ISAMM Manouba E-mail: [email protected]

Plsql

  • Upload
    az-za

  • View
    124

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Plsql

PL/SQL M.M.Gammoudi

Professeur

ISAMM Manouba E-mail: [email protected]

Page 2: Plsql

Avantages du PL/SQL

Portabilité

Déclaration des variables

Programmer avec des structures de

contrôle des langages procéduraux

(traitement conditionnel, traitement

répétitif, …)

Gestion des erreurs.

Page 3: Plsql

Declarer des variables

Page 4: Plsql

Structure d’un bloc

PL/SQL

DECLARE -Optionnel

–Variables, curseurs, exceptions définies par l’utilisateur.

• BEGIN -Obligatoire

–Insructions SQL

–Instuctions PL/SQL

•EXCEPTION -Optionnel

–Actions à réaliser lorsqu’une erreur se produit

•END; -Obligatoire

Page 5: Plsql

Structure d’un bloc

PL/SQL

DECLARE

v_variable VARCHAR2(5);

BEGIN

SELECT nom_colonne

INTO v_variable

FROM nom_table;

•EXCEPTION -Optionnel

WHEN nom_exception THEN

•END;

Page 6: Plsql

Utilisation des Variables

On utilise les variables pour :

Le stockage temporaire de données

La manipulation de valeurs stockées

La possibilité de réutilisation

Une maintenance plus facile

Page 7: Plsql

Déclarer des Variables

PL/SQL

Syntaxe

Exemples

Identifiant [CONSTANT] datatype [NOT NULL]

[:= | DEFAULT expr];

Declare

v_hiredate DATE;

v_deptno NUMBER(2) NOT NULL:=10;

v_location VARCHAR2(13) := ‘Atlanta’;

c_comm CONSTANT NUMBER:=1400:

Page 8: Plsql

Déclarer des Variables

PL/SQL

Règles à suivre

Suivre des conventions de dénomination

Initialiser des variables définies avec la

contrainte NOT NULL

Initialisation à l’aide de l’opérateur

d’affectation (:=) ou du mot réservé

DEFAULT

Déclarer un seul identifiant par ligne.

Page 9: Plsql

Types de données

Scalaires

VARCHAR2 (maximum_length)

NUMBER

DATE

CHAR [(maximum_length)]

LONG

BOOLEAN

BINARY_INTEGER

Page 10: Plsql

Déclaration des Variables

Scalaires

Exemples

v_job VARCHAR2(9);

v_count BINARY_INTEGER := 0;

v_total_sal NUMBER(9,2) :=0;

V_orderdate DATE := SYSDATE +7;

C_tax_rate CONSTANT NUMBER(3,2) := 8.25;

V_valid BOOLEAN NOT NULL := TRUE;

Page 11: Plsql

L’Attribut %TYPE

Déclarer une variable à partir de :

La définition d’une colonne de la base de données

La définition d’une variable précédemment déclarée

Préfixer %TYPE avec :

La table et la colonne de la base

Le nom de la variable précédemment déclarée

Page 12: Plsql

Déclarer des Variables

avec l’Attribut %TYPE

Exemples

v_name emp.ename%TYPE;

v_balance NUMBER(7,2);

v_min_balance v_balance%TYPE := 10;

Page 13: Plsql

Référencer des Variables

non-PL/SQL

Stocker le salaire mensuel dans une

variable hôte SQL*Plus

Référencer les variables non-PL/SQL

en tant que variables hôtes.

Préfixer les références de deux points

(:).

:g_monthly_sal := v_sal / 12;

Page 14: Plsql

VARIABLE g_monthly_sal NUMBER;

ACCEPT p_annual_sal PROMPT ‘Entrer le salaire annuel : ‘

DECLARE

v_sal NUMBER(9,2) := &p_annual_sal;

BEGIN

:g_monthly_sal := v_sal / 12;

END;

/

PRINT g_monthly_sal

Exemple: calculer le salaire mensuel, basé sur le

salaire annuel fourni par l’utilisateur.

Page 15: Plsql

Opérateurs en PL/SQL

Logiques

Arithmétiques

Concaténation Identiques à

Parenthèses pour ceux de SQL contrôler l’ordre des opérations

Opérateur exponentiel (**)

Page 16: Plsql

Opérateurs en PL/SQL

Incrementer l’index pour une boucle.

Définir la valeur d’un indicateur

booléen.

Valider le numéro d’un employé s’il

contient une valeur

V_count := v_count + 1;

V_equal := (v_n1 = v_n2);

V_valid := (v_empno IS NOT NULL);

Page 17: Plsql

Instructions SQL en

PL/SQL Extraire une ligne de la base de données grâce à la commande SELECT.Un seul jeu de valeurs peut être retourné.

Modifier des lignes dans la base en utilisant des commandes LMD.

Contrôler une transaction avec les commandes COMMIT, ROLLBACK

Déterminer l’issue d’une commande LMD avec des curseurs implicites.

Page 18: Plsql

Instructions SELECT en

PL/SQL

Extraire une ligne de la base de données

avec select

Syntaxe

SELECT select_list

INTO { variable_name [, variable_name] …

| record_name}

FROM table

WHERE condition;

Page 19: Plsql

Instructions SELECT en

PL/SQL

La clause INTO est obligatoire

Exemple

DECLARE

v_deptno NUMBER(2);

v_loc VARCHAR2(15);

BEGIN

SELECT deptno, loc

INTO v_deptno, v_loc

FROM dept

WHERE dname = ‘SALES’;

END;

Page 20: Plsql

Extraire des données en

PL/SQL

Extraire la date de commande et la date

d’expédition pour la commande spécifiée.

DECLARE

v_orderdate ord.orderdate%TYPE;

v_shipdate ord.shipdate%TYPE;

BEGIN

SELECT orderdate, shipdate

INTO v_orderdate v_shipdate

FROM ord

WHERE id = 620;

END;

Page 21: Plsql

Extraire des données en

PL/SQL

Retourner la somme des salaires de

tous les employés du service spécifié.

DECLARE

v_sum_sal emp.sal%TYPE;

v_deptno NUMBER NOT NULL := 10;

BEGIN

SELECT SUM(SAL) -- group function

INTO v_sum_sal

FROM emp

WHERE deptno = v_deptno;

END;

Page 22: Plsql

Manipuler des données en

PL/SQL

Modifier le contenu des tables de la

base de données à l’aide des

commandes LMD suivantes:

INSERT

UPDATE

DELETE

Page 23: Plsql

Insérer des données

Ajouter les informations concernant un

nouvel employé à la table emp.

Exemple

BEGIN

INSERT INTO emp(empno, ename, job, deptno)

VALUES (50,’HARDING’, ‘CLERK’, 10);

End;

Page 24: Plsql

Mettre à jour des

données

Augmenter le salaire de tous les

employés de la table emp dont la

fonction est analyste.

Exemple

DECLARE

v_sal_increase emp.sal%TYPE := 2000;

BEGIN

UPDATE emp

SET sal = sal + v_sal_increase

WHERE job = ‘ANALYST’;

END;

Page 25: Plsql

Supprimer des données

Supprimer les enregistrements dont le

département est le 10 dans la table

emp.

Exemple

DECLARE

v_deptno emp.deptno%TYPE := 10;

BEGIN

DELETE FROM emp

WHERE deptno = v_ deptno;

END;

Page 26: Plsql

Instructions

COMMIT et ROLLBACK

Une transaction est initialisée par la

première commande LMD, et doit être

suivi d’un COMMIT ou d’un

ROLLBACK.

Utilisez les instructions SQL COMMIT

ou ROLLBACK pour terminer de façon

explicite une transaction.

Page 27: Plsql

Structures de Contrôle

Page 28: Plsql

Le processus

d’exécution PL/SQL

Vous pouvez modifier l’enchaînement logique des instructions en utilisant des instructions conditionnelles IF ou des structures de boucles.

Instructions conditionnelles IF:

IF-THEN-END-IF

IF-THEN-ELSE-END-IF

IF-THEN-ELSIF-END-IF

Page 29: Plsql

Instructions IF

Syntaxe

Instruction IF simple: Si le nom de l’employé est Osborne, lui associer le numéro

de manager 22.

IF condition THEN instructions;

[ELSIF condition THEN instructions;]

[ELSE instructions;]

END IF;

IF v_ename = ‘OSBORNE’ THEN

v_mgr := 22;

END IF;

Page 30: Plsql

Contrôles Itératifs:

instructions LOOP

Les boucles permettent de réaliser

plusieurs fois une instruction ou une

séquence d’instructions.

Il y a trois types de boucles :

La boucle Basique

La boucle FOR

La boucle WHILE

Page 31: Plsql

Boucles Basiques

Syntaxe

LOOP

instruction1;

. . .

EXIT [WHEN condition];

END LOOP;

Où : condition est une variable booléenne ou une expression

Page 32: Plsql

Boucles Basiques

Exemple

DECLARE

v_ordid item.ordid.%TYPE := 601;

v_counter NUMBER(2) := 1;

BEGIN

LOOP

INSERT INTO item(ordid, itemid)

VALUES (v_ordid, v_counter);

v_counter := v_counter + 1;

EXIT WHEN v_counter > 10;

END LOOP;

END;

Page 33: Plsql

Boucles FOR

Syntaxe

Le compteur est déclaré implicitement

FOR counter in [REVERSE]

borne_inférieure..borne_supérieure LOOP

instruction1;

instruction2;

. . .

END LOOP;

Page 34: Plsql

Boucles WHILE

Syntaxe

WHILE condition LOOP

instruction1;

instruction2;

. . .

END LOOP;

Page 35: Plsql

Travailler avec des

types de données

Composés

Page 36: Plsql

PL/SQL Records

Ils sont composés d’un ou plusieurs

champs de types: scalaire, RECORD

Ils traitent un ensemble de Champs

comme une unité logique.

Ils sont pratiques pour extraire et

manipuler une ligne d’une table de la

base.

Page 37: Plsql

Créer un Record PL/SQL

Syntaxe

Où field_declaration est

TYPE type_nom IS RECORD

(field_declaration [, field_declaration]…);

Identifier type_name;

Field_name {field_type | variable%TYPE

| table.column%TYPE | table%ROWTYPE}

[[NOT NULL] {:= | DEFAULT} expr]

Page 38: Plsql

Créer un Record PL/SQL

Exemple

TYPE emp_record_type IS RECORD

(ename VARCHAR2(10) ,

job VARCHAR2(9),

sal NUMBER(7,2));

emp_record emp_record_type;

Page 39: Plsql

L’attribut %ROWTYPE

Il permet de définir une variable à partir d’un ensemble de colonnes d’une table ou d’une vue de la base de données.

Préfixer %ROWTYPE par le nom de la table ou de la vue.

Les champs du Record prennent les Noms et les Types des colonnes de la table ou de la vue.

DECLARE

emp_record emp%ROWTYPE;

Page 40: Plsql

Écrire des curseurs

Explicites

Page 41: Plsql

A propos des Curseurs

Chaque instruction SQL exécutée a son propre curseur individuel qui lui est associé :

Curseurs implicites : déclarés pour toutes les instructions LMD et SELECT PL/SQL

Curseurs explicites : déclarés et nommés par le programmeur.

Page 42: Plsql

Fonctionnement des

curseurs Explicites

7369 SMITH CLERK

7566 JONES MANAGER

7788 SCOTT ANALYST

7876 ADAMS CLERK

7902 FORD ANALYST

Curseur

Ensemble actif de lignes

(Active Set)

Ligne

courante

Page 43: Plsql

Contrôler les Curseurs

Explicites

DECLARE OPEN FETCH CLOSE

oui

non

Créer une Identifier Charger la -Tester Libérer

zone SQL l’ensmble ligne courante l’existence l’ ensemble

nommée actif de dans les de lignes actif

lignes variables - si OUI,

Retourner à FETCH

Page 44: Plsql

Ouvrir un Curseur

Syntaxe

Ouvrir le curseur pour exécuter la requête et

identifier l’Ensemble de lignes actif.

Si la requête ne retourne pas de lignes,

aucune exception n’est signalée.

Utilisez les attributs du curseur pour tester le

résultat après affectation.

OPEN cursor_name;

Page 45: Plsql

Ramener les données à

partir du Curseur

Syntaxe

Chargez les valeurs de la ligne courante dans des variables de sortie.

Prévoir le même nombre de variables.

Ajuster la position des variables par rapport aux colonnes.

Tester si le curseur contient des lignes.

FETCH cursor_name INTO [variable1, variable2, …]

| record_name];

Page 46: Plsql

Ramener les données à

partir du Curseur

Exemple: ramener les 10 premiers employés

DECLARE

v_empno emp.empno%TYPE;

v_ename emp.ename%TYPE;

CURSOR emp_cursor IS

SELECT empno,ename

FROM emp;

BEGIN

OPEN emp_cursor;

FOR i IN 1..10 LOOP

FETCH emp_cursor INTO v_empno, v_ename;

END LOOP;

END;

Page 47: Plsql

Fermer un Curseur

Syntaxe

Fermer le curseur après avoir terminé le

traitement des lignes.

N’essayer pas de ramener les données

d’un curseur s’il a été fermé.

CLOSE cursor_name;

Page 48: Plsql

Attributs d’un curseur SQL

Grâce aux attributs d’un curseur SQL, vous

pouvez tester l’issue de vos instructions SQL.

SQL%ROWCOUNT Nombre d’enregistrements traités

par la dernière instruction SQL

(une valeur entière)

SQL%FOUND Attribut booléen qui vaut TRUE si

la dernière instruction SQL a

traité un ou plusieurs

enregistrements

SQL%NOTFOUND Attribut booléen qui vaut TRUE si

la dernière instruction SQL n’ a

traité aucun enregistrements

SQL%ISOPEN Vaut toujours FALSE car PL/SQL

ferme les curseurs implicites

immédiatement après leur

exécution

Page 49: Plsql

Attributs d’un curseur

SQL Exemple : ramener les 10 premiers employés

DECLARE

v_empno emp.empno%TYPE;

v_ename emp.ename%TYPE;

CURSOR emp_cursor IS

SELECT empno,ename

FROM emp;

BEGIN

OPEN emp_cursor;

FOR i IN 1..10 LOOP

FETCH emp_cursor INTO v_empno, v_ename;

EXIT WHEN emp_cursor%ROWCOUNT > 10

OR emp_cursor%NOTFOUND;

END LOOP;

CLOSE emp_cursor;

END;

Page 50: Plsql

Curseurs et Records

Traiter les lignes de l’ensemble actif en

ramenant les valeurs dans un RECORD

PL/SQL

DECLARE

CURSOR emp_cursor IS

SELECT empno,ename

FROM emp;

emp_recored emp_cursor%ROWTYPE;

BEGIN

OPEN emp_cursor;

LOOP

FETCH emp_cursor INTO emp_record;

END LOOP.

END;

Page 51: Plsql

Curseur dans une boucle

FOR

Syntaxe

Simplification d’écriture pour les curseurs implicites.

Ouverture, fetch et fermeture implicite du curseur.

Le record est déclaré implicitement.

FOR record_name IN cursor_name LOOP

statement1;

statement2;

. . .

END LOOP;

Page 52: Plsql

Curseur dans une boucle

FOR

Exemple : ramener tous employés un à

un

DECLARE

CURSOR emp_cursor IS

SELECT empno,ename

FROM emp;

BEGIN

FOR emp_record IN emp_cursor LOOP

IF ………. …

…..

END LOOP;

END;