Maison >base de données >Oracle >Comment utiliser des collections dans PL / SQL (tableaux, enregistrements, tables)?

Comment utiliser des collections dans PL / SQL (tableaux, enregistrements, tables)?

Johnathan Smith
Johnathan Smithoriginal
2025-03-13 13:15:17297parcourir

Comment utiliser des collections en 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.

Quelles sont les implications de performances de l'utilisation de différents types de collecte dans PL / SQL?

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:

  • Records: Les enregistrements ont des frais généraux minimaux car ce ne sont essentiellement que des structures. Accéder aux éléments individuels est rapide.
  • Tables imbriquées: les performances peuvent être affectées par la taille de la table imbriquée. Des opérations telles que les éléments d'ajout d'une grande table imbriquée peuvent être plus lentes que les opérations équivalentes sur des tables plus petites. De plus, la récupération d'éléments spécifiques par index peut être plus rapide que la recherche d'un élément par valeur.
  • Tableaux associatifs: l'accès aux éléments par clé est généralement très rapide, ce qui les rend idéaux pour des recherches fréquentes. Cependant, les performances peuvent se dégrader avec de très grands tableaux en raison de collisions potentielles de hachage. L'itération par un tableau associatif est plus lente que l'itération à travers une table imbriquée.

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.

Comment puis-je transmettre efficacement les collections sous forme de paramètres aux procédures et fonctions PL / SQL?

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.

Puis-je utiliser des collections pour améliorer l'efficacité de mon code PL / SQL, et si oui, comment?

Oui, les collections peuvent considérablement améliorer l'efficacité de votre code PL / SQL de plusieurs manières:

  • Commutation de contexte réduite: au lieu de passer plusieurs appels de base de données pour récupérer des lignes individuelles, vous pouvez récupérer une collection entière en un seul appel, réduisant le contexte de commutation de la surcharge entre PL / SQL et la base de données.
  • Traitement par lots: les collections vous permettent d'effectuer des opérations par lots, telles que l'insertion ou la mise à jour de plusieurs lignes dans une seule déclaration, améliorant considérablement les performances par rapport au traitement individuel par rangée.
  • Amélioration de la lisibilité et de la maintenabilité: l'utilisation de collections pour regrouper les données connexes améliore la lisibilité du code et facilite le maintien.
  • Récupération des données optimisée: en récupérant des données connexes dans les collections, vous pouvez éviter les recherches répétées de base de données pour les mêmes données. Ceci est particulièrement utile lorsqu'il s'agit de relations maître-détail.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn