11.07.2015 Views

1 PL/SQL Introduction Pourquoi PL/SQL ? Principales ...

1 PL/SQL Introduction Pourquoi PL/SQL ? Principales ...

1 PL/SQL Introduction Pourquoi PL/SQL ? Principales ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Curseur paramétré Un curseur paramétré peut servir plusieursfois avec des valeurs des paramètresdifférentes On doit fermer le curseur entre chaqueutilisation de paramètres différents (sauf si onutilise « for » qui ferme automatiquement lecurseur)Exempledeclarecursor c(p_dept integer) isselect dept, nome from empwhere dept = p_dept;beginfor employe in c(10) loopdbms_output.put_line(employe.nome);end loop;for employe in c(20) loopdbms_output.put_line(employe.nome);end loop;end;R. Grin <strong>PL</strong>/<strong>SQL</strong> page 49R. Grin <strong>PL</strong>/<strong>SQL</strong> page 50Ligne courante d’un curseur La ligne courante d’un curseur est déplacée àchaque appel de l’instruction fetch On est parfois amené à modifier la lignecourante pendant le parcours du curseur Pour cela on peut utiliser la clause « wherecurrent of » pour désigner cette lignecourante dans un ordre LMD (insert, update,delete) Il est nécessaire d’avoir déclaré le curseuravec la clause FOR UPDATE pour que le bloccompileFOR UPDATE FOR UPDATE [OF col1, col2,…] Cette clause bloque toute la ligne ouseulement les colonnes spécifiées Les autres transactions ne pourront modifierles valeurs tant que le curseur n’aura pasquitté cette ligneR. Grin <strong>PL</strong>/<strong>SQL</strong> page 51R. Grin <strong>PL</strong>/<strong>SQL</strong> page 52ExempleDECLARECURSOR c ISselect matr, nome, salfrom empwhere dept = 10FOR UPDATE OF emp.sal;…if salaire is not null thentotal := total + salaire;else -- met 0 à la place de nullupdate emp set sal = 0where current of c;end if;R. Grin <strong>PL</strong>/<strong>SQL</strong> page 53Fonction qui renvoie un curseursous Oracle Question : comment écrire une fonction (ouune procédure) qui renvoie un curseur ?1. Créer un type pour la référence de curseurqu’on va renvoyer2. Créer la fonction qui renvoie la référence decurseur Attention, solution propriétaire d’Oracle !R. Grin <strong>PL</strong>/<strong>SQL</strong> page 549


Saisir une exception Une exception ne provoque pasnécessairement l’arrêt du programme si elleest saisie par un bloc (dans la partie« EXCEPTION ») Une exception non saisie remonte dans laprocédure appelante (où elle peut être saisie)Exceptions prédéfinies NO_DATA_FOUND TOO_MANY_ROWS VALUE_ERROR (erreur arithmétique) ZERO_DIVIDE …R. Grin <strong>PL</strong>/<strong>SQL</strong> page 61R. Grin <strong>PL</strong>/<strong>SQL</strong> page 62Traitement des exceptionsBEGIN On peut utiliser les 2 variables…prédéfinies <strong>SQL</strong>CODE et <strong>SQL</strong>ERRMEXCEPTIONWHEN NO_DATA_FOUND THEN. . .WHEN TOO_MANY_ROWS THEN. . .WHEN OTHERS THEN -- optionnel. . .END;R. Grin <strong>PL</strong>/<strong>SQL</strong> page 63Exceptions utilisateur Elles doivent être déclarées avec le typeEXCEPTION On les lève avec l’instruction RAISER. Grin <strong>PL</strong>/<strong>SQL</strong> page 64ExempleDECLAREsalaire numeric(8,2);salaire_trop_bas EXCEPTION;BEGINselect sal into salaire from empwhere matr = 50;if salaire < 300 thenraise salaire_trop_bas;end if;-- suite du blocEXCEPTIONWHEN salaire_trop_bas THEN . . .;WHEN OTHERS THENdbms_output.put_line(<strong>SQL</strong>ERRM);END;R. Grin <strong>PL</strong>/<strong>SQL</strong> page 65Procédures et fonctionsR. Grin <strong>PL</strong>/<strong>SQL</strong> page 6611


