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

Comment utiliser les tables Oracle PLSQL (tableau associatif ou table indexée)

Tableaux Oracle PLSQL

  • Les tables PLSQL sont des types de données composites.
  • Ceux-ci se comportent de la même manière que les tableaux, sauf qu'ils n'ont pas de limites supérieures, ce qui leur permet de s'étendre constamment.
  • Ils sont aussi appelés index par table
  • La table PLSQL contient deux éléments

(1) Une clé primaire de types de données BINARY_INTEGER qui indexent la table, qui n'ont pas besoin d'être consécutives. La collection est étendue en attribuant des valeurs à un élément à l'aide d'une valeur d'index qui n'existe pas actuellement.
nous pouvons également indexer par une valeur de chaîne

(2) Une colonne de type de données scalaire ou d'enregistrement qui stocke l'index par éléments de table

Comment définir et déclarer le type de table

Pour créer des tables PL/SQL, vous suivez deux étapes. Tout d'abord, vous définissez un type TABLE, puis déclarez des tables PL/SQL de ce type. Vous pouvez définir des types TABLE dans la partie déclarative de n'importe quel bloc, sous-programme ou package en utilisant la syntaxe

Syntax 
 TYPE table_type_name IS TABLE OF datatype [NOT NULL] INDEX BY BINARY_INTEGER;

Si le type d'élément est un type d'enregistrement, chaque champ de l'enregistrement doit avoir un type de données scalaire tel que CHAR, DATE ou NUMBER.

Pour spécifier le type d'élément, vous pouvez utiliser %TYPE pour fournir le type de données d'une variable ou d'une colonne de base de données

DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.dept_name%TYPE INDEX BY BINARY_INTEGER;

Vous pouvez ajouter la contrainte NOT NULL à une définition de type TABLE et ainsi empêcher le stockage de valeurs nulles dans les tables PL/SQL de ce type :

DECLARE 
 TYPE DEPTTabTyp IS TABLE OF dept.location%TYPE NOT NULL INDEX BY BINARY_INTEGER;

Vous pouvez également utiliser %ROWTYPE pour spécifier le type d'élément.

DECLARE 
 TYPE deptTabTyp IS TABLE OF dept%ROWTYPE INDEX BY BINARY_INTEGER;

vous utilisez un type RECORD défini par l'utilisateur pour spécifier le type d'élément :

DECLARE 
 TYPE emp_phonetyp IS RECORD
 (
 Stdcode      PLS_INTEGER,
 phn_number   PLS_INTEGER,
 extension    PLS_INTEGER
 );
 TYPE emp_contact IS TABLE OF emp_phonetyp INDEX BY BINARY_INTEGER;

Après avoir défini un type TABLE, vous pouvez déclarer des tables PL/SQL de ce type

DECLARE   
 TYPE SalTabTyp IS TABLE OF emp.sal%TYPE 
 INDEX BY BINARY_INTEGER;
 TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
 INDEX BY BINARY_INTEGER;
 sal_tab SalTabTyp;  -- declare PL/SQL table
 emp_tab EmpTabTyp;  -- declare another PL/SQL table

Attributs ou méthode de la table PLSQL

Une table PL/SQL possède les attributs EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT et DELETE.

Ils facilitent l'utilisation des tables PL/SQL et la maintenance de vos applications.

plsql_table_name.attribute_name

Les attributs exists, PRIOR, NEXT et DELETE prennent des paramètres. Chaque paramètre doit être une expression qui produit une valeur BINARY_INTEGER ou une valeur implicitement convertible en ce type de données.

DELETE agit comme une procédure, qui est appelée comme une instruction. Cependant, les autres attributs de table PL/SQL agissent comme une fonction, qui est appelée dans le cadre d'une expression.

