Chapitre 2 : PL/SQL
Pr. Abdellah Amine
Année universitaire: 2022/2023
PL/SQL
[email protected]Objectifs
Construction des procédures ou fonctions stockées qui
améliorent le mode client-serveur par stockage des procédures ou
fonctions souvent utilisées au niveau serveur
Gestion des erreurs
Construction de triggers (ou déclencheurs)
Traitement de transactions
PL/SQL Année 2022/2023 2
Sommaire
Rappel général
Blocs
Variables
Instructions
Structure de contrôle
Curseurs
Gestion des erreurs
Procédures/fonctions stockées
Packages
Triggers
PL/SQL Année 2022/2023 3
Structure d’un bloc
Un programme ou une procédure PL/SQL est un
ensemble de un ou plusieurs blocs. Chaque bloc
comporte trois sections :
1. Section déclaration
2. Section corps du bloc
3. Section traitement des erreurs (Exception)
PL/SQL Année 2022/2023 4
Section déclaration
Contient la description des structures et des variables
utilisées dans le bloc:
Section facultative
Commence par le mot clé DECLARE
PL/SQL Année 2022/2023 5
Section corps du bloc
Contient les instructions du programme et
éventuellement, à la fin, la section de traitement des
erreurs
Section obligatoire
Commence par le mot clé BEGIN
Se termine par le mot clé END
PL/SQL Année 2022/2023 6
Section traitement des erreurs
Facultative
Introduite par le mot clé EXCEPTION
PL/SQL Année 2022/2023 7
Syntaxe
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;
/
PL/SQL Année 2022/2023 11
Exemple1 (suite partie exception)
SET SERVEROUTPUT ON
DECLARE
x VARCHAR2(10);
……….
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; OK
END IF;
DBMS_OUTPUT.PUT_LINE(nom_revue || ' OK');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('numéro inconnu');
WHEN erreurEx THEN
DBMS_OUTPUT.PUT_LINE(nom_revue || ' problème');
END;
/
PL/SQL Année 2022/2023 12
Exemple1 (suite partie exception)
SET SERVEROUTPUT ON
DECLARE
x VARCHAR2(10);
……….
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; NON OK
END IF;
DBMS_OUTPUT.PUT_LINE(nom_revue || ' OK');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('numéro inconnu');
WHEN erreurEx THEN
DBMS_OUTPUT.PUT_LINE(nom_revue || ' problème');
END;
/
PL/SQL Année 2022/2023 13
Types de variables
Variables scalaires
Types composés
•Enregistrement (record)
• Table
PL/SQL Année 2022/2023 14
Variables scalaires
Types issues de SQL : CHAR, NUMBER,
DATE, VARCHAR(2)
Types PL/SQL : BOOLEAN, SMALLINT,
BINARY_INTEGER, DECIMAL, FLOAT,
INTEGER, ROWID, REAL
Les variables hôtes sont préfixées par « : »
PL/SQL Année 2022/2023 15
Déclaration des variables scalaires
nom-variable nom-du-type
Exemple
X varachar(2);
nom-variable nom-table.nom-attribut%Type
Exemple
name_trevue revue.nomRevue%Type
PL/SQL Année 2022/2023 16
Déclaration pour un enregistrement (1)
Soit par référence à une structure de table ou de
curseur en utilisant :
ROWTYPE :
nom-variable nom-table%ROWTYPE;
nom-variable nom-curseur%ROWTYPE;
PL/SQL Année 2022/2023 17
Exemple
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;
/
PL/SQL Année 2022/2023 18
Déclaration pour un enregistrement (1)
Soit par énumération des rubriques qui la composent.
Cela se fait en deux étapes :
•Déclaration du type enregistrement
Type nom-du-type-record IS RECORD(
nom-attribut1 type-attribut1,
nom-attribut2 type-attribut2, ….);
•Déclaration de la variable de type enregistrement
nom-variable nom-du-type-record;
PL/SQL Année 2022/2023 19
Déclaration pour un enregistrement (1)
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;
/
PL/SQL Année 2022/2023 20
Tables
Structure composée d’éléments d’un même type
scalaire
L’accès à un élément de la table s’effectue grâce à un
indice, ou clé primaire
Cet index est déclaré de type BINARY_INTEGER
(valeurs entières signées)
PL/SQL Année 2022/2023 21
Déclaration pour une table
Deux étapes :
•Déclaration du type de l’élément de la table
•Déclaration de la variable de type table
PL/SQL Année 2022/2023 22
Déclaration pour une table
Déclaration du type de l’élément de la table :
TYPE nom-du-type-table
IS TABLE OF type-argument
INDEX BY BINARY_INTEGER;
Déclaration de la variable de type table :
nom-variable nom-du-type-table;
PL/SQL Année 2022/2023 23
Déclaration pour une table
DECLARE
TYPE tabNom IS TABLE OF VARCHAR2(20)
INDEX BY BINARY_INTEGER;
tableNom tabNom;
i BINARY_INTEGER;
BEGIN
tableNom(5) := 'Dupont';
i := 10;
tableNom(i) := 'Dupond';
END;
/ PL/SQL Année 2022/2023 24
Déclaration pour une table
DECLARE
TYPE tabNom IS TABLE OF VARCHAR2(20) INDEX
BY BINARY_INTEGER;
tableNom tabNom;
i BINARY_INTEGER;
BEGIN
INDEX
tableNom(5) := 'Dupont';
i := 10;
tableNom(i) := 'Dupond';
DBMS_OUTPUT.PUT_LINE(tableNom(i) );
END ;
/
PL/SQL Année 2022/2023 25
Déclaration pour une table
DECLARE
TYPE tabNom IS TABLE OF VARCHAR2(20) INDEX
BY BINARY_INTEGER;
tableNom tabNom;
i BINARY_INTEGER;
Via Num
BEGIN de case
tableNom(5) := 'Dupont';
i := 10;
tableNom(i) := 'Dupond';
DBMS_OUTPUT.PUT_LINE(tableNom(5) );
END;
/
PL/SQL Année 2022/2023 26
Variables (scalaires et composées)
Valeur initiale :
nom-variable nom-type := valeur;
•Constante (2 types):
nom-variable nom-type DEFAULT valeur;
ou
nom-variable CONSTANT nom-type := valeur ;
PL/SQL Année 2022/2023 27
Variables (scalaires et composées)
Visibilité :
une variable est utilisable dans le bloc où elle a été définie ainsi
que dans les blocs imbriqués dans le bloc de définition, sauf si
elle est redéfinie dans un bloc interne
PL/SQL Année 2022/2023 28
Conversion de type
Explicite par :
TO_CHAR,
TO_DATE,
TO_NUMBER,
……
Implicite, par conversion automatique
PL/SQL Année 2022/2023 29
Instructions (1)
Affectation
Instructions du langage SQL : CLOSE, COMMIT, DELETE,
FETCH, INSERT, LOCK, OPEN, ROLLBACK, SAVEPOINT,
SELECT, SET TRANSACTION, UPDATE
PL/SQL Année 2022/2023 30
Instructions (2)
Instructions de contrôle itératif ou répétitif
Instructions de gestion de curseurs
Instructions de gestion des erreurs
PL/SQL Année 2022/2023 31
Affectation
Opérateur d’affectation :=
Option INTO dans un ordre SELECT
Instruction FETCH avec un curseur
PL/SQL Année 2022/2023 32
Affectation / Exemple1
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;
/
PL/SQL Année 2022/2023 34
Affectation / Exemple3
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;
/
PL/SQL Année 2022/2023 35
Affectation / Exemple4
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;
/
PL/SQL Année 2022/2023 36
Structure de contrôle
Structure alternative
Structure répétitivités
PL/SQL Année 2022/2023 37
Structures alternatives
IF condition THEN
instructions;
END IF;
IF condition THEN
instructions;
ELSE
instructions;
END IF;
PL/SQL Année 2022/2023 38
Structures alternatives
IF condition THEN
instructions;
ELSE IF
instructions;
ELSE
instructions;
END IF;
PL/SQL Année 2022/2023 39
Structures répétitives
LOOP
instructions;
END LOOP;
LOOP
instructions;
EXIT WHEN condition;
END LOOP;
PL/SQL Année 2022/2023 40
Structures répétitives(1)
LOOP
IF condition THEN
EXIT;
END IF;
END LOOP;
PL/SQL Année 2022/2023 41
Structures répétitives(2)
FOR Variable-indice IN [REVERSE]
Val-début .. Val-fin
LOOP
Instructions;
END LOOP;
PL/SQL Année 2022/2023 42
Structures répétitives(2)
variable-indice est une variable locale (locale à la boucle)
non déclarée
val-début et val-fin sont des variables locales déclarées et
initialisées ou alors des constantes
le pas est -1 si REVERSE est présent, sinon il est égal à +1
PL/SQL Année 2022/2023 43
Structures répétitives(2)
Exemple : Table de multiplication
SET SERVEROUTPUT ON
declare
type tablemul is record ( par8 number(6), par9 number(6));
type tabledentiers is table of tablemul index by binary_integer;
ti tabledentiers;
i number;
begin
for i in 1..10 loop
ti(i).par9 := i*9 ;
ti(i).par8:= i*8;
dbms_output.put_line (i||'*8='||ti(i).par8||' '||i||'*9='||ti(i).par9 );
end loop;
end;
/
PL/SQL Année 2022/2023 44
Structures répétitives(3)
WHILE condition
LOOP
Instructions;
END LOOP;
PL/SQL Année 2022/2023 45
Les curseurs
Il y a création d’un curseur dès qu’on exécute une instruction
SQL. C’est une zone de travail de l’environnement utilisateur
qui contient les informations relatives à l’instruction SQL :
•Le texte source de l’ordre SQL
•Le texte «compilé» de l’ordre SQL
•Un tampon pour une ligne du résultat
•Le statut (cursor status)
•Des informations de travail et de contrôle
PL/SQL Année 2022/2023 46
Curseur implicites
Gérés automatiquement par le noyau dans les cas suivants :
•Une instruction SELECT exécutée sous SQL
Developer
•Une instruction SELECT donnant une seule ligne de
résultat sous PL/SQL
•Les instructions UPDATE, INSERT et DELETE
•......
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
3. Traitement des lignes du résultat
4. Fermeture du curseur
PL/SQL Année 2022/2023 48
Déclaration du curseur
Association d’un nom de curseur à une requête SELECT
Se fait dans la section DECLARE d’un bloc PL/SQL
•Syntaxe :
CURSOR nom-curseur IS requête;
Un curseur peut être paramétré :
CURSOR nom-curseur(nom-p1 type-p1 [:= val-défaut], ...)
IS requête;
PL/SQL Année 2022/2023 49
Déclaration du curseur : Exemple
DECLARE
CURSOR C1 IS SELECT titre, pagedebut, pagefin, volume FROM
articleWHERE serie = 123;
CURSOR C2 (p VARCHAR(4), q NUMBER(6)) IS SELECT
telephone, fax, pays FROM editeur WHERE nom= p AND
idediteur= q;
BEGIN ...
PL/SQL Année 2022/2023 50
Ouverture d’un curseur
Alloue un espace mémoire au curseur et positionne les éventuels
verrous
OPEN nom-curseur;
ou
OPEN nom-curseur(liste-par-effectifs);
Pour les paramètres, association par position ou par nom sous la
forme
paramètre-formel => paramètre-réel
PL/SQL Année 2022/2023 51
Ouverture d’un curseur
OPEN C1;
OPEN C2(‘IREMOS’, 23) ;
OPEN C2(q=>23, p=>’ IREMOS’) ;
PL/SQL Année 2022/2023 52
Traitement des lignes
Autant d’instructions FETCH que de lignes résultats :
FETCH nom-curseur INTO liste-variables;
ou
FETCH nom-curseur INTO nom-enregistrement;
Au moins quatre formes possibles
PL/SQL Année 2022/2023 53
Forme 1 : affectation dans des variables ayant même type que les attributs
DECLARE
CURSOR C1 IS SELECT nom, pays
FROM editeur;
v_nom editeur.nom%TYPE;
v_pays editeur.pays%TYPE;
BEGIN
OPEN C1;
LOOP
FETCH C1 INTO v_nom, v_pays;
EXIT WHEN C1%NOTFOUND;
dbms_output.put_line(v_nom|| ' ' ||v_pays) ;
END LOOP;
CLOSE C1;
END;
/
PL/SQL Année 2022/2023 54
Forme 2 : affectation dans un enregistrement (RECORD)
SET SERVEROUTPUT ON
DECLARE
CURSOR C1 IS SELECT nom, pays
FROM editeur where pays like 'U%';
TYPE rec_editeur IS RECORD(v_nom editeur.nom%TYPE,
v_pays editeur.pays%TYPE);
r_editeur rec_editeur;
BEGIN
OPEN C1;
LOOP FETCH C1 INTO r_editeur;
EXIT WHEN C1%NOTFOUND;
dbms_output.put_line(
r_editeur.v_nom|| ' ' ||r_editeur.v_pays) ;
END LOOP;
CLOSE C1;
END;
/ PL/SQL Année 2022/2023 55
Forme 3 : affectation dans une structure de données de type curseur
SET SERVEROUTPUT ON
DECLARE
CURSOR C1 IS SELECT nom, pays
FROM editeur where pays LIKE 'U%';
r_edit C1%ROWTYPE;
BEGIN
OPEN C1; LOOP FETCH C1 INTO r_edit;
EXIT WHEN C1%NOTFOUND;
dbms_output.put_line(r_edit.nom|| ' ' ||r_edit.pays) ;
END LOOP; CLOSE C1;
END;
/
PL/SQL Année 2022/2023 56
Forme 4 : Parcourir le curseur par la boucle for
SET SERVEROUTPUT ON
DECLARE
CURSOR C1 IS SELECT nom, pays
FROM editeur where pays LIKE 'U%';
BEGIN
for r_edit in C1
Loop
dbms_output.put_line(r_edit.nom|| ' ' ||r_edit.pays) ;
END LOOP;
END;
/
PL/SQL Année 2022/2023 57
Statut d’un cureur(1)
PL/SQL Année 2022/2023 58
Statut d’un cureur(2)
PL/SQL Année 2022/2023 59
Modification de données
Se fait habituellement avec INSERT, UPDATE ou DELETE
Possibilité d’utiliser la clause FOR UPDATE dans la déclaration
du curseur. Cela permet d’utiliser la clause
CURRENT OF nom-curseur
Dans la clause WHERE des instructions UPDATE et DELETE.
Cela permet de modifier la ligne du curseur traitée par le dernier
FETCH, et donc d’accélérer l’accès à cette ligne
PL/SQL Année 2022/2023 60
Modification de données
SET SERVEROUTPUT ON
DECLARE
CURSOR C IS SELECT * FROM article
WHERE serie=2 FOR UPDATE OF titre;
BEGIN
FOR art IN C LOOP
DBMS_OUTPUT.PUT_LINE('OK '||art.titre || ' ' ||art.serie);
UPDATE article
SET titre= 'Mda approch for security integration during design phase' WHERE
CURRENT OF C;
END LOOP;
END;
/
PL/SQL Année 2022/2023 61
Modification de données
PL/SQL Année 2022/2023 62
Gestion des erreurs (erreurs standard) (1)
PL/SQL Année 2022/2023 63
Gestion des erreurs (erreurs standard)(2)
La nature d’une erreur peut être connue par appel aux fonctions
SQLCODE et SQLERRM
SQLCODE renvoie le statut d’erreur de la dernière instruction
SQL exécutée (0 si n’y a pas d’erreur)
SQLERRM renvoie le message d’erreur correspondant à
SQLCODE
PL/SQL Année 2022/2023 64
Erreurs utilisateur
DECLARE
nom-anomalie EXCEPTION;
BEGIN
...
... IF ... THEN RAISE nom-anomalie;
...
EXCEPTION
WHEN nom-anomalie THEN
traitement;
END;
PL/SQL Année 2022/2023 65
Erreurs anonymes
Pour les codes d’erreur n’ayant pas de nom
associé, il est possible de définir un nom d’erreur
(code entre -20000 et -20999)
PL/SQL Année 2022/2023 66
Erreurs anonymes : Exemple 1
DECLARE
e EXCEPTION;
PRAGMA EXCEPTION_INIT(e, -20091);
...
BEGIN
...
IF ... THEN RAISE e;
EXCEPTION
WHEN e THEN
...
END;
PL/SQL Année 2022/2023 67
Erreurs anonymes : Exemple 2
DECLARE
e exception;
BEGIN
...
IF ... THEN
RAISE e;
END IF;
...
EXCEPTION
WHEN e THEN
RAISE_APPLICATION_ERROR( -20099, 'nom inéxistant');
END;
PL/SQL Année 2022/2023 68
Erreurs anonymes : Exemple 3
DECLARE
...
BEGIN
...
IF ... THEN RAISE_APPLICATION_ERROR ( -20099, 'nom
inéxistant');
END IF;
END;
PL/SQL Année 2022/2023 69
Description du traitement de l’erreur (syntaxe 1)
BEGIN
...
EXCEPTION
WHEN nom-erreur1 THEN traitement-erreur1;
...
WHEN nom-erreurn THEN traitement-erreurn;
WHEN OTHERS THEN traitement-autres-erreurs;
END;
PL/SQL Année 2022/2023 70
Description du traitement de l’erreur (syntaxe 2)
Possibilité d’écrire :
When nom_erreur1 OR erreur2
Then
……………;
PL/SQL Année 2022/2023 71
Exemple
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;
PL/SQL Année 2022/2023 72
Procédures stockées
CREATE [OR REPLACE] PROCEDURE nom-procédure [(argument [mode]
type, ...)] [IS | AS]
bloc-procédure;
argument : nom d’un paramètre formel
mode : définit si le paramètre formel est en entrée (IN), en sortie (OUT) ou en
entrée sortie (IN OUT). Par défaut : IN
type : le type du paramètre formel
bloc-procédure : le corps PL/SQL de la procédure
PL/SQL Année 2022/2023 73
Exemple 1
Ecrire une procédure permettent de modifier le titre en majuscule des articles
dont le volume est supérieur à 10 et la série correspond à la série communiquée
par l’utilisateur, et modifier le titre en minuscule des articles dont le volume est
inférieur à 10 et dont la série correspond à celle communiquée comme entrée.
PL/SQL Année 2022/2023 74
Exemple 1 Réponse
CREATE OR REPLACE PROCEDURE
modifierTitre (num_serie IN article.serie%TYPE) IS
BEGIN
BEGIN
UPDATE article SET titre = UPPER(titre)
WHERE serie = num_serie AND volume> 10;
END;
BEGIN
UPDATE article SET titre = LOWER(titre)
WHERE serie = num_serie AND volume < 10;
END;
END modifierTitre;
PL/SQL Année 2022/2023 75
Fonctions stockées
CREATE [OR REPLACE] FONCTION nom-fonction [(argument [IN] type,
...)] type-retour [IS | AS]
bloc-fonction;
Les paramètres sont forcément en entrée (IN)
Dans le bloc-fonction :
RETURN nom-variable;
PL/SQL Année 2022/2023 76
Exemple 1
Ecrire une fonction permettant de retourner la somme des articles publiés dans
une série communiquer par l’utilisateur.
PL/SQL Année 2022/2023 77
Exemple 1 Réponse
CREATE OR REPLACE FUNCTION
sommeArticle_by_serie (num_serie IN article.serie%TYPE) IS
som_a NUMBER(8) := 0;
e Exception
BEGIN
SELECT SOM(idArticle) into som_a form article
WHERE serie = num_serie;
if som_a is null OR NOT_DATA_FOUND THEN RAISE e;
END IF;
RETURN som_a;
EXCEPTION
WHEN e THEN RETURN 0;
END sommeArticle_by_serie;
PL/SQL Année 2022/2023 78
Informations à propos des fonctions/procédures
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
PL/SQL Année 2022/2023 79
Suppression d’une procédures/ fonctions stockées
DROP PROCEDURE nom-procédure;
DROP FUNCTION nom-fonction;
PL/SQL Année 2022/2023 80
Appel d’une procédure/fonction stockée dans un bloc PL/SQL
nom-procédure (liste-paramètres-effectifs);
nom-variable := nom-fonction(liste-paramètres effectifs);
PL/SQL Année 2022/2023 81
Appel d’une procédure/fonction stockée dans un script SQL Developer
EXECUTE nom-procédure (liste-paramètres-effectifs);
EXECUTE :nom-variable := nom-fonction(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
CREATE OR REPLACE PROCEDURE
nvEditeur(id editeur.idEditeur%TYPE,
name editeur.nom%TYPE, tel editeur.telephone%Type, fx editeur.fax%Type, pys
editeur.pays%Type)
IS
BEGIN
INSERT INTO editeur (idEditeur, nom, telephone, fax, pays)
VALUES (id, name, tel, fx, pys);
END nvEditeur;
PL/SQL Année 2022/2023 83
Exemple: Exécution procédure
EXECUTE nvEditeur(123, ‘iromos’,'0654345367','fax1', 'Maroc');
PL/SQL Année 2022/2023 84