Vous êtes sur la page 1sur 13

3

Ecrire des instructions exécutables

Objectifs

A la fin de ce TP, vous pourrez :


• identifier les unités lexicales d'un bloc PL/SQL
• utiliser des fonctions SQL intégrées dans du code PL/SQL
• décrire dans quels cas des conversions implicites ont lieu
et dans quels cas effectuer des conversions explicites
• écrire des blocs imbriqués et qualifier des variables avec
des étiquettes
• écrire du code lisible, grâce à une indentation appropriée
• utiliser des séquences dans des expressions PL/SQL

3-2

1
Contenu du TP

• Ecrire des instructions exécutables dans un bloc PL/SQL


• Ecrire des blocs imbriqués
• Utiliser des opérateurs et développer du code lisible

3-3

Unités lexicales d'un bloc PL/SQL

Les unités lexicales :


• sont les blocs constitutifs de n'importe quel bloc PL/SQL
• sont des séquences de caractères incluant des lettres,
des nombres, des tabulations, des espaces, des retours
chariot et des symboles
• peuvent être classées en différents groupes :
– Identificateurs : v_fname, c_percent
– Délimiteurs : ; , +, -
– Littéraux : John, 428, True
– Commentaires : --, /* */

3-4

2
Syntaxe des blocs PL/SQL et règles à respecter
• Littéraux
– Les littéraux de type caractère et date doivent être placés entre
apostrophes.
– Les nombres peuvent être des valeurs simples ou utiliser une notation
scientifique.
v_name := 'Henderson';
• Mise en forme du code : Les instructions peuvent s'étendre sur
plusieurs lignes.

3-5

Inclure des commentaires dans le code


• Faites précéder les commentaires monolignes de deux
traits d'union (--).
•Placez les commentaires multilignes entre les symboles
/* et */.
Exemple :
DECLARE
...
v_annual_sal NUMBER (9,2);
BEGIN
/* Compute the annual salary based on the
monthly salary input from the user */
v_annual_sal := monthly_sal * 12;
--The following line displays the annual salary
DBMS_OUTPUT.PUT_LINE(v_annual_sal);
END;
/

3-6

3
Fonctions SQL dans le code PL/SQL

• Disponibles dans les instructions procédurales :


– Fonctions monolignes numériques et de type caractère, les
fonctions de conversion de type de données et les fonctions
de date et d'horodatage :
• Non disponibles dans les instructions procédurales :
– DECODE
– Fonctions de groupe (AVG, MIN, MAX, COUNT, SUM,
STDDEV et VARIANCE). Les fonctions de groupe
s'appliquent à des groupes de lignes dans une table. Par
conséquent, elles ne sont disponibles que dans les
instructions SQL d'un bloc PL/SQL.
LOWER CONCAT ROUND MONTHS_BETWEEN TO_CHAR
UPPER SUBSTR TRUNC ADD_MONTHS TO_NUMBER
INITCAP LENGTH MOD NEXT_DAY TO_DATE
INSTR LAST_DAY
LPAD | RPAD ROUND
TRIM TRUNC
3-7 REPLACE

Fonctions SQL dans le code PL/SQL : Exemples

• Déterminer la longueur d'une chaîne :


v_desc_size INTEGER(5);
v_prod_description VARCHAR2(70):='You can use this
product with your radios for higher frequency';

-- get the length of the string in prod_description


v_desc_size:= LENGTH(v_prod_description);

• Déterminer le nombre de mois travaillés par un employé :


v_tenure:= MONTHS_BETWEEN (CURRENT_DATE, v_hiredate);

3-8

4
Utiliser des séquences dans des expressions PL/SQL

Depuis la version 11g :


DECLARE
v_new_id NUMBER;
BEGIN
v_new_id := my_seq.NEXTVAL;
END;
/

Avant la version 11g :


DECLARE
v_new_id NUMBER;
BEGIN
SELECT my_seq.NEXTVAL INTO v_new_id FROM Dual;
END;
/

3-9

Conversion de type de données

• Conversion de données en types comparables


• Deux types de conversion :
– Conversion implicite
– Conversion explicite
• Fonctions :
– TO_CHAR
– TO_DATE
– TO_NUMBER
– TO_TIMESTAMP

3 - 10

5
Exemple de conversion implicite

DECLARE
v_salary NUMBER(6):=6000;
v_sal_hike VARCHAR2(5):='1000';
v_total_salary v_salary%TYPE;
BEGIN
v_total_salary:=v_salary + v_sal_hike;
dbms_output.put_line (v_total_salary);
END;
/

3 - 11

Conversion de type de données

-- implicit data type conversion


1 v_date_of_joining DATE:= '02-Feb-2000';

-- error in data type conversion


2 v_date_of_joining DATE:= 'February 02,2000';

-- explicit data type conversion


