Vous êtes sur la page 1sur 27

6

Utiliser des types de données composites

Copyright © Oracle, 2004. Tous droits réservés.


Objectifs

A la fin de ce chapitre, vous pourrez :


• créer des enregistrements PL/SQL définis par
l'utilisateur
• créer des enregistrements avec l'attribut
%ROWTYPE
• créer une table INDEX BY
• créer une table d'enregistrements INDEX BY
• faire la distinction entre les enregistrements, les
tables, et les tables d'enregistrements

Copyright © Oracle, 2004. Tous droits réservés.


Types de données composites

• Ils peuvent contenir plusieurs valeurs,


contrairement aux types scalaires.
• Ils sont de deux types :
– Enregistrements PL/SQL
– Ensembles PL/SQL
Tables INDEX BY ou tableaux
associatifs
Table imbriquée
VARRAY

Copyright © Oracle, 2004. Tous droits réservés.


Copyright © Oracle, 2004. Tous droits réservés.
Types de données composites

• Utilisez des enregistrements PL/SQL lorsque vous


souhaitez stocker des valeurs de différents types
de données, mais une seule occurrence à la fois.
• Utilisez des ensembles PL/SQL lorsque vous
souhaitez stocker des valeurs de même type de
données.

Copyright © Oracle, 2004. Tous droits réservés.


Enregistrements PL/SQL

• Ils doivent être composés d'un ou plusieurs champs


de type scalaire, RECORD ou TABLE INDEX BY.
• Ils sont semblables aux structures de la plupart des
langages de troisième génération, tels que C et C++.
• Ils sont définis par l'utilisateur et peuvent être un
sous-ensemble d'une ligne d'une table.
• Ils traitent un ensemble de champs comme une
unité logique.
• Ils permettent d'extraire une ligne de données à
partir d'une table pour la traiter.

Copyright © Oracle, 2004. Tous droits réservés.


Créer un enregistrement PL/SQL

Syntaxe :
1 TYPE type_name IS RECORD
(field_declaration[, field_declaration]…);

2 identifier type_name;

field_declaration :
field_name {field_type | variable%TYPE
| table.column%TYPE | table%ROWTYPE}
[[NOT NULL] {:= | DEFAULT} expr]

Copyright © Oracle, 2004. Tous droits réservés.


Créer un enregistrement PL/SQL

Déclarez des variables pour le stockage du nom, du


poste et du salaire d'un nouvel employé.
Exemple :
...
TYPE emp_record_type IS RECORD
(last_name VARCHAR2(25),
job_id VARCHAR2(10),
salary NUMBER(8,2));
emp_record emp_record_type;
...

Copyright © Oracle, 2004. Tous droits réservés.


Structure d'un enregistrement PL/SQL

Champ1 Champ2 Champ3


(type de données) (type de données) (type de données)

Exemple :

Champ1 Champ2 Champ3


(type de données) (type de données) (type de données)
employee_id number(6) last_name varchar2(25) job_id varchar2(10)

100 King AD_PRES

Copyright © Oracle, 2004. Tous droits réservés.


Attribut %ROWTYPE

• Déclarez une variable correspondant à l’ensemble


des colonnes d'une table ou d'une vue de base de
données.
• Faites précéder %ROWTYPE du nom de la table ou
de la vue de base de données.
• Les noms et types de données des champs de
l'enregistrement sont issus des colonnes de la
table ou de la vue.
Syntaxe :

DECLARE
identifier reference%ROWTYPE;

Copyright © Oracle, 2004. Tous droits réservés.


Avantages liés à l'utilisation
de l'attribut %ROWTYPE

• Il n'est pas nécessaire de connaître le nombre et


les types de données des colonnes sous-jacentes.
• Le nombre et les types des colonnes sous-
jacentes peuvent être modifiés lors de l'exécution.
• L'attribut permet d'extraire une ligne avec
l'instruction SELECT *.

Copyright © Oracle, 2004. Tous droits réservés.


Attribut %ROWTYPE

...
DEFINE employee_number = 124
DECLARE
emp_rec employees%ROWTYPE;
BEGIN
SELECT * INTO emp_rec FROM employees
WHERE employee_id = &employee_number;
INSERT INTO retired_emps(empno, ename, job, mgr,
hiredate, leavedate, sal, comm, deptno)
VALUES (emp_rec.employee_id, emp_rec.last_name,
emp_rec.job_id,emp_rec.manager_id,
emp_rec.hire_date, SYSDATE, emp_rec.salary,
emp_rec.commission_pct, emp_rec.department_id);
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Insérer un enregistrement avec %ROWTYPE

...
DEFINE employee_number = 124
DECLARE
emp_rec retired_emps%ROWTYPE;
BEGIN
SELECT employee_id, last_name, job_id, manager_id,
hire_date, hire_date, salary, commission_pct,
department_id INTO emp_rec FROM employees
WHERE employee_id = &employee_number;
INSERT INTO retired_emps VALUES emp_rec;
END;
/
SELECT * FROM retired_emps;

Copyright © Oracle, 2004. Tous droits réservés.


