Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle PL/SQL - Collections (Tables imbriquées)

Dans ce tutoriel, vous apprendrez à déclarer et initialiser des collections Oracle PL/SQL (Nested Tables).

Oracle PL/SQL - Tableaux imbriqués

Les tables imbriquées sont très similaires aux tables PL/SQL, connues dans Oracle sous le nom de index-by les tables. Les tables imbriquées étendent les fonctionnalités de index-by table en ajoutant des méthodes de collecte supplémentaires (appelées attributs de table pour index-by tables) et en ajoutant la possibilité de stocker des tables imbriquées dans une table de base de données, c'est pourquoi elles sont appelées tables imbriquées.

Les tables imbriquées peuvent également être manipulées directement à l'aide de SQL et disposent d'exceptions prédéfinies supplémentaires.

Outre ces fonctionnalités supplémentaires, la fonctionnalité de base d'une table imbriquée est la même que celle d'une table PL/SQL. Une table imbriquée peut être considérée comme une table de base de données avec deux colonnes-clé et valeur. Comme index-tables , les tables imbriquées peuvent être clairsemées et les clés n'ont pas besoin d'être séquentielles.

Déclarer une table imbriquée

La syntaxe pour créer un type de tableau imbriqué est

TYPE table_name  est TABLE OF table_type  [NOT NULL] ;

où table_name est le nom du nouveau type, et table_type est le type de chaque élément de la table imbriquée. Table_type peut être un type intégré, un type d'objet défini par l'utilisateur ou une expression utilisant % TYPE.

Remarque

La seule différence syntaxique entre les tables indexées par et les tables imbriquées est la présence de la clause INDEX BY BINARY_INTEGER. Si cette clause n'est pas présente, le type est un type de table imbriquée. Si cette clause est présente, alors le type est un type de table d'index.

La section de code déclarative suivante montre quelques déclarations de table valides :

DECLARE--Définir un type de table basé sur un type d'objetTYPE t_ClassTab IS TABLE OF Classobj ;--Un type basé sur%ROWTYPEType t_StudentsTab IS TABLE Of Students%ROWTYPE ;--Variables des types ci-dessusv_ClassList t_ClassesTab;v_StudentList t_StudentsTab; 

Oracle PL/SQL - Initialisation de table imbriquée

Lorsqu'une table est déclarée comme dans le bloc précédent, elle est initialisée pour être atomiquement NULL, comme un type d'objet. Si vous essayez d'attribuer à une table NULL, l'erreur "ORA-6531 :Référence à une collection non initialisée " qui correspond à l'exception prédéfinie COLLECTION_IS_NULL , est relevé.

En continuant l'exemple précédent, la section d'exécution suivante générera cette erreur :

BEGIN--Cette affectation lèvera COLLECTION_IS_NULL car--v_ClassList est automatiquement null.v_ClassList(1) :=ClassObj ('HIS', 101, 'History 101', 30, 0, 4, NULL);END; 

Alors, comment initialiser une table imbriquée ? Cela peut être fait en utilisant le constructeur. Comme un constructeur de type d'objet, le constructeur d'une table imbriquée a le même nom que le type de table lui-même. Cependant, il prend comme argument une liste d'éléments, dont chacun doit être de type compatible avec le type d'élément de table.

L'exemple suivant illustre l'utilisation du constructeur de table nsat3eed :

DECLARETYPE t_NUMbersTab IS TABLE OF NUMBER;-- Créer une table avec un élément.v_Tab1 t_NumbersTab :=t_NumbersTab(-1);-- Créer une table avec cinq éléments.v-Primes t_numbersTab :=t_NumbersTab(1, 2, 3 , 5, 7);-- Créer une table sans éléments.v_Tab2 t_NumbersTab :=t_NumbersTab();BEGIN-- Attribuer à v_Tab1(1). Cela remplacera la valeur ready-- dans v_Tab(1), qui a été initialisée à -1.v_Tab(1) :=12345;END;

Tableaux vides

Notez la déclaration de v_Tab2 dans le bloc précédent :

-- Créer une table sans éléments.v_Tab2 t_NumbersTab :=t_NumbersTab();

v_Tab2 est initialisé en appelant le constructeur sans argument. Cela crée une table qui n'a pas d'éléments mais qui n'est pas atomiquement NULL. Le bloc suivant illustre cela :

DECLARETYPE t_WordsTab IS TABLE OF VARCHAR2(50) .PUT_LINE('v_Tab1 est NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab n'est pas NULL');END IF;IF v_Tab2 IS NULL THENDBMS_OUTPUT.PUT_LINE('v_Tab2 est NULL');ELSEDBMS_OUTPUT.PUT_LINE('v_Tab2 n'est pas NULL' );FIN SI;FIN;

Si nous exécutons ce bloc, nous obtenons la sortie suivante :

v_Tab1 est NULLv_Tab2 n'est pas NULL

Clés à l'initialisation

Lorsqu'une table est initialisée à l'aide d'un constructeur, les éléments de la table sont numérotés séquentiellement, allant de 1 au nombre d'éléments spécifiés dans l'appel du constructeur. Lors d'un traitement ultérieur, les valeurs stockées sur certaines clés peuvent être supprimées (à l'aide de la méthode DELETE). lorsqu'une table imbriquée est sélectionnée dans la base de données, les clés sont renumérotées si nécessaire pour être séquentielles comme elles le sont à l'initialisation.