3 v_date_of_joining DATE:= TO_DATE('February
02,2000','Month DD, YYYY');

3 - 12

6
Contenu du TP

• Ecrire des instructions exécutables dans un bloc PL/SQL


• Ecrire des blocs imbriqués
• Utiliser des opérateurs et développer du code lisible

3 - 13

Blocs imbriqués

Les blocs PL/SQL peuvent être imbriqués.


• Une section exécutable (BEGIN …
END) peut contenir des blocs imbriqués.
• Une section de traitement des
exceptions peut contenir des
blocs imbriqués.

3 - 14

7
Blocs imbriqués : Exemple

DECLARE
v_outer_variable VARCHAR2(20):='GLOBAL VARIABLE';
BEGIN
DECLARE
v_inner_variable VARCHAR2(20):='LOCAL VARIABLE';
BEGIN
DBMS_OUTPUT.PUT_LINE(v_inner_variable);
DBMS_OUTPUT.PUT_LINE(v_outer_variable);
END;
DBMS_OUTPUT.PUT_LINE(v_outer_variable);
END;

3 - 15

Portée et visibilité des variables

DECLARE
v_father_name VARCHAR2(20):='Patrick';
v_date_of_birth DATE:='20-Apr-1972';
BEGIN
DECLARE
v_child_name VARCHAR2(20):='Mike';
v_date_of_birth DATE:='12-Dec-2002';
BEGIN
DBMS_OUTPUT.PUT_LINE('Father''s Name: '||v_father_name);
DBMS_OUTPUT.PUT_LINE('Date of Birth: '||v_date_of_birth);
DBMS_OUTPUT.PUT_LINE('Child''s Name: '||v_child_name);
END;
DBMS_OUTPUT.PUT_LINE('Date of Birth: '||v_date_of_birth);
END;
/

3 - 16

8
Exercice

Tester ensuite rectifier ce bloc pour un affichage propre des


contenus de la chaîne Ch1 :

Begin
Declare
Ch1 varchar2 (10) := 'Phrase 2';
Begin
dbms_output.put_line ('Ch1 = ' || Ch1);
End ;
dbms_output.put_line ('Ch1 = ' || Ch1);
End ;
/

3 - 17

Utiliser un qualificateur avec des blocs imbriqués

BEGIN <<outer>>
DECLARE
v_father_name VARCHAR2(20):='Patrick';
v_date_of_birth DATE:='20-Apr-1972';
BEGIN
DECLARE
v_child_name VARCHAR2(20):='Mike';
v_date_of_birth DATE:='12-Dec-2002';
BEGIN
DBMS_OUTPUT.PUT_LINE('Father''s Name: '||v_father_name);
DBMS_OUTPUT.PUT_LINE('Date of Birth: '
||outer.v_date_of_birth);
DBMS_OUTPUT.PUT_LINE('Child''s Name: '||v_child_name);
DBMS_OUTPUT.PUT_LINE('Date of Birth: '||v_date_of_birth);
END;
END;
END outer;

3 - 18

9
Problème : Déterminer la portée des variables

BEGIN <<outer>>
DECLARE
v_sal NUMBER(7,2) := 60000;
v_comm NUMBER(7,2) := v_sal * 0.20;
v_message VARCHAR2(255) := ' eligible for commission';
BEGIN
DECLARE
v_sal NUMBER(7,2) := 50000;
v_comm NUMBER(7,2) := 0;
v_total_comp NUMBER(7,2) := v_sal + v_comm;
BEGIN
1 v_message := 'CLERK not'||v_message;
outer.v_comm := v_sal * 0.30;
END;
2 v_message := 'SALESMAN'||v_message;
END;
END outer;
/

3 - 19

Contenu du TP

• Ecrire des instructions exécutables dans un bloc PL/SQL


• Ecrire des blocs imbriqués
• Utiliser des opérateurs et développer du code lisible

3 - 20

10
Opérateurs en langage PL/SQL

• Opérateurs logiques
• Opérateurs arithmétiques
• Opérateur de concaténation Identiques en
• Parenthèses permettant de langage SQL
contrôler l'ordre des opérations

• Opérateur exponentiel (**)

3 - 21

Opérateurs en langage PL/SQL : Exemples

• Incrémenter le compteur pour une boucle :


loop_count := loop_count + 1;

• Définir la valeur d'un indicateur booléen :


good_sal := sal BETWEEN 50000 AND 150000;

• Vérifier qu'un numéro d'employé contient une valeur :


valid := (empno IS NOT NULL);

3 - 22

11
Règles de programmation

Facilitez la maintenance du code :


• en ajoutant des commentaires
• en développant une convention d'utilisation des
majuscules et des minuscules
• en développant des conventions d'appellation pour
les identificateurs et les autres objets
• en utilisant des indentations pour améliorer la clarté

3 - 23

Indenter le code

Pour plus de clarté, indentez chaque niveau du code.

BEGIN DECLARE
IF x=0 THEN y:=1; deptno NUMBER(4);
END IF; locatno NUMBER(4);
END; BEGIN
/ SELECT department_id, location_id
INTO deptno, locatno
FROM departments
WHERE department_name = 'Sales';
...
END;
/

3 - 24

12
Quiz

Vous pouvez utiliser la plupart des fonctions SQL monolignes


de type numérique, caractère, conversion et date dans des
expressions PL/SQL.
a. Vrai
b. Faux

3 - 25

Synthèse

Ce TP a permis d'apprendre à :
• identifier les unités lexicales d'un bloc PL/SQL
• utiliser des fonctions SQL intégrées dans du code PL/SQL
• écrire des blocs imbriqués afin de fractionner des
fonctionnalités liées logiquement
• déterminer dans quels cas effectuer des conversions
explicites
• qualifier des variables dans les blocs imbriqués
• utiliser des séquences dans des expressions PL/SQL

3 - 26

13

Vous aimerez peut-être aussi