L’accès et la gestion efficaces des données en PL/SQL peuvent être complexes.
Sans une méthode appropriée, les performances peuvent être compromises, entraînant des traitements lents et inefficaces.
Cet article explore l’utilisation de SELECT INTO et BULK COLLECT, des techniques qui optimisent l’extraction et la manipulation des données.
Maîtriser le langage SQL en environnement SGBDR. SQL n'aura plus de secrets pour vous !
Introduction à PL/SQL SELECT INTO
Dans les blocs PL/SQL, l’instruction SELECT INTO est une technique essentielle pour extraire et stocker des données de manière dynamique à partir d’une table dans des variables déclarées. Cette méthode permet d’affecter directement les résultats de requêtes à des variables pour des traitements spécifiques au sein d’un programme PL/SQL. En parallèle, le mot-clé BULK COLLECT permet de manipuler efficacement de grandes quantités de données en une seule opération, en les stockant dans des collections PL/SQL. Ces deux approches optimisent l’interaction avec les tables de la base de données, assurant à la fois clarté et performance.
Extraction de données avec SELECT INTO
En PL/SQL, le SELECT INTO permet de récupérer une ou plusieurs valeurs d’une table et de les stocker dans des variables. Il est souvent utilisé dans des blocs PL/SQL pour assigner des résultats de requêtes à des variables pour traitement ultérieur.
SELECT
EXPRESSION1 [, ...]
INTO
VARIABLE1 [, ...]
FROM TABLE
[ WHERE PREDICAT ] ;
- EXPRESSION1, … :Les colonnes ou expressions sélectionnées depuis la table.
- VARIABLE1, … :Les variables où les valeurs sélectionnées seront stockées.
- <nom_table> :Le nom de la table source.
- PREDICAT (optionnel) :La clause WHERE pour filtrer les données selon des critères spécifiques.
Supposons que vous ayez une table nommée salaries contenant les colonnes id, nom, et salaire. Vous voulez extraire le nom et le salaire d’un employé spécifique en utilisant son id.
SET SERVEROUTPUT ON;
DECLARE
var_salarie salaries%ROWTYPE;
BEGIN
SELECT * INTO var_salarie FROM salaries WHERE numero_sal = 1;
DBMS_OUTPUT.PUT_LINE('Nom : ' || var_salarie.nom_sal);
DBMS_OUTPUT.PUT_LINE('Prénom : ' || var_salarie.prenom_sal);
DBMS_OUTPUT.PUT_LINE('Fonction : ' || var_salarie.fonction);
DBMS_OUTPUT.PUT_LINE('Salaire : ' || var_salarie.salaire);
END;
/
Explication
- SET SERVEROUTPUT ON :Active l’affichage des résultats de DBMS_OUTPUT.PUT_LINE.
- var_salarie salaries%ROWTYPE :Utilise %ROWTYPE pour déclarer une variable var_salarie qui peut stocker toutes les colonnes d’une ligne de la table salaries.
- SELECT INTO :Sélectionne une ligne avec numero_sal = 1 et stocke chaque colonne dans les champs correspondants de var_salarie.
- DBMS_OUTPUT.PUT_LINE :Affiche chaque valeur des champs nom_sal, prenom_sal, fonction, et salaire.
Et voici son résultat lors de son exécution :
BULK COLLECT pour performance PL/SQL
Le mot-clé BULK COLLECT en PL/SQL est utilisé pour récupérer plusieurs lignes d’une table en une seule fois et les stocker dans une collection (comme un tableau). Cela permet de réduire les allers-retours entre la base de données et le bloc PL/SQL, améliorant ainsi les performances lors du traitement de grandes quantités de données.
SELECT
EXPRESSION1 [, ...]
BULK COLLECT INTO
TABLEAU1 [, ...]
FROM TABLE
[ WHERE PREDICAT ];
- EXPRESSION1, … :Colonnes ou expressions sélectionnées dans la table.
- TABLEAU1, … :Collections (tableaux ou tables PL/SQL) dans lesquelles les données sélectionnées sont stockées.
- <nom_table> :Nom de la table source.
- PREDICAT (optionnel) :Clause WHERE pour filtrer les données à récupérer.
Voici un exemple qui utilise BULK COLLECT pour récupérer plusieurs lignes d’une table nommée salaries et les stocker dans une collection tab_emp.
SET SERVEROUTPUT ON;
DECLARE
type employe is table of salaries%ROWTYPE index by binary_integer;
tab_emp employe;
begin
select * bulk collect into tab_emp from salaries;
DBMS_OUTPUT.PUT_LINE(tab_emp(1).nom_sal || '-' || tab_emp(1).prenom_sal || '-' || tab_emp(1).salaire);
DBMS_OUTPUT.PUT_LINE(tab_emp(2).nom_sal || '-' || tab_emp(2).prenom_sal || '-' || tab_emp(2).salaire);
END;
/
Explication
- TYPE employe IS TABLE OF salaries%ROWTYPE :Déclare un type de collection employe qui correspond à toutes les colonnes d’une ligne de la table salaries.
- tab_emp employe :Déclare une variable tab_emp du type employe.
- SELECT * BULK COLLECT INTO tab_emp FROM salaries :Utilise BULK COLLECT pour récupérer toutes les lignes de salaries et les stocker dans le tableau tab_emp.
- DBMS_OUTPUT.PUT_LINE :Affiche les données des employés stockées dans tab_emp. Ici, tab_emp(1) et tab_emp(2) affichent les informations des deux premiers employés.
Et voici son résultat lors de son exécution :
Accès hors limites : Si vous essayez d’accéder à un index non initialisé dans le tableau, cela déclenche une erreur. Assurez-vous que la collection contient les index que vous utilisez.
Performance avec BULK COLLECT : Utiliser BULK COLLECT pour de très grandes quantités de données peut entraîner une consommation élevée de mémoire.
Résumé des techniques PL/SQL avancées
Méthode | Description | Syntaxe |
---|---|---|
SELECT INTO | Permet de récupérer une ou plusieurs valeurs d’une table et de les stocker dans des variables. | SELECT * INTO variable FROM table WHERE condition; |
BULK COLLECT | Récupère plusieurs lignes en une seule fois et les stocke dans une collection (tableau). | SELECT * BULK COLLECT INTO collection FROM table WHERE condition; |
Permet de récupérer une ou plusieurs valeurs d’une table et de les stocker dans des variables.
SELECT * INTO variable FROM table WHERE condition;
BULK COLLECT
Récupère plusieurs lignes en une seule fois et les stocke dans une collection (tableau).
SELECT * BULK COLLECT INTO collection FROM table WHERE conditio;
Formez-vous gratuitement avec Alphorm !
Maîtrisez les compétences clés en IT grâce à nos formations gratuites et accélérez votre carrière dès aujourd'hui.
FAQ
Comment fonctionne SELECT INTO en PL/SQL ?
Quels sont les avantages de BULK COLLECT en PL/SQL ?
Comment optimiser les performances PL/SQL avec BULK COLLECT ?
Quels types de données peut-on stocker avec %ROWTYPE ?
Quelles erreurs éviter avec BULK COLLECT ?
Conclusion
En maîtrisant SELECT INTO et BULK COLLECT, vous pouvez optimiser l’extraction et la gestion de données en PL/SQL. Quelle autre technique PL/SQL pourriez-vous explorer pour améliorer vos performances de requête ?