Maison >base de données >Oracle >Comment utiliser des collections dans PL / SQL (tableaux, enregistrements, tables)?
PL / SQL propose plusieurs types de collecte pour gérer les groupes de données connexes, améliorer l'efficacité du code et la lisibilité. Il s'agit notamment de tables imbriquées, de tableaux associatifs (tables indexes) et d'enregistrements. Examinons chacun:
Enregistrements: Les enregistrements sont similaires aux structures d'autres langues. Ils regroupent des éléments de différents types de données sous un seul nom. Ils sont déclarés avec une instruction TYPE
, puis utilisés pour déclarer les variables.
<code class="sql">DECLARE TYPE employee_record IS RECORD ( employee_id NUMBER, employee_name VARCHAR2(50), salary NUMBER ); emp employee_record; BEGIN emp.employee_id := 123; emp.employee_name := 'John Doe'; emp.salary := 60000; DBMS_OUTPUT.PUT_LINE('Employee ID: ' || emp.employee_id); END; /</code>
Tables imbriquées: les tables imbriquées sont des collections ordonnées de types de données homogènes. Ils permettent des listes de longueur variable.
<code class="sql">DECLARE TYPE num_list IS TABLE OF NUMBER; numbers num_list := num_list(1, 2, 3, 4, 5); BEGIN FOR i IN numbers.FIRST .. numbers.LAST LOOP DBMS_OUTPUT.PUT_LINE(numbers(i)); END LOOP; END; /</code>
Tableaux associatifs (tables indexes): Celles-ci sont similaires aux cartes de hachage ou aux dictionnaires dans d'autres langues. Ils stockent des paires de valeurs clés, où les clés doivent être d'un sous-type de PLS_INTEGER
et les valeurs peuvent être n'importe quel type de données.
<code class="sql">DECLARE TYPE emp_salary IS TABLE OF NUMBER INDEX BY VARCHAR2(50); salaries emp_salary; BEGIN salaries('John Doe') := 60000; salaries('Jane Smith') := 75000; DBMS_OUTPUT.PUT_LINE('John Doe salary: ' || salaries('John Doe')); END; /</code>
Le choix du type de collecte approprié dépend de vos besoins spécifiques. Les enregistrements sont idéaux pour regrouper des éléments de données connexes, des tables imbriquées pour les listes ordonnées et des tableaux associatifs pour les recherches de valeurs clés.
Les implications de performances de l'utilisation de différents types de collecte varient en fonction de la façon dont elles sont utilisées et de la taille des données. En général:
La taille des collections et la fréquence des opérations (insertions, suppressions, recherches) influencent fortement les performances globales. Pour des ensembles de données extrêmement grands, envisagez d'optimiser les modèles d'accès et potentiellement à l'aide d'autres approches telles que des vues matérialisées ou des fonctions pipelinées.
Passer des collections en tant que paramètres implique efficacement de comprendre les différents modes de passage (dans, out, dans out) et de choisir la méthode appropriée en fonction de vos besoins. L'utilisation des attributs %ROWTYPE
le cas échéant, améliore également les performances.
Dans les paramètres: c'est le moyen le plus courant de passer des collections. La collection est passée en lecture seule. La procédure ou la fonction reçoit une copie de la collection, qui peut être efficace pour les petites collections mais peut être moins efficace pour les très grandes.
Paramètres out: la procédure ou la fonction modifie la collection et renvoie la version modifiée.
Dans les paramètres out: la collection est à la fois transmise et modifiée dans la procédure ou la fonction, et la version modifiée est renvoyée.
Exemple à l'aide du paramètre:
<code class="sql">CREATE OR REPLACE PROCEDURE process_numbers (numbers IN num_list) IS BEGIN -- Process the numbers collection END; /</code>
Pour de très grandes collections, envisagez de les passer par référence en utilisant des types d'objets au lieu de passer directement la collection. Cela peut réduire les frais généraux de mémoire de la copie de grands ensembles de données.
Oui, les collections peuvent considérablement améliorer l'efficacité de votre code PL / SQL de plusieurs manières:
Exemple d'efficacité améliorée:
Au lieu de cette approche inefficace:
<code class="sql">FOR i IN 1..1000 LOOP SELECT column1 INTO variable1 FROM table1 WHERE id = i; -- Process variable1 END LOOP;</code>
Utilisez cette approche plus efficace à l'aide d'une table imbriquée:
<code class="sql">DECLARE TYPE num_list IS TABLE OF NUMBER; data num_list; BEGIN SELECT id BULK COLLECT INTO data FROM table1 WHERE id BETWEEN 1 AND 1000; FOR i IN data.FIRST .. data.LAST LOOP -- Process data(i) END LOOP; END; /</code>
En utilisant BULK COLLECT INTO
, vous récupérez les 1000 ID dans une seule base de données aller-retour, améliorant considérablement les performances. Ce principe s'applique également aux autres opérations de base de données. N'oubliez pas de choisir le type de collecte approprié pour des performances optimales en fonction de votre structure de données et de vos modèles d'accès.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!