420-PK6-SL Banques de données Avancées PL/SQL la suite
ENTRÉES AU CLAVIER Pour quérir une valeur au clavier lors de l'exécution d'une fonction SqlPlusfournis l'opérateur «&». PL/SQL n'a pas de mécanisme pour lire du clavier.pl/sql est un langage exécuté sur le serveur et donc n'ayant pas accès au client. Il suffira de le placer devant le nom d'une variable pour que SqlPlusdemande la valeur au clavier. L'invite est généré par SqlPluset ne peux être changée. De plus, l'invite est suivi de deux lignes d'état. Entrez une valeur pour phrase : 'Marcel Aubin, 450-537-1253,61' ancien 5 : ligne := &phrase; nouveau 5 : ligne := 'Marcel Aubin, 450-537-1253,61'; set verify off; DECLARE item VARCHAR2(32); ligne VARCHAR2(255); BEGIN ligne :=&phrase; DBMS_OUTPUT.PUT_LINE( ligne ); END; /
TRAITEMENT Une PROCEDURE ou une FONCTION PL/SQL doit traiter des données et pour ce faire, PL/SQL possède une batterie de fonctions pour nous assister dans cette tâche. Les principales catégories de fonctions sont : Encodage/Décodage Traductions (encodages) Traitement de Chaines Autres (voir la section Références du site web pour des liens)
PARAMÈTRES DE FONCTIONS & PROCEDURES En PL/SQL, les paramètres peuvent êtres passés en référenceou en valeur. En valeur : Seul la valeur de la variable utilisée dans l'appel est passée. i.e. Le contenu de la variable à l'appel est copié dans le paramètre de la fonction. Tout changement effectué à la valeur du paramètre ne se réflète pas dans la variable utilisée dans l'appel. En référence : La variable utilisée dans l'appel liée au paramètre. i.e. L'adresse de la variable à l'appel est copié dans le paramètre de la fonction. Tout changement effectué à la valeur du paramètre affectela variable utilisée dans l'appel.
PARAMÈTRES DE FONCTIONS & PROCEDURES (suite) Les mots clés IN et OUT servent à identifier le mode de passage. En combinant ces opérateurs, on peux passer des paramètres de trois façons différentes : IN : Sert à passer une valeur à l'appel. CREATE PROCEDURE test ( valeur IN NUMBER ) OUT : Sert à récupérer une valeur au retour. CREATE PROCEDURE test ( resultatout NUMBER ) IN OUT : Permet de passer une valeur à l'appel et d'en récupérer une au retour. CREATE PROCEDURE incremente( valeur IN OUT NUMBER )
PARAMÈTRES DE FONCTIONS & PROCEDURES (suite) Exemple d'application : Fonction qui sépare les items de la chaine CREATE OR REPLACE FUNCTION gettoken( data IN OUT VARCHAR, sep IN CHAR ) RETURN VARCHAR IS tstr VARCHAR2(32767); pos NUMBER; BEGIN pos := INSTR( data, sep ); IF ( pos = 0 ) THEN data :=''; RETURN data; ELSE tstr:= SUBSTR( data, 1, pos-1 ); data := SUBSTR( data, pos+1 ); RETURN tstr; END IF; END; / BUT: Séparer les éléments d'une chaine délimitée. APPROCHE : Une fonction qui : a) retournera le premier élément de la chaine. b) ôtera ce premier élément de la chaine. Une boucle qui appellera cette fonction tant qu'il restera des éléments dans la chaine.
PARAMÈTRES DE FONCTIONS & PROCEDURES (suite) Exemple d'application : Boucle de balayage de la chaine DECLARE phrase VARCHAR2(128) :='"Aubin,Marcel";"232-234-122";61'; token VARCHAR2(32); pos NUMBER; BEGIN WHILE LENGTH(phrase) > 0 LOOP token:= gettoken( phrase, ';'); DBMS_OUTPUT.PUT_LINE( 'Item:[' token ']'); DBMS_OUTPUT.PUT_LINE( 'Phrase: [' phrase ']'); END LOOP; END; / Résultat : Phrase: ["Aubin,Marcel";"232-234-122";61] Item: ["Aubin,Marcel"] Phrase: ["232-234-122";61] Item: ["232-234-122"] Phrase: [61]
CURSEURS (suite) Il arrive souvent que nous répétions la même requête mais en variant simplement notre clause. Il serait alors pratique de pouvoir conserver la requête et simplement y injecter la/les valeur/s changeant dans la clause. En PL/SQL cela s'accomplit par les CURSEURS PARAMETRÉS. DECLARE NUMBER n := 14 ; CURSOR C IS SELECT * FROM PERSONNE WHERE numpers>= n ; ROW C%rowType ; BEGIN FOR ROW IN C LOOP DBMS_OUTPUT. PUT_LINE ( ROW. numpers) ; END LOOP ; END; / Le code de droite est-il valide? NON: n peux changer de valeur à tout moment dans le code
CURSEURS (suite) Exemple d'application : Il faut donc paramétrer notre curseur. Le code à droite nous illustre un curseur paramétré. Les deux blocs en dessous nous montre comment utiliser le curseur paramétré. Il suffit de faire suivre le nom du curseur par la liste des paramètres entre parenthèses dans la commande OPEN. Curseur paramétré : CURSOR enfants( numparent NUMBER) IS SELECT * FROM PERSONNE WHERE pere = numparent OR mere = numparent; Utilisation d'un curseur paramétré : OPEN enfants( 2 ); Utilisation d'un curseur paramétré : FOR item IN enfants( 2 ) LOOP... END LOOP;
LES EXCEPTIONS Un autre concept important est celui de la gestion des erreurs ou exceptions. PL/SQL nous offre la possibilité d'intercepter les exception. La syntaxe varie cependant de la forme connu de la plupart des langages de programmation. L'exception se traite par le mon clé EXCEPTION inséré entre le BEGIN et le END du bloc de code. Entre EXCEPTION et END, nous énuméreront les situations à intercepter via la commande WHEN nom_d'exception THEN nom_d'exceptionreprésente l'objet-exceptioncorrespondant à une situation donnée. Il existe plusieurs objets-exceptions prédéfinies mais l'usager pourra définir ses propres exceptions.
LES EXCEPTIONS (suite) BEGIN... EXCEPTION WHEN NO_DATA_FOUND THEN... WHEN TOO_MANY_ROWS THEN... END; Oracle (via PL/SQL) définis un bon nombre d'exceptions. CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX TIMEOUT_ON_RESOURCE INVALID_CURSOR NOT_LOGGED_ON LOGIN_DENIED NO_DATA_FOUND ZERO_DIVIDE INVALID_NUMBER TOO_MANY_ROWS STORAGE_ERROR PROGRAM_ERROR VALUE_ERROR ACCESS_INTO_NULL COLLECTION_IS_NULL SUBSCRIPT_OUTSIDE_LIMIT SUBSCRIPT_BEYOND_COUNT ROWTYPE_MISMATCH SYS_INVALID_ROWID SELF_IS_NULL CASE_NOT_FOUND USERENV_COMMITSCN_ERROR NO_DATA_NEEDED
LES EXCEPTIONS (suite) Pour intercepter les autres exceptions on peux avoir recours à WHEN OTHERS THEN Il faut noter qu'oracle peux présenter d'autres exceptions qui n'ont pas de nom de défini. Elles n'auront que le code numérique d'exception comme identifiant. Le WHEN OTHERS THEN interceptera aussi ces exceptions. Référez-vous à la documentation d'oracle pour connaître ces exceptions. La variable SQLCODE contiendra ce code d'exception et vous pourrez l'interroger dans votre code traitant du WHEN OTHERS THEN. Finalement, on peux avoir recours au ELSE pour intercepter tout ce qu'on ne veux pas traiter spécifiquement.
LES EXCEPTIONS (suite) On peux aussi définir ses propres exceptions : Une telle exception sera : Déclarée dans la section DECLARE Lancée par notre propre code PL/SQL ignore son existence et son but. Ainsi, dans le code suivant, vous allez créer une nouvelle exception appelée MAUVAISE_VALEUR et quand l'usager n'entrera pas la bonne valeur vous allez la lancer. DECLARE MAUVAISE_VALEUR EXCEPTION;... BEGIN... IF (...) THEN RAISE MAUVAISE_VALEUR; END IF;... EXCEPTION WHEN MAUVAISE_VALEUR THEN traitez l'exception ici END: