Collections de Type Record
◼ Une variable de type record peut représenter une ligne d’une table relationnelle.
◼ TYPE type_var IS RECORD (
nom_champ1 type_champ1 [[NOT NULL] := exp],
nom_champn type_champn [[NOT NULL] := exp]
);
◼ nom_var type_var ;
◼ Exemple:
◼ Type PERSONNE IS RECORD(
nom VARCHAR2(15),
prenom VARCHAR2(20));
◼ p PERSONNE ; -- champs [Link], [Link]
M. DIAW ADMIN BD
Utilisation des types implicites
◼ attribut %type : signifie du même type que
v1 [Link]%type ;
-- v1 du même type que la colonne nom
-- de la table Employe
v2 v1%type ; -- v2 du même type que v1
◼ RefProd CHAR(5) ;
◼ RefClient RefProd%type ; -- RefClient est du même type que RefProd
M. DIAW ADMIN BD
Utilisation des types implicites
◼ attribut %rowtype : signifie du même type
structuré (record) que
◼ emp_rec Employe%rowtype ;
◼ -- emp_rec est de type record
◼ -- ses attributs suivent le schéma de Employe
M. DIAW ADMIN BD
Collection de Type Tableaux (TABLE)
◼ Un tableau PL/SQL
collectionordonnée d’éléments du même type dont les indices ne sont pas
forcément contigus
accessibles uniquement en PL/SQL
peuvent grandir dynamiquement (on ne connait pas à l’avance la taille du tableau)
◼ TYPE Type_nom_tableau IS TABLE OF datatype [NOT NULL] INDEX BY
BINARY_INTEGER;
nom_tableau: nom du tableau
Datatype: type des éléments du tableau (curseur, record, type scalaire, ...)
◼ Declaration : mon_tableau nom_tableau;
M. DIAW ADMIN BD
Collection de Type Tableaux (TABLE)
◼ Type TYPE_Tab_Number
IS TABLE OF Number INDEX BY BINARY_INTEGER;--- tableau d’entiers
(nombres)
◼ Type PERSONNE IS RECORD(
nom VARCHAR2(15),
prenom VARCHAR2(20));
◼ Type Type_Tab_Personne IS TABLE OF Personne INDEX BY BINARY_INTEGER
◼ T1 Type_Tab_Personne;
T1(1).nom:=’Diaw’;
T1(1).prenom:=’Moussa’;
M. DIAW ADMIN BD
Collections de Type Table
◆ VARRAY: Tableau dont on connaît le nombre d’éléments
◆ TYPE nom_type IS VARRAY (taille) OF type_colonne | type_record
◆ Ex: TYPE Type_tab_emp IS VARRAY (50) OF Employe%ROWTYPE;
◼ tab1 Type_tab_emp; -- déclaration de la variable
M. DIAW ADMIN BD
Description des attributs d’un Tableau
Fonction Description
[Link] Le nombre d’éléments de T
[Link] Supprime tout le tableau
[Link](n) Supprime l’élément à la position N
[Link] (n,m) supprime les éléments de la position N à la position M
[Link](n) retourne true si l’élément à la position N existe
[Link] Indice de la première position
[Link] Indice de la dernière position
[Link] (N) Position suivant l’indice N
[Link](N) Position avant l’indice N
M. DIAW ADMIN BD
Exemple d’utilisation des tableaux
SET SERVEROUTPUT ON
Declare
Type Type_Tab_Number is table of Number index by binary_integer;
T1 Type_Tab_Number; i number;
BEGIN
i :=1;
Loop
T1(i):=i; i := i + 1,
exit when i>10 ;
end loop;
dbms_output.put_line (‘Premier élément : '||T1([Link]) );
dbms_output.put_line (‘Dernier élément : '||T1([Link]) );
dbms_output.put_line (‘Nombre d’’éléments de T1 avant suppression: '||[Link]);
dbms_output.put_line (‘Suppresion des éléments de la position
'||[Link]([Link])||' à la postition '||[Link]([Link]));
[Link]([Link]([Link]), [Link]([Link]));
dbms_output.put_line (‘Nombre d’éléments deT1 après suppression : '||[Link]);
END; M. DIAW ADMIN BD
Exemple d’utilisation des tableaux
DECLARE
i number(2);
Type Type_tab_Number is varray(12) of number;
tab Type_tab_Number;
BEGIN’
for i in 1..12 loop tab(i):=(2*i); end loop;
dbms_output.put_line('Nombre d’éléments du tableau avant suppression: '||[Link]);
[Link]([Link]);
dbms_output.put_line(‘Nombre d’éléments du tableau après suppression: ‘||[Link]);
for i in [Link] . .[Link] loop
if ([Link](i)) then
dbms_output.put_line(i||' '||tab(i));
end if;
end loop;
end; M. DIAW ADMIN BD
/
Notion de sous-type
◼ Chaque type de données PL/SQL prédéfini a ses caractéristiques (domaine, opérateurs, ...)
◼ Un sous-type d’un type de base permet d’en restreindre certaines de ses caractéristiques.
◼ sous-types prédéfinis en PL/SQL servant à rendre les applications compatibles avec la norme SQL
(CHARACTER, INTEGER, POSITIVE, . . .).
◼ L’utilisateur peut définir ses propres sous-types.
SUBTYPE nomSousType IS TypeDeBase [NOT NULL];
subtype DATE_NAISS_TYPE is DATE NOT NULL ;
subtype NOMBRE_TYPE is NUMBER(1,0) -- entre -9 et +9
subtype MARQUE_TYPE is [Link]%type
-- type de la colonne Maque de la table Voiture
M. DIAW ADMIN BD
Conversion de types
◼ Comme en SQL, Oracle autorise des conversions implicites
ou explicites.
◼ une_date DATE := ’27-11-2007’;
◼ une_chaine VARCHAR2(20) := sysdate ;
◼ date1 DATE:= to_date(’10/11/12’,’DD/MM/YY’);
M. DIAW ADMIN BD
Les structures de contrôle
L’instruction Si alors
condition then
◼ if
instr
[elsif condition then
instr]
[else
instr]
◼ end if ;
M. DIAW ADMIN BD
Les structures de contrôle
La boucle Pour
◼ For indice in [reverse] debut .. Fin loop
Instruction;
◼ end loop;
NB: Dans la boucle for l’indice est incrémenté par le
système
• sans REVERSE : indice varie de debut à Fin, pas de 1
• Avec REVERSE : indice varie de Fin à debut, pas de -1
M. DIAW ADMIN BD
Exemple Factorielle de 9: Boucle FOR
◼ SETSERVEROUTPUT ON
◼ DECLARE
factnumber := 1 ;
i number(2);
◼ BEGIN
FOR i IN 1..9 LOOP
◼ fact := fact * i ;
◼ END LOOP;
DBMS_OUTPUT.PUT_LINE(‘Factorielle de 9 est : ’ ||fact) ;
◼ END;
◼/
M. DIAW ADMIN BD
Les structures de contrôle
La boucle Tant que
◼While condition loop
Instruction;
◼end loop;
M. DIAW ADMIN BD
Reste de la division de 10 par 3
◼ SETSERVEROUTPUT ON
◼ DECLARE
reste number := 10 ;
◼ BEGIN
WHILE reste >= 3 LOOP
◼ reste := reste - 3 ;
END LOOP;
DBMS_OUTPUT.PUT_LINE(‘Le reste de la division de 10 par 3 est: ‘||reste);
◼ END;
◼/
M. DIAW ADMIN BD
Les structures de contrôle
La boucle Répéter
◼Loop
Instruction;
Exit when condition;
◼end loop;
M. DIAW ADMIN BD
Insertion dans la table Resulat : Loop
◼ CREATE TABLE Resultat (nombre number(2));
◼ DECLARE
nbre number(2) := 1 ;
◼ BEGIN
LOOP
◼ insert into resultat values (nbre);
◼ nbre := nbre +1 ;
◼ EXIT WHEN nbre > 10 ;
END LOOP ;
◼ END ;
◼/
◼ Select * FROM Resultat;
◼ Truncate Table Resultat;
M. DIAW ADMIN BD