Existe(n) Renvoyer true si le nième élément de la table existe
compter Renvoyer le nombre d'éléments dans le tableau
Premier et dernier FIRST et LAST renvoient le premier et le dernier (le plus petit et le plus grand) numéro d'index dans une table PL/SQL
AVANT(n ) renvoie le numéro d'index qui précède l'index n dans une table PL/SQL
SUIVANT(n ) renvoie le numéro d'index qui succède à l'index n
Supprimer DELETE supprime tous les éléments d'une table PL/SQL. SUPPRIMER(n ) supprime le n ème élément. Si n est nul, DELETE(n ) ne fait rien. SUPPRIMER(mn ) supprime tous les éléments de la plage m .. n . Si je est supérieur à n ou si m ou n est nul, DELETE(mn ) ne fait rien

Tables PL/SQL pour déplacer des données en masse vers et depuis des tables de base de données ou entre des applications côté client et des sous-programmes stockés.

Comment remplir les données dans la table PLSQL

Les tableaux avec des types de données simples peuvent être remplis comme :

<variable>(<integer>) := <value>;

Les tables avec des types de données complexes nécessiteront que les colonnes soient remplies individuellement comme :

<variable>(<integer>).<column_name> := <value>;

Ou à partir d'un curseur :

fetch <cursor_name> into <variable>(<integer>);
Type emptabletype  is table of varchar2(10)
Index by binary_integer;
emp_table emptabletyp;
emp_table (1) := ‘good’;
emp_table (2) := ‘bad’’;

Vous pouvez également récupérer des données Oracle dans une table PL/SQL de trois autres manières

a) L'instruction SELECT INTO vous permet de sélectionner une seule ligne de données

À l'aide de l'instruction SELECT INTO, vous pouvez sélectionner une entrée de colonne dans un élément scalaire. Ou, vous pouvez sélectionner une ligne entière dans un élément d'enregistrement. Dans l'exemple suivant, vous sélectionnez une ligne de la table de base de données dept dans un enregistrement stocké par le premier élément de la table PL/SQL dept_tab :

DECLARE
TYPE DeptTabTyp IS TABLE OF dept%ROWTYPE
INDEX BY BINARY_INTEGER;
dept_tab DeptTabTyp;
BEGIN
/* Select entire row into record stored by first element. */
SELECT * INTO dept_tab(1) FROM dept WHERE deptno = 10;
IF dept_tab(1).dname = 'ACCOUNTING' THEN ...
...
END;

b) Instruction FETCH

Avec l'instruction FETCH, vous pouvez récupérer une colonne entière de données Oracle dans une table PL/SQL de scalaires.

Ou vous pouvez récupérer une table entière de données Oracle dans une table d'enregistrements PL/SQL.

DECLARE
TYPE EmpTabTyp IS TABLE OF emp%ROWTYPE
INDEX BY BINARY_INTEGER;
emp_tab EmpTabTyp;
i BINARY_INTEGER := 0;
CURSOR c1 IS SELECT * FROM emp;
BEGIN
OPEN c1;
LOOP
i := i + 1;
/* Fetch entire row into record stored by ith element. */
FETCH c1 INTO emp_tab(i);
EXIT WHEN c1%NOTFOUND;
-- process data record
END LOOP;
CLOSE c1;
END;

c) la boucle FOR du curseur vous permet de récupérer plusieurs lignes.

DECLARE
TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE SalTabTyp IS TABLE OF emp.sal%TYPE
INDEX BY BINARY_INTEGER;
ename_tab EnameTabTyp;
sal_tab SalTabTyp;
n BINARY_INTEGER := 0;
BEGIN
/* Fetch entire columns into PL/SQL tables. */
FOR emp_rec IN (SELECT ename, sal FROM emp) LOOP
n := n + 1;
ename_tab(n) := emp_rec.ename;
sal_tab(n) := emp_rec.sal;
END LOOP;
...
END;

Vous devez lire ces  autres messages PLSQL

Structure et types de blocs Oracle PLSQL
Enregistrements Oracle PLSQL
Questions d'entretien Oracle plsql
Tutoriels rapides Oracle sql et plsql