PL / SQL – Colecciones

En este capítulo, discutiremos las colecciones en PL / SQL. Una colección es un grupo ordenado de elementos con el mismo tipo de datos. Cada artículo está identificado por un subíndice único que representa su posición en la colección.

PL / SQL proporciona tres tipos de colecciones:

  • Tablas de índice o matriz asociativa
  • Mesa anidada
  • Matriz de tamaño variable o Warrey

La documentación de Oracle proporciona las siguientes características para cada tipo de colección:

Tipo de colección Cantidad de elementos Tipo de subíndice Denso o escaso Donde fue creado Puede ser un atributo de un tipo de objeto.
Matriz asociativa (o tabla de índice) Ilimitado Cadena o entero O Solo en bloque PL / SQL No
Mesa anidada Ilimitado Entero Comienza apretado, puede volverse raro Ya sea en un bloque PL / SQL o en un nivel de esquema
Matriz de tamaños variables (Varray) Limitado Entero Siempre apretado Ya sea en un bloque PL / SQL o en un nivel de esquema

Ya hemos hablado de varray en el capítulo. ‘Matrices PL / SQL’… En este capítulo, discutiremos las tablas PL / SQL.

Ambos tipos de tablas PL / SQL, es decir, tablas indexadas por índices y tablas anidadas, tienen la misma estructura y se accede a sus filas mediante la notación de subíndices. Sin embargo, estos dos tipos de tablas difieren en un aspecto; Las tablas anidadas se pueden almacenar en una columna de la base de datos, pero las tablas de índice no.

Índice por tabla

Un indexar por mesa (también llamada matriz asociativa) es un conjunto valor clave parejas. Cada clave es única y se utiliza para encontrar el valor correspondiente. La clave puede ser un número entero o una cadena.

La tabla de indexación se crea utilizando la siguiente sintaxis. Aquí creamos indexar por tabla nombrada nombre de la tablacuyas claves tendrán subscript_type y cuyos valores asociados tendrán tipo de elemento

TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY subscript_type; 
 
table_name type_name;

Ejemplo

El siguiente ejemplo muestra cómo crear una tabla para almacenar valores enteros junto con los nombres y luego imprimir la misma lista de nombres.

DECLARE 
   TYPE salary IS TABLE OF NUMBER INDEX BY VARCHAR2(20); 
   salary_list salary; 
   name   VARCHAR2(20); 
BEGIN 
   -- adding elements to the table 
   salary_list('Rajnish') := 62000; 
   salary_list('Minakshi') := 75000; 
   salary_list('Martin') := 100000; 
   salary_list('James') := 78000;  
   
   -- printing the table 
   name := salary_list.FIRST; 
   WHILE name IS NOT null LOOP 
      dbms_output.put_line 
      ('Salary of ' || name || ' is ' || TO_CHAR(salary_list(name))); 
      name := salary_list.NEXT(name); 
   END LOOP; 
END; 
/

Cuando el código anterior se ejecuta en la línea de comando SQL, da el siguiente resultado:

Salary of James is 78000 
Salary of Martin is 100000 
Salary of Minakshi is 75000 
Salary of Rajnish is 62000  

PL/SQL procedure successfully completed.

Ejemplo

Los elementos de la tabla de indexación también se pueden % ROWTYPE cualquier tabla de base de datos o %UN TIPO cualquier campo de la tabla de la base de datos. El siguiente ejemplo ilustra este concepto. Usaremos CLIENTELA la tabla se almacena en nuestra base de datos como –

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+  
DECLARE 
   CURSOR c_customers is 
      select name from customers; 

   TYPE c_list IS TABLE of customers.Name%type INDEX BY binary_integer; 
   name_list c_list; 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list(counter) := n.name; 
      dbms_output.put_line('Customer('||counter||'):'||name_lis t(counter)); 
   END LOOP; 
END; 
/ 

Cuando el código anterior se ejecuta en la línea de comando SQL, da el siguiente resultado:

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed

Mesas anidadas

Y mesa anidada es como una matriz unidimensional con un número arbitrario de elementos. Sin embargo, una tabla anidada se diferencia de una matriz en los siguientes aspectos:

  • El número de elementos se declara en la matriz, pero no en la tabla anidada. El tamaño de la tabla anidada puede crecer dinámicamente.

  • La matriz siempre es densa, es decir, siempre tiene índices consecutivos. Una matriz anidada es inicialmente densa, pero puede volverse escasa cuando se eliminan elementos de ella.

La tabla anidada se crea con la siguiente sintaxis:

TYPE type_name IS TABLE OF element_type [NOT NULL]; 
 
table_name type_name; 

Esta declaración es similar a la declaración indexar por mesa pero no ÍNDICE DE SOFTWARE párrafo.

La tabla anidada se puede almacenar en una columna de base de datos. Además, se puede utilizar para simplificar las operaciones de SQL cuando une una tabla con una columna a una tabla más grande. Una matriz asociativa no se puede almacenar en la base de datos.

Ejemplo

Los siguientes ejemplos ilustran el uso de una tabla anidada:

DECLARE 
   TYPE names_table IS TABLE OF VARCHAR2(10); 
   TYPE grades IS TABLE OF INTEGER;  
   names names_table; 
   marks grades; 
   total integer; 
