adplus-dvertising

Records en PL/SQL - structures de données

Records en PL/SQL - structures de données

Les records sont des variables composites qui peuvent stocker des valeurs de données de différents types, similaires à un type struct en C, C++ ou Java.En PL SQL, les record sont utiles pour contenir des données de lignes de table ou certaines colonnes de lignes de table.

PL/SQL peut gérer les types de records suivants :

  •  Basés sur une table/vue/curseur
  •  définis par l'utilisateur.

Vous pouvez définir des types RECORD et déclarer des records définis par l'utilisateur dans la partie déclarative(DECLARE) de n'importe quel bloc, sous-programme ou package.

Record basé sur une table|vue|curseur

L'attribut %ROWTYPE vous permet de déclarer un enregistrement PL/SQL qui représente une ligne dans une table de base de données, sans lister toutes les colonnes. Votre code continue de fonctionner même après l'ajout de colonnes à la table. Si vous souhaitez représenter un sous-ensemble de colonnes dans une table ou des colonnes de différentes tables, vous pouvez définir une vue ou déclarer un curseur pour sélectionner les colonnes souhaitées et effectuer les jointures nécessaires, puis appliquer %ROWTYPE à la vue ou au curseur.

Syntaxe
nom_record nom_cols%ROWTYPE;  
                            

Avec :

  •  nom_record - Un nom approprié pour le record.
  •  nom_cols - Nom de la table ou la vue ou le curseur
  Exemple:

L'exemple suivant crée un record basé sur la table Employes, donc le record contient la structure de ligne dans cette table :

DECLARE
	rec_emp Employes%ROWTYPE;
BEGIN
	-- corps du programme
END;
                            

Supposons que nous souhaitons créer un record contenant les colonnes: nom, âge et nom du département de chaque employé. il est clair que les colonnes proviennent de différentes tables. Pour créer cet record, il faut d'abord créer une vue ou un curseur qui sélectionne ces colonnes puis associer ce curseur ou vue au record.

DECLARE
	CURSOR liste_cols IS SELECT E.Nom, E.Age, D.Nom_dep FROM Employes E INNER JOIN Departement D ON E.Dep=D.Id_dep;
	rec_emp liste_cols%ROWTYPE;
BEGIN
	-- corps du programme
END;
                            

Record défini par l'utilisateur

Le type RECORD est défini comme suit :

Syntaxe
TYPE nom_record IS RECORD ( 
    champ1  typedonnees1  [NOT NULL]  [:= expression_par_defaut], 
    champ2  typedonnees2  [NOT NULL]  [:= expression_par_defaut], 
    ... 
    champN  typedonneesN  [NOT NULL]  [:= expression_par_defaut);
);  
                            

Avec :

  •  nom_record - Un nom approprié pour le record.
  •  champ(i) - Nom de l'attribut ou la colonne
  •  typedonnees(i) - Type de données associé a chaque attribut
  •  expression_par_defaut - Une valeur par défaut.

Un record peut être initialisé dans sa déclaration. Vous pouvez utiliser l'attribut %TYPE pour spécifier le type de données d'un champ. Vous pouvez ajouter la contrainte NOT NULL à n'importe quelle déclaration de champ pour empêcher l'attribution de valeurs nulles à ce champ. Les champs déclarés comme NOT NULL doivent être initialisés.

Pour référencer des champs individuels dans un record, vous utilisez la notation nom_rec.nom_champ. Par exemple, pour référencer le champ Nom dans le record rec_emp, vous utiliseriez rec_emp.Nom

  Exemple 1:

L'exemple suivant crée un record nommé Personne,

DECLARE
    -- autres déclarations
    TYPE Personne IS RECORD ( 
        Id NUMBER NOT NULL
        Titre  VARCHAR(30), 
        Age NUMBER,
        Departement VARCHAR(30)
    );
    -- autres déclarations
    
BEGIN
    -- Corps du programme
END;
                            

Vous pouvez maintenant créer n'importe quelle variable de type record, utiliser le record comme paramètre d'une fonction, procédure et valeur de retour d'une fonction.

p1 Personne;

Au lieu d'attribuer des valeurs séparément à chaque champ d'un record, vous pouvez attribuer des valeurs à tous les champs à la fois:

  •   Vous pouvez affecter un record défini par l'utilisateur à un autre s'ils ont le même type de données. (Il ne suffit pas d'avoir des champs qui correspondent exactement.) Vous pouvez attribuer un record %ROWTYPE à un record défini par l'utilisateur si leurs champs correspondent en nombre et en ordre, et que les champs correspondants ont des types de données compatibles.
  •   Vous pouvez utiliser l'instruction SELECT ou FETCH pour extraire les valeurs de colonnes dans un record. Les colonnes de la liste de sélection doivent apparaître dans le même ordre que les champs de votre record.
  Exemple 2:
DECLARE
    emp1 Employes%ROWTYPE; -- record basé sur la structure d'une ligne de la table Eemployes;
BEGIN
    SELECT * INTO emp1 FROM Employes WHERE Id=3;
    
    -- afficher les données du record
    dbms_output.put_line('Nom : '|| emp1.Nom); 
    dbms_output.put_line('Salaire : '|| emp1.Salaire);
    dbms_output.put_line('Age : '|| emp1.Age);
END;
                            
  Exemple 3:

Vous pouvez transmettre un record en tant que paramètre de sous-programme tout comme vous transmettez toute autre variable.

DECLARE
    -- autres déclarations
    TYPE Personne IS RECORD ( 
        Id NUMBER NOT NULL
        Nom  VARCHAR(30), 
        Age NUMBER,
        Departement VARCHAR(30)
    );
    p1 Personne; -- une variable de type personne

    PROCEDURE afficher(p Personne) IS
    BEGIN
        dbms_output.put_line('ID : '|| p.Id); 
        dbms_output.put_line('Nom : '|| p.Nom); 
        dbms_output.put_line('Age : '|| p.Age); 
        dbms_output.put_line('Departement : '|| p.Departement); 
    END;
    -- autres déclarations
BEGIN
    -- Initialiser le record p1
    p1.Id=1;
    p1.Nom='Ismail';
    p1.Age=27;
    p1.Departement='Informatique';

    -- Afficher les informations de la personne p1
    afficher(p1); 
END;
                            
Partager ce cours avec tes amis :
 
Rédigé par ESSADDOUKI Mostafa
ESSADDOUKI
The education of the 21st century opens up opportunities to not merely teach, but to coach, mentor, nurture and inspire.