sql >> Base de Datos >  >> RDS >> Oracle

Declaración FORALL con la cláusula enlazada INDICES-OF en la base de datos Oracle

¿Por qué declaración FORALL con INDICES OF Bound Clause?

La declaración FORALL con la cláusula de límite inferior y superior es probablemente la forma más fácil de procesar datos a granel hasta que hagamos referencia a una colección densa. Cuando se trata de una colección escasa, la cláusula de límite inferior y superior no se mantiene firme. Además, desafortunadamente, en el escenario de la vida real, las posibilidades de trabajar con una colección densa son mucho menores que trabajar con una colección dispersa.

De todos modos, si tienes curiosidad, hemos hecho una demostración. Vea lo que sucede cuando usamos la cláusula de límite inferior y superior de la declaración FORALL con una colección escasa en el video de nuestro canal de YouTube aquí.

La deficiencia de la cláusula de límite inferior y superior de la declaración FORALL es que no se puede usar con una colección dispersa. Esta deficiencia se puede superar fácilmente usando opciones como 'Índices de ' o 'Valores-de ' cláusula enlazada. Este tutorial trata sobre la primera opción.

INDICES-OF Cláusula enlazada

Similar a la cláusula de límite inferior y superior, la cláusula INDICES-OF nos ayuda en el procesamiento masivo de datos al permitirnos iterar a través de la colección. La única diferencia es que al usar la cláusula INDICES OF podemos iterar a través de una colección densa y dispersa. Mientras que la cláusula de límite inferior y superior solo funciona con una colección densa.

Sintaxis de la cláusula enlazada INDICES OF

FORALL index IN INDICES OF collection_variable
[SAVE EXCEPTION]
DML statements; 

donde:

PARA TODOS es una palabra clave reservada de Oracle Database seguida de un índice. Este índice es un contador de bucle definido implícitamente que es declarado por el motor PL/SQL. Después de eso, debe escribir otra palabra clave que sea IN. Seguido de la palabra clave IN tenemos nuestra cláusula enlazada que es INDICES OF.

Inmediatamente después de escribir la frase reservada 'INDICES OF' tenemos que especificar la variable de colección de la colección cuyos datos queremos usar. Ya sabemos que referenciamos la colección en el programa a través de su variable colección. Seguido de eso, tenemos la opción GUARDAR EXCEPCIÓN, esta es una opción opcional. Entonces tenemos una declaración DML que podría ser cualquier declaración DML o una declaración MERGE.

Asegúrese de que la declaración DML o la declaración MERGE que está utilizando con FORALL debe hacer referencia a una colección. Además, una declaración FORALL puede procesar solo un DML o una declaración MERGE a la vez.

Ejemplo de ÍNDICES DE cláusula enlazada

Aquí veremos una demostración de la cláusula enlazada INDICES OF con la instrucción FORALL. Aquí buscaremos los datos de una tabla anidada dispersa ya inicializada y los almacenaremos en una tabla.

Como aprendimos en el tutorial anterior, la instrucción FORALL toma los datos de la colección y los almacena en una tabla. Por lo tanto, primero crearemos una tabla.

SET SERVEROUTPUT ON;
CREATE TABLE tut_78(
    mul_tab NUMBER(5)
);

Para facilitar la demostración, creamos una tabla muy simple con el nombre tut_78. Esta tabla tiene solo una columna mul_tab de NUMBER tipo de datos.

DECLARE
    TYPE my_nested_table IS TABLE OF number;
    var_nt my_nested_table := my_nested_table (9,18,27,36,45,54,63,72,81,90);
    --Another variable for holding total number of record stored into the table 
    tot_rec NUMBER;
BEGIN
    var_nt.DELETE(3, 6);
    
    FORALL idx IN INDICES OF var_nt
        INSERT INTO tut_78 (mul_tab) VALUES (var_nt(idx));
        
    SELECT COUNT (*) INTO tot_rec FROM tut_78;
    DBMS_OUTPUT.PUT_LINE ('Total records inserted are '||tot_rec);
END;
/

Puede encontrar la explicación detallada del código anterior en el video tutorial. Pero aún así, tengamos una explicación rápida aquí también.

Sección de declaración del bloque PL/SQL anterior

Aquí, en esta sección, primero creamos una tabla anidada con el nombre 'my_nested_table '. Contiene los datos del tipo de datos NÚMERO. Luego declaramos su variable de colección 'var_nt '. Utilizándolo, inicializamos los primeros 10 índices almacenando 10 elementos numéricos en nuestra colección.

Además de la tabla anidada y su variable de colección, también declaramos una variable adicional 'tot_rec ' del tipo de datos numérico. Esta variable se utilizará para almacenar el número total de datos que se almacenarán en la tabla.

Sección de Ejecución

Si observa la primera declaración en la sección de ejecución. Descubrirá que al usar el método de recopilación ELIMINAR, eliminé datos del índice 3 al índice 6. Esto significa que ahora el índice de nuestra colección no se completa secuencialmente. Eso cambia la naturaleza de nuestra colección de DENSA a ESPARSO.

Inmediatamente después de la llamada del método de recopilación DELETE, tenemos nuestra declaración FORALL con la cláusula enlazada INDICES OF. Usando esta declaración estamos insertando en la colección 'my_nested_table' en la tabla tut_78.

Entonces tenemos una instrucción SELECT-INTO. Esta declaración devuelve el número total de filas insertadas en la tabla tut_78 y almacena ese valor en la variable tot_rec. Luego, usando la instrucción DBMS_OUTPUT, mostramos el valor almacenado en la variable tot_rec con una cadena formateada para el usuario.

Le sugiero encarecidamente que vea este tutorial en mi canal de YouTube para obtener una explicación detallada del código discutido anteriormente. Además, no olvides suscribirte al canal para obtener tutoriales más interesantes.

Gracias, es un tutorial de PL/SQL sobre cómo realizar un procesamiento masivo de datos utilizando la declaración FORALL con la cláusula enlazada INDICES OF. Espero que hayas disfrutado leyendo si es así, entonces comparte este blog en tus redes sociales. ¡Que tengas un gran día!