Oracle PL / SQL BULK COLLECT: Ejemplo de FORALL

¿Qué es BULK COLLECT?

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

Oracle PL / SQL proporciona la funcionalidad de obtener los registros de forma masiva en lugar de obtenerlos 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 obtiene 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  BULK COLLECT INTO bulk_varaible FROM 
;FETCH  BULK COLLECT INTO ;

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

En este tutorial aprenderás

  • Cláusula FORALL
  • Cláusula LIMIT
  • Atributos de BULK COLLECT

Cláusula FORALL

El FORALL permite realizar las operaciones DML sobre datos de forma masiva. Es similar a la de la instrucción de bucle FOR, excepto que en el bucle FOR las cosas suceden a nivel de registro, mientras que en FORALL no existe el concepto de BUCLE. En cambio, todos los datos presentes en el rango dado se procesan al mismo tiempo.

Sintaxis:

FORALL in;

En la sintaxis anterior, la operación DML dada se ejecutará para todos los datos que están presentes entre el rango inferior y superior.

Cláusula LIMIT

El concepto de recopilación masiva carga todos los datos en la variable de recopilación de destino como un volumen, 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 debe cargarse es muy grande, porque cuando PL / SQL intenta cargar todos los datos, consume más memoria de sesión. Por lo tanto, siempre es bueno limitar el tamaño de esta operación de recolección a granel.

Sin embargo, este límite de tamaño se puede lograr fácilmente introduciendo la condición ROWNUM en la instrucción 'SELECT', mientras que en el caso del cursor esto no es posible.

Para superar esto, Oracle ha proporcionado una cláusula 'LIMIT' que define la cantidad de registros que deben incluirse en el volumen.

Sintaxis:

FETCH  BULK COLLECT INTO  LIMIT ;

En la sintaxis anterior, la instrucción de recuperación del cursor usa la instrucción BULK COLLECT junto con la cláusula LIMIT.

Atributos de BULK COLLECT

Similar a los atributos de cursor, BULK COLLECT tiene% BULK_ROWCOUNT (n) que devuelve el número de filas afectadas en la enésima instrucción DML de la instrucción FORALL, es decir, dará el recuento de registros afectados en la instrucción FORALL para cada valor de la colección variable. El término 'n' indica la secuencia de valor en la colección, para la cual se necesita el recuento de filas.

Ejemplo 1 : 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.

DECLARECURSOR 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;BEGINOPEN 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.LASTLOOPDbms_output.put_line(‘Employee Fetched:‘||c_emp_name);END LOOP:FORALL i IN lv_emp_name.FIRST… lv emp_name.LASTUPDATE emp SET salaiy=salary+5000 WHERE emp_name=lv_emp_name(i);COMMIT; Dbms_output.put_line(‘Salary Updated‘);CLOSE guru99_det;END;/

Producción

Employee Fetched:BBBEmployee Fetched:XXXEmployee Fetched:YYYSalary Updated

Explicación del código:

  • Línea de código 2 : Declarando el cursor guru99_det para la instrucción 'SELECT emp_name FROM emp'.
  • Línea de código 3 : Declaración de lv_emp_name_tbl como tipo de tabla de VARCHAR2 (50)
  • Línea de código 4 : Declarando lv_emp_name como tipo lv_emp_name_tbl.
  • Línea de código 6: Apertura del cursor.
  • Línea de código 7: Obtener el cursor usando BULK COLLECT con el tamaño LIMIT como variable 5000 intl lv_emp_name.
  • Línea de código 8-11: Configuración del bucle FOR para imprimir todo el registro 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: Confirmación de la transacción.

Articulos interesantes...