Bloc anonyme ou nommé Un bloc anonyme <strong>PL</strong>/<strong>SQL</strong> est un bloc«DECLARE –BEGIN –END»comme dansles exemples précédents Dans <strong>SQL</strong>*<strong>PL</strong>US on peut exécuterdirectement un bloc <strong>PL</strong>/<strong>SQL</strong> anonyme entapant sa définition Le plus souvent, on crée plutôt uneprocédure ou une fonction nommée pourréutiliser le codeR. Grin <strong>PL</strong>/<strong>SQL</strong> page 67Création d’une procédure create or replacePROCEDURE() IS-- déclaration des variablesBEGIN-- code de la procédureEND; Pas de DECLARE ; les variables sontdéclarées entre IS et BEGIN Si la procédure ne nécessite aucunedéclaration, le code est précédé de « ISBEGIN »R. Grin <strong>PL</strong>/<strong>SQL</strong> page 68Création d’une fonction create or replaceFUNCTION()RETURN IS-- déclaration des variablesBEGIN-- code de la procédureEND;Passage des paramètres Dans la définition d’une procédure on indiquele type de passage que l’on veut pour lesparamètres :n IN pour le passage par valeurn IN OUT pour le passage par référencen OUT pour le passage par référence maispour un paramètre dont la valeur n’est pasutilisée en entrée Pour les fonctions, seul le passage par valeur(IN) est autoriséR. Grin <strong>PL</strong>/<strong>SQL</strong> page 69R. Grin <strong>PL</strong>/<strong>SQL</strong> page 70Compilation Sous <strong>SQL</strong>*<strong>PL</strong>US, il faut taper une dernièreligne contenant « / » pour compiler uneprocédure ou une fonctionUtilisation des procédures et fonctions Les procédures et fonctions peuvent êtreutilisées dans d’autres procédures oufonctions ou dans des blocs <strong>PL</strong>/<strong>SQL</strong>anonymesR. Grin <strong>PL</strong>/<strong>SQL</strong> page 71R. Grin <strong>PL</strong>/<strong>SQL</strong> page 7212


Fonctions Les fonctions peuvent aussi être utiliséesdans les requêtes <strong>SQL</strong>Exemple de fonctioncreate or replacefunction euro_to_fr(somme IN number)RETURN number IStaux constant number := 6.55957;beginreturn somme * taux;end;R. Grin <strong>PL</strong>/<strong>SQL</strong> page 73R. Grin <strong>PL</strong>/<strong>SQL</strong> page 74Utilisation dans un bloc anonymedeclarecursor c(p_dept integer) isselect dept, nome, sal from empwhere dept = p_dept;beginfor employe in c(10) loopdbms_output.put_line(employe.nome|| ' gagne '|| euro_to_fr(employe.sal)|| ' francs');end loop;end;R. Grin <strong>PL</strong>/<strong>SQL</strong> page 75Utilisation dans une requête <strong>SQL</strong>select nome, sal, euro_to_fr(sal)from emp;R. Grin <strong>PL</strong>/<strong>SQL</strong> page 76Exécution d’une procédure Sous <strong>SQL</strong>*<strong>PL</strong>US on exécute une procédure<strong>PL</strong>/<strong>SQL</strong> avec la commande EXECUTE :EXECUTE nomProcédure(param1, …);Bibliographie Pour cette introduction rapide je me suisinspiré du livre suivant :<strong>SQL</strong> pour Oracle de Soutou et Teste(Eyrolles)R. Grin <strong>PL</strong>/<strong>SQL</strong> page 77R. Grin <strong>PL</strong>/<strong>SQL</strong> page 7813

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!