BEGIN 
   names := names_table('Kavita', 'Pritam', 'Ayan', 'Rishav', 'Aziz'); 
   marks:= grades(98, 97, 78, 87, 92); 
   total := names.count; 
   dbms_output.put_line('Total '|| total || ' Students'); 
   FOR i IN 1 .. total LOOP 
      dbms_output.put_line('Student:'||names(i)||', Marks:' || marks(i)); 
   end loop; 
END; 
/  

Cuando el código anterior se ejecuta en la línea de comando SQL, da el siguiente resultado:

Total 5 Students 
Student:Kavita, Marks:98 
Student:Pritam, Marks:97 
Student:Ayan, Marks:78 
Student:Rishav, Marks:87 
Student:Aziz, Marks:92  

PL/SQL procedure successfully completed. 

Ejemplo

Los elementos mesa anidada puede también ser % ROWTYPE cualquier tabla de base de datos o% TYPE de cualquier campo de tabla de base de datos. El siguiente ejemplo ilustra este concepto. Usaremos la tabla CLIENTES almacenada en nuestra base de datos como –

Select * from customers;  

+----+----------+-----+-----------+----------+ 
| ID | NAME     | AGE | ADDRESS   | SALARY   | 
+----+----------+-----+-----------+----------+ 
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 
|  2 | Khilan   |  25 | Delhi     |  1500.00 | 
|  3 | kaushik  |  23 | Kota      |  2000.00 | 
|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 
|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 
|  6 | Komal    |  22 | MP        |  4500.00 | 
+----+----------+-----+-----------+----------+ 
DECLARE 
   CURSOR c_customers is  
      SELECT  name FROM customers;  
   TYPE c_list IS TABLE of customerS.No.ame%type; 
   name_list c_list := c_list(); 
   counter integer :=0; 
BEGIN 
   FOR n IN c_customers LOOP 
      counter := counter +1; 
      name_list.extend; 
      name_list(counter)  := n.name; 
      dbms_output.put_line('Customer('||counter||'):'||name_list(counter)); 
   END LOOP; 
END; 
/ 

Cuando el código anterior se ejecuta en la línea de comando SQL, da el siguiente resultado:

Customer(1): Ramesh  
Customer(2): Khilan  
Customer(3): kaushik     
Customer(4): Chaitali  
Customer(5): Hardik  
Customer(6): Komal  

PL/SQL procedure successfully completed. 

Métodos de recolección

PL / SQL proporciona métodos de recopilación integrados que facilitan el uso de las recopilaciones. La siguiente tabla enumera los métodos y su propósito:

S. No Nombre y propósito del método
uno

EXISTE (n)

Devuelve VERDADERO si existe el enésimo elemento de la colección; de lo contrario, devuelve FALSE.

2

PENSAR

Devuelve el número de elementos que contiene actualmente la colección.

3

LÍMITE

Comprueba el tamaño máximo de la colección.

cuatro

PRIMERO

Devuelve los primeros números de índice (más pequeños) de una colección que usa índices enteros.

cinco

ÚLTIMO

Devuelve los últimos números de índice (más altos) de una colección que usa índices enteros.

6

ANTERIOR (n)

Devuelve el número de índice que precede al índice n en la colección.

7

SIGUIENTE (n)

Devuelve el número de índice que sigue al índice n.

8

PROLONGAR

Agrega un elemento nulo a la colección.

9

AMPLIAR (n)

Agrega n cero elementos a la colección.

diez

EXPANDIR (n, i)

Agrega PAG copias del elemento i-ésimo a la colección.

once

VENDER A MENOR PRECIO QUE

Elimina un elemento del final de la colección.

12

CORTE (n)

Elimina PAG elementos del final de la colección.

trece

ELIMINAR

Elimina todos los elementos de la colección, estableciendo COUNT en 0.

14

BORRAR (n)

Elimina enésimo un elemento de una matriz asociativa de clave numérica o una tabla anidada. Si la matriz asociativa tiene una clave de cadena, se elimina el elemento correspondiente al valor de la clave. Si un PAG nulo, BORRAR (n) haciendo nada.

15

BORRAR (m, n)

Elimina todos los elementos de un rango Minnesota de una matriz asociativa o tabla anidada. Si un metro más que PAG o si metro o PAG nulo, BORRAR (m, n) haciendo nada.

Exclusiones de colección

La siguiente tabla resume las excepciones de recopilación y cuándo ocurren:

Eliminar de la colección Criado en situaciones
COLLECTION_IS_NULL Está intentando trabajar con una colección atómicamente nula.
DATOS NO ENCONTRADOS Un subíndice denota un elemento que se ha eliminado o un elemento inexistente en una matriz asociativa.
SUBSCRIPT_BEYOND_COUNT El subíndice supera el número de elementos de la colección.
SUBSCRIPT_OUTSIDE_LIMIT El subíndice está fuera de rango.
VALUE_ERROR El subíndice es cero o no se puede convertir a un tipo de clave. Esta excepción se puede lanzar si la clave se define como PLS_INTEGER rango, y el subíndice está fuera de ese rango.

🚫