Académique Documents
Professionnel Documents
Culture Documents
Traitement de transactions
Blocs
Variables
Instructions
Structure de contrôle
Curseurs
Procédures/fonctions stockées
Packages
Triggers
1. Section déclaration
2. Section corps du bloc
3. Section traitement des erreurs (Exception)
Section facultative
Section obligatoire
Facultative
DECLARE
déclaration
BEGIN
corps-du-bloc
EXCEPTION
traitement-des-erreurs
END;
/ ← A ajouter obligatoirement dans l’exécution d’un
script
PL/SQL Année 2022/2023 8
Exemple
SET SERVEROUTPUT ON
DECLARE x VARCHAR2(10);
BEGIN
x := 'Bonjour';
DBMS_OUTPUT.PUT_LINE(x);
END;
/
PL/SQL Année 2022/2023 9
Exemple1
SET SERVEROUTPUT ON
DECLARE
erreurEx EXCEPTION;
Nom_e editeur.nom%TYPE;
revue_p revue.nomRevue%TYPE;
titre_p article.titre%TYPE;
BEGIN
...
/
PL/SQL Année 2022/2023 10
Exemple1 (suite)
SET SERVEROUTPUT ON
DECLARE
x VARCHAR2(10);
erreurEx EXCEPTION;
id_revue_p revue.idRevue%TYPE;
nom_revue revue.nomRevue%TYPE;
id_editeur_p revue.idEditeur%TYPE;
BEGIN
SELECT idRevue, nomRevue, idEditeur
INTO id_revue_p, nom_revue, id_editeur_p
FROM revue WHERE idRevue = 1;
IF id_editeur_p IS NOT NULL
THEN RAISE erreurEx;
END IF;
DBMS_OUTPUT.PUT_LINE(nom_revue || ' OK');
END;
/
Variables scalaires
Types composés
•Enregistrement (record)
• Table
nom-variable nom-du-type
Exemple
X varachar(2);
nom-variable nom-table.nom-attribut%Type
Exemple
name_trevue revue.nomRevue%Type
nom-variable nom-table%ROWTYPE;
nom-variable nom-curseur%ROWTYPE;
DECLARE
editeur_p editeur%ROWTYPE;
BEGIN
SELECT * INTO editeur_p
FROM editeur WHERE idediteur = 4;
DBMS_OUTPUT.PUT_LINE (editeur_p.nom || ' ' ||
editeur_p.telephone || ' ' || editeur_p.pays);
END;
/
DECLARE
TYPE type_article IS RECORD (
num_a article.idArticle%TYPE, titre_a article.titre%TYPE,
volume_article article.volume%TYPE);
rec_article type_article;
BEGIN
SELECT * INTO rec_article from article WHERE idArticle=1;
DBMS_OUTPUT.PUT_LINE (rec_article.num_a || ' ' || rec_article.titre_a
|| ' ' || rec_article.volume_article);
END;
/
Deux étapes :
TYPE nom-du-type-table
IS TABLE OF type-argument
INDEX BY BINARY_INTEGER;
•Constante (2 types):
ou
Explicite par :
TO_CHAR,
TO_DATE,
TO_NUMBER,
……
Affectation
Opérateur d’affectation :=
DECLARE
TYPE editeur IS RECORD (
nom_e VARCHAR(20),
pays VARCHAR(20));
editeurpaper editeur;
convers NUMBER(6,5);
BEGIN
convers := 6.55957;
editeurpaper.nom_e := 'Groupe de recherche';
editeurpaper.pays := 'Maroc';
DBMS_OUTPUT.PUT_LINE(editeurpaper.pays);
END;
/
PL/SQL Année 2022/2023 33
Affectation / Exemple2
DECLARE
v_nom editeur.nom%TYPE;
v_telephone editeur.telephone%TYPE;
BEGIN
SELECT nom, telephone INTO v_nom, v_telephone
FROM editeur WHERE idediteur=1;
DBMS_OUTPUT.PUT_LINE (v_nom ||' '|| v_telephone);
END;
/
DECLARE
TYPE recEditeur IS RECORD (
r_nom editeur.nom%TYPE,
r_telephone editeur.telephone%TYPE);
r_editeur recEditeur;
BEGIN
SELECT nom, telephone INTO r_editeur
FROM editeur WHERE idediteur=1;
DBMS_OUTPUT.PUT_LINE (r_editeur.r_nom ||' '||
r_editeur.r_telephone);
END;
/
DECLARE
r_editeur editeur%ROWTYPE;
BEGIN
SELECT * INTO r_editeur
FROM editeur WHERE idediteur=1;
DBMS_OUTPUT.PUT_LINE (r_editeur.nom ||' '||
r_editeur.telephone);
END;
/
Structure alternative
Structure répétitivités
IF condition THEN
instructions;
END IF;
IF condition THEN
instructions;
ELSE
instructions;
END IF;
IF condition THEN
instructions;
ELSE IF
instructions;
ELSE
instructions;
END IF;
LOOP
instructions;
END LOOP;
LOOP
instructions;
EXIT WHEN condition;
END LOOP;
LOOP
IF condition THEN
EXIT;
END IF;
END LOOP;
Val-début .. Val-fin
LOOP
Instructions;
END LOOP;
WHILE condition
LOOP
Instructions;
END LOOP;
•......
PL/SQL Année 2022/2023 47
Curseur explicites
Obligatoires pour un SELECT susceptible de produire
plusieurs lignes résultat :
Quatre étapes :
1. Déclaration du curseur
2. Ouverture du curseur
4. Fermeture du curseur
DECLARE
CURSOR C1 IS SELECT titre, pagedebut, pagefin, volume FROM
articleWHERE serie = 123;
BEGIN ...
PL/SQL Année 2022/2023 50
Ouverture d’un curseur
OPEN C1;
ou
CURRENT OF nom-curseur
La nature d’une erreur peut être connue par appel aux fonctions
SQLCODE et SQLERRM
traitement;
END;
DECLARE
e exception;
BEGIN
...
IF ... THEN
RAISE e;
END IF;
...
EXCEPTION
WHEN e THEN
RAISE_APPLICATION_ERROR( -20099, 'nom inéxistant');
END;
DECLARE
...
BEGIN
...
IF ... THEN RAISE_APPLICATION_ERROR ( -20099, 'nom
inéxistant');
END IF;
END;
BEGIN
...
EXCEPTION
WHEN nom-erreur1 THEN traitement-erreur1;
...
WHEN nom-erreurn THEN traitement-erreurn;
Possibilité d’écrire :
EXCEPTION
WHEN NO_DATA_FOUND THEN
...;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('SQLCODE='||TO_CHAR(SQLCODE));
DBMS_OUTPUT.PUT_LINE('SQLERRM:'||TO_CHAR(SQLERRM));
END;
Dans le bloc-fonction :
RETURN nom-variable;
Ecrire une fonction permettant de retourner la somme des articles publiés dans
une série communiquer par l’utilisateur.
Erreurs
• USER_ERRORS
• ALL_ERRORS
•DBA_ERRORS
Infos sur les procédures/fonctions :
• USER_OBJECTS
•ALL_OBJECTS
• DBA_OBJECTS
Infos sur les textes source :
• USER_SOURCE
• ALL_SOURCE
• DBA_SOURCE
nom-procédure (liste-paramètres-effectifs);
EXECUTE dbms_output.put_line(nom-fonction(liste-paramètres
effectifs));
PL/SQL Année 2022/2023 82
Exemple: création procédure