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:
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 | sí |
| Matriz de tamaños variables (Varray) | Limitado | Entero | Siempre apretado | Ya sea en un bloque PL / SQL o en un nivel de esquema | sí |
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.
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;
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.
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
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.
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.
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.
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. |
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. |
🚫