Mettre à jour une ligne d'une table
avec un enregistrement
SET SERVEROUTPUT ON
SET VERIFY OFF
DEFINE employee_number = 124
DECLARE
emp_rec retired_emps%ROWTYPE;
BEGIN
SELECT * INTO emp_rec FROM retired_emps;
emp_rec.leavedate:=SYSDATE;
UPDATE retired_emps SET ROW = emp_rec WHERE
empno=&employee_number;
END;
/
SELECT * FROM retired_emps;

Copyright © Oracle, 2004. Tous droits réservés.


Tables INDEX BY ou tableaux associatifs

• Structures PL/SQL avec deux colonnes :


– Entier ou chaîne de type clé primaire
– Colonne de type scalaire ou RECORD
• Pas de contrainte de taille. La taille dépend des
valeurs pouvant être contenues dans le type de
données de clé.

Copyright © Oracle, 2004. Tous droits réservés.


Copyright © Oracle, 2004. Tous droits réservés.
Créer une table INDEX BY

Syntaxe :
TYPE type_name IS TABLE OF
{column_type | variable%TYPE
| table.column%TYPE} [NOT NULL]
| table%ROWTYPE
[INDEX BY PLS_INTEGER | BINARY_INTEGER
| VARCHAR2(<size>)];
identifier type_name;
Déclarez une table INDEX BY pour le stockage du nom
des employés.
...
TYPE ename_table_type IS TABLE OF
employees.last_name%TYPE
INDEX BY PLS_INTEGER;
...
ename_table ename_table_type;

Copyright © Oracle, 2004. Tous droits réservés.


Structure des tables INDEX BY

Clé unique Valeur


... ...

1 Jones
5 Smith
3 Maduro

... ...

PLS_INTEGER Scalaire

Copyright © Oracle, 2004. Tous droits réservés.


Créer une table INDEX BY
DECLARE
TYPE ename_table_type IS TABLE OF
employees.last_name%TYPE
INDEX BY PLS_INTEGER;
TYPE hiredate_table_type IS TABLE OF DATE
INDEX BY PLS_INTEGER;
ename_table ename_table_type;
hiredate_table hiredate_table_type;
BEGIN
ename_table(1) := 'CAMERON';
hiredate_table(8) := SYSDATE + 7;
IF ename_table.EXISTS(1) THEN
INSERT INTO ...
...
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Utiliser les méthodes des tables INDEX BY

Les méthodes suivantes facilitent l'utilisation


des tables INDEX BY :
– EXISTS – NEXT
– COUNT – TRIM
– FIRST et LAST – DELETE
– PRIOR

Copyright © Oracle, 2004. Tous droits réservés.


Table d'enregistrements INDEX BY

Définissez une variable de table INDEX BY contenant


une ligne entière d'une table.
Exemple :
DECLARE
TYPE dept_table_type IS TABLE OF
departments%ROWTYPE
INDEX BY PLS_INTEGER;
dept_table dept_table_type;
-- Each element of dept_table is a record

Copyright © Oracle, 2004. Tous droits réservés.


Exemple de table d'enregistrements
INDEX BY
SET SERVEROUTPUT ON
DECLARE
TYPE emp_table_type IS TABLE OF
employees%ROWTYPE INDEX BY PLS_INTEGER;
my_emp_table emp_table_type;
max_count NUMBER(3):= 104;
BEGIN
FOR i IN 100..max_count
LOOP
SELECT * INTO my_emp_table(i) FROM employees
WHERE employee_id = i;
END LOOP;
FOR i IN my_emp_table.FIRST..my_emp_table.LAST
LOOP
DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name);
END LOOP;
END;
/

Copyright © Oracle, 2004. Tous droits réservés.


Tables imbriquées

1 Bombay
2 Sydney
3 Oxford
4 London
.. ....
2 Go

Copyright © Oracle, 2004. Tous droits réservés.


Tables imbriquées

• Syntaxe :
TYPE type_name IS TABLE OF
{column_type | variable%TYPE
| table.column%TYPE} [NOT NULL]
| table.%ROWTYPE

Copyright © Oracle, 2004. Tous droits réservés.


VARRAY

1 Bombay
2 Sydney
3 Oxford
4 London
.. ....
10 Tokyo

Copyright © Oracle, 2004. Tous droits réservés.


Synthèse

Ce chapitre vous a permis d'apprendre à :


• définir et référencer des variables PL/SQL
possédant des types de données composites :
– enregistrements PL/SQL
– tables INDEX BY
– tables d'enregistrements INDEX BY
• définir un enregistrement PL/SQL en utilisant
l'attribut %ROWTYPE

Copyright © Oracle, 2004. Tous droits réservés.


Présentation de l'exercice 6

Cet exercice porte sur les points suivants :


• déclarer des tables INDEX BY
• traiter des données en utilisant des tables INDEX
BY
• déclarer un enregistrement PL/SQL
• traiter des données à l'aide d'un enregistrement
PL/SQL

Copyright © Oracle, 2004. Tous droits réservés.

Vous aimerez peut-être aussi