Oracle PL/SQL BULK COLLECT: Ejemplo FORALL

ยฟQuรฉ es la RECOGER A GRANEL?

BULK COLLECT reduce los cambios de contexto entre SQL y el motor PL/SQL y permite que el motor SQL recupere los registros a la vez.

Oracle PL/SQL proporciona la funcionalidad de recuperar los registros de forma masiva en lugar de recuperarlos uno por uno. Este BULK COLLECT se puede utilizar en la instrucciรณn 'SELECT' para completar los registros de forma masiva o para recuperar el cursor de forma masiva. Dado que BULK COLLECT recupera el registro en BULK, la clรกusula INTO siempre debe contener una variable de tipo de colecciรณn. La principal ventaja de utilizar BULK COLLECT es que aumenta el rendimiento al reducir la interacciรณn entre la base de datos y el motor PL/SQL.

Sintaxis:

SELECT <columnl> BULK COLLECT INTO bulk_varaible FROM <table name>;
FETCH <cursor_name> BULK COLLECT INTO <bulk_varaible >;

En la sintaxis anterior, BULK COLLECT se utiliza para recopilar los datos de las declaraciones 'SELECT' y 'FETCH'.

Clรกusula FORALL

FORALL permite realizar operaciones DML sobre datos en masa. Es similar a la instrucciรณn de bucle FOR excepto en En bucle las cosas suceden a nivel de rรฉcord, mientras que en FORALL no existe el concepto LOOP. En lugar de ello, todos los datos presentes en el rango dado se procesan al mismo tiempo.

Sintaxis:

FORALL <loop_variable>in<lower range> .. <higher range> 

<DML operations>;

En la sintaxis anterior, la operaciรณn DML dada se ejecutarรก para todos los datos presentes entre el rango inferior y el superior.

Clรกusula LรMITE

El concepto de recopilaciรณn masiva carga todos los datos en la variable de recopilaciรณn de destino de forma masiva, es decir, todos los datos se completarรกn en la variable de recopilaciรณn de una sola vez. Pero esto no es aconsejable cuando el registro total que se necesita cargar es muy grande, porque cuando PL / SQL Si intenta cargar todos los datos, consumirรก mรกs memoria de sesiรณn. Por lo tanto, siempre es bueno limitar el tamaรฑo de esta operaciรณn de recopilaciรณn masiva.

Sin embargo, este lรญmite de tamaรฑo se puede lograr fรกcilmente introduciendo la condiciรณn ROWNUM en la declaraciรณn 'SELECT', mientras que en el caso del cursor esto no es posible.

para superar esto Oracle ha proporcionado la clรกusula 'LIMIT' que define la cantidad de registros que deben incluirse en el lote.

Sintaxis:

FETCH <cursor_name> BULK COLLECT INTO <bulk_variable> LIMIT <size>;

En la sintaxis anterior, la instrucciรณn de recuperaciรณn del cursor utiliza la instrucciรณn BULK COLLECT junto con la clรกusula LIMIT.

Atributos de RECOGER A GRANEL

Similar a cursor atributos BULK COLLECT tiene %BULK_ROWCOUNT(n) que devuelve el nรบmero de filas afectadas en el nth Declaraciรณn DML de la declaraciรณn FORALL, es decir, darรก el recuento de registros afectados en la declaraciรณn FORALL para cada valor de la variable de colecciรณn. El tรฉrmino 'n' indica la secuencia de valores en la colecciรณn, para la cual se necesita el recuento de filas.

Ejemplo : En este ejemplo, proyectaremos todos los nombres de los empleados de la tabla emp usando BULK COLLECT y tambiรฉn aumentaremos el salario de todos los empleados en 5000 usando FORALL.

Atributos de RECOGER A GRANEL

DECLARE
CURSOR guru99_det IS SELECT emp_name FROM emp;
TYPE lv_emp_name_tbl IS TABLE OF VARCHAR2(50);
lv_emp_name lv_emp_name_tbl;
BEGIN
OPEN guru99_det;
FETCH guru99_det BULK COLLECT INTO lv_emp_name LIMIT 5000;
FOR c_emp_name IN lv_emp_name.FIRST .. lv_emp_name.LAST
LOOP
Dbms_output.put_line(โ€˜Employee Fetched:โ€˜||c_emp_name);
END LOOP:
FORALL i IN lv_emp_name.FIRST .. lv emp_name.LAST
UPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);
COMMIT;	
Dbms_output.put_line(โ€˜Salary Updatedโ€˜);
CLOSE guru99_det;
END;
/

Salida

Employee Fetched:BBB
Employee Fetched:XXX 
Employee Fetched:YYY
Salary Updated

Explicaciรณn del cรณdigo:

  • Lรญnea de cรณdigo 2: Declarar el cursor guru99_det para la declaraciรณn 'SELECT emp_name FROM emp'.
  • Lรญnea de cรณdigo 3: Declarar lv_emp_name_tbl como tipo de tabla de VARCHAR2(50)
  • Lรญnea de cรณdigo 4: Declarar lv_emp_name como tipo lv_emp_name_tbl.
  • Lรญnea de cรณdigo 6: Abriendo el cursor.
  • Lรญnea de cรณdigo 7: Obteniendo el cursor usando BULK COLLECT con el tamaรฑo LIMIT como variable 5000 intl lv_emp_name.
  • Lรญnea de cรณdigo 8-11: Configurar el bucle FOR para imprimir todos los registros de la colecciรณn lv_emp_name.
  • Lรญnea de cรณdigo 12: Usando FORALL actualizando el salario de todos los empleados en 5000.
  • Lรญnea de cรณdigo 14: Comprometiendo la transacciรณn.

Resumir este post con: