Les curseurs paramétrés
Il est possible de réutiliser un même curseur avec des valeurs différentes, dans un même bloc PL/SQL :
DECLARE
CURSOR mon_curseur (param1 TYPE, param2 TYPE, ... ) IS mon_ordre_select ;
-- l’ordre select utilise les paramètres param1, param2...
BEGIN
OPEN mon_curseur (val1, val2,...) ; ...
CLOSE mon_curseur;
END;
Les curseurs paramétrés
Les types des paramètres sont les suivants : CHAR, NUMBER, DATE, BOOLEAN,
Leur longueur n’est pas spécifiée. Le passage des valeurs des paramètres s’effectue à l’ouverture du curseur.
Les curseurs paramétrés
DECLARE
CURSOR c_empp(s1 number,s2 number) IS SELECT *
FROM emp WHERE salaire between s1 and s2;
BEGIN
FOR eng IN c_empp(10000,21000) LOOP
DBMS_OUTPUT.PUT_LINE(eng.nom||' '||eng.salaire);
END LOOP;
END;
/
Mettre à jour des données avec un curseur : CURRENT-OF
la clause CURRENT-OF permet d’accéder directement, en modification ou en suppression, à la ligne que vient de
renvoyer l’ordre FETCH.
Au préalable, dans la déclaration du curseur, il faut réserver les lignes qui seront modifiées par la pose d’un verrou
d’intention (...FOR UPDATE OF colonne_à_ modifier...).
DECLARE
CURSOR mon_curseur IS SELECT nom, salaire, commission FROM emp FOR UPDATE OF sal ;
BEGIN
FOR ma_structure IN mon_curseur LOOP
IF ma_structure.comm IS NOT NULL THEN
-- si pas de commission, le salaire augmente de 5%
UPDATE emp SET salaire = salaire*1.05 WHERE CURRENT OF mon_curseur;
END IF;
END LOOP;
END;
Gestion des erreurs
Le PL/SQL disposait d’un mécanisme pour traiter les erreurs et les exceptions rencontrées dans les blocs PL/SQL.
Il existe deux grandes familles d’erreurs :
• celles retournées par Oracle (table inaccessible, conflit de mise à jour...) ;
• celles dues à l’écriture du programme utilisateur.
Gestion des erreurs
- Syntaxe d’utilisation des exceptions DECLARE
...
nom_erreur EXCEPTION ; ...
BEGIN ...
IF (problème rencontré) THEN RAISE nom_erreur ; ...
EXCEPTION
WHEN nom_erreur THEN (traitement de l’erreur);
END;
Gestion des erreurs
Pour les erreurs Oracle prédéfinies, vous n’avez pas besoin de placer une instruction d’appel à l’exception dans le code PL/SQL :
DECLARE ...
BEGIN ...
EXCEPTION
WHEN ZERO_DIVIDE THEN (traitement de l’erreur);
WHEN NO_DATA_FOUND THEN (traitement de l’erreur);
...
Gestion des erreurs :Procédure RAISE_APPLICATION_ERROR
La procédure RAISE_APPLICATION_ERROR
permet de définir ses propres messages et codes d’erreurs. Cette procédure évite le renvoi
d’exceptions non traitées car le numéro d’erreur
(inclus dans RAISE_APPLICATION_ERROR) sera communiqué à l’environnement appelant.
Gestion des erreurs :Procédure RAISE_APPLICATION_ERROR
RAISE_APPLICATION_ERROR(numéroErreur, message );
numéroErreur : valeur définie par l'utilisateur pour l'exception, comprise entre –20 000 et –20 999
message : chaîne de caractères (max 2 048 octets) décrivant l’erreur.
Les procédures
PROCEDURE ma_procedure (par1, par2, ...parn) IS -- zone de déclaration : des variables locales, des – – curseurs , des exceptions
BEGIN
-- traitements EXCEPTION
-- traitement des exceptions...
END;
Les procédures
Une variable paramètre doit se conformer à la syntaxe suivante :
nom_parametre [ IN | OUT | IN OUT ] type_du_paramètre
Le type_du_paramètre doit être NUMBER, CHAR, BOOLEAN... Ainsi, un type
NUMBER(7,2) n’est pas accepté.
Les fonctions
FUNCTION ma_fonction (par1,par2,...parn) RETURN type_de_la_variable_retournée IS -- zone de déclaration : des variables locales – des curseurs des exceptions
BEGIN
-- traitements
-- clause RETURN EXCEPTION
-- traitement des exceptions...
-- clause RETURN END;
Les fonctions
Une variable paramètre doit se conformer à la syntaxe suivante :
nom_parametre [ IN | OUT | IN OUT ] type_du_paramètre
Le type_du_paramètre doit être NUMBER, CHAR, BOOLEAN... Ainsi, un type
NUMBER(7,2) n’est pas accepté.
Pour la clause RETURN, il suffit d’indiquer son type : NUMBER, CHAR, BOOLEAN, sans lui donner de nom.