Seleccionar página

APEX_COLLECTION – Parte 3

apex_collection

Escrito por: Eddie Molina

Oracle ACE Pro. Oracle APEX Cloud Developer Certified Professional. Presidente de ORAUGCRC (Grupo de Usuarios Oracle de Costa Rica). Miembro de líderes de LAOUC. Conferencista, consultor, desarrollador y capacitador en tecnologías Oracle, especialmente Oracle Application Express con más de 30 años de experiencia.

14/04/2022

En la entrada anterior, puede encontrar el primer grupo de funciones y procedimientos del paquete API APEX_COLLECTION, en esta, continuamos con un segundo grupo de las mismas.

Procedimiento CREATE_COLLECTION_FROM_QUERY_B

Utilice este procedimiento para crear una colección a partir de una consulta proporcionada mediante operaciones masivas. Este método ofrece un rendimiento significativamente más rápido que el método CREATE_COLLECTION_FROM_QUERY. La consulta se analiza como el propietario de la aplicación. Si existe una colección con el mismo nombre para el usuario actual en la misma sesión para el ID de aplicación actual, se genera un error de aplicación.

Este procedimiento utiliza SQL dinámico masivo para realizar las operaciones de extracción e inserción en la colección nombrada. Este procedimiento impone dos limitaciones:

No se calcula la suma de comprobación MD5 para los datos del miembro.

Ningún valor de columna en la consulta p_query puede superar los 2000 bytes. Si se encuentra una fila que tiene un valor de columna de más de 2000 bytes, se genera un error durante la ejecución. En Oracle Database 11g versión 2 (11.2.0.1) o posterior, este límite de columna es de 4000 bytes.

La sintaxis del procedimiento es:

 APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY_B
(
     p_collection_name IN VARCHAR2,
     p_query IN VARCHAR2,
     p_max_row_count IN NUMBER DEFAULT NULL);

Donde:

Parámetro Descripción

p_collection_name

El nombre de la colección. La longitud máxima es de 255 caracteres. Se devuelve un error si esta colección existe con el nombre especificado del usuario actual y en la misma sesión.

p_query

Consulta a ejecutar para rellenar los miembros de la colección.

p_max_row_count

Número máximo de filas devueltas por la consulta en p_query que deben agregarse a la colección.

Un ejemplo del uso de este procedimiento es:

declare
      l_query varchar2(4000);
Begin
     l_query := ‘select empno, ename, job, sal from emp’;
     APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY_B
     (
         p_collection_name => ‘EMPLOYEES’,
         p_query => l_query );
 End;

 

Procedimiento CREATE_COLLECTION_FROM_QUERYB2

Utilice este procedimiento para crear una colección a partir de una consulta proporcionada mediante operaciones masivas. Este método ofrece un rendimiento significativamente más rápido que el método CREATE_COLLECTION_FROM_QUERY_2. La consulta se analiza como el propietario de la aplicación. Si existe una colección con el mismo nombre para el usuario actual en la misma sesión para el ID de aplicación actual, se genera un error de aplicación. Es idéntico a CREATE_COLLECTION_FROM_QUERY_B, sin embargo, las primeras cinco columnas de la cláusula SELECT deben ser numéricas y las siguientes cinco columnas deben ser de fecha. Después de las columnas de fecha, puede haber hasta 50 columnas de caracteres en la cláusula SELECT

Este procedimiento utiliza SQL dinámico masivo para realizar las operaciones de extracción e inserción en la colección nombrada. Este procedimiento impone dos limitaciones:

  1. No se calcula la suma de comprobación MD5 para los datos del miembro.
  2. Ningún valor de columna en la consulta p_query puede superar los 2000 bytes. Si se encuentra una fila que tiene un valor de columna de más de 2000 bytes, se genera un error durante la ejecución. En Oracle Database 11g versión 2 (11.2.0.1) o posterior, este límite de columna es de 4000 bytes.

 

La sintaxis del procedimiento es:

APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERYB2 (
     p_collection_name IN VARCHAR2,
     p_query IN VARCHAR2,
     p_names IN apex_application_global.vc_arr2,
     p_values IN apex_application_global.vc_arr2,
     p_max_row_count IN NUMBER default null,
     p_truncate_if_exists IN VARCHAR2 default ‘NO’);

Donde:

Parámetro Descripción

p_collection_name

El nombre de la colección. La longitud máxima es de 255 caracteres. Se devuelve un error si esta colección existe con el nombre especificado del usuario actual y en la misma sesión.

p_query

Consulta a ejecutar para rellenar los miembros de la colección.

p_names

Matriz de nombres de variables de vinculación utilizados en la instrucción de consulta.

p_values

Matriz de valores de variables de vinculación utilizados en las variables de vinculación en la instrucción de consulta.

p_max_row_count

Número máximo de filas devueltas por la consulta en p_query que deben agregarse a la colección.

p_truncate_if_exists

Si es YES, luego, los miembros de la colección se truncarán primero si la colección existe y no se generará ningún error. Si NO (o no YES), y la colección existe, se generará un error.

Un ejemplo del uso de este procedimiento es:

declare
     l_query varchar2(4000);
Begin
      l_query := ‘select empno, sal, comm, deptno, null, hiredate, null,
          null, null, null, ename, job, mgr from emp where deptno = :b1′;
     APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERYB2 (
          p_collection_name => ‘EMPLOYEES’,
          p_query => l_query,
          p_names => apex_util.string_to_table(‘b1’),
           p_values => apex_util.string_to_table(’10’));
End;

 

Procedimiento CREATE_COLLECTION_FROM_QUERYB2

Utilice este procedimiento para crear una colección a partir de una consulta proporcionada mediante operaciones masivas. Este método ofrece un rendimiento significativamente más rápido que el método CREATE_COLLECTION_FROM_QUERY_2. La consulta se analiza como el propietario de la aplicación. Si existe una colección con el mismo nombre para el usuario actual en la misma sesión para el ID de aplicación actual, se genera un error de aplicación. Es idéntico a CREATE_COLLECTION_FROM_QUERY_B, sin embargo, las primeras cinco columnas de la cláusula SELECT deben ser numéricas y las siguientes cinco columnas deben ser de fecha. Después de las columnas de fecha, puede haber hasta 50 columnas de caracteres en la cláusula SELECT

Este procedimiento utiliza SQL dinámico masivo para realizar las operaciones de extracción e inserción en la colección nombrada. Este procedimiento impone dos limitaciones:

  1. No se calcula la suma de comprobación MD5 para los datos del miembro.
  2. Ningún valor de columna en la consulta p_query puede superar los 2000 bytes. Si se encuentra una fila que tiene un valor de columna de más de 2000 bytes, se genera un error durante la ejecución. En Oracle Database 11g versión 2 (11.2.0.1) o posterior, este límite de columna es de 4000 bytes.

La sintaxis del procedimiento es:

APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERYB2
(
     p_collection_name IN VARCHAR2,
     p_query IN VARCHAR2,
     p_max_row_count IN NUMBER DEFAULT);

Donde:

Parámetro Descripción

p_collection_name

El nombre de la colección. La longitud máxima es de 255 caracteres. Se devuelve un error si esta colección existe con el nombre especificado del usuario actual y en la misma sesión.

p_query

Consulta a ejecutar para rellenar los miembros de la colección.

p_max_row_count

Número máximo de filas devueltas por la consulta en p_query que deben agregarse a la colección.

Un ejemplo del uso de este procedimiento es:

DECLARE
       l_query varchar2(4000);
BEGIN
     l_query := ‘select empno, sal, comm, deptno, null, hiredate, null,
          null, null, null, ename, job, mgr from emp where deptno = 10′;
     APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERYB2
     (
          p_collection_name => ‘EMPLOYEES’,
          p_query => l_query);
END;

 

Procedimiento DELETE_ALL_COLLECTIONS

Utilice este procedimiento para eliminar todas las colecciones que pertenecen al usuario actual en la sesión actual de APEX para el ID de aplicación actual.

La sintaxis del procedimiento es:

APEX_COLLECTION.DELETE_ALL_COLLECTIONS;

Un ejemplo del uso de este procedimiento es:

Begin
     APEX_COLLECTION.DELETE_ALL_COLLECTIONS;
End;

 

Procedimiento DELETE_ALL_COLLECTIONS_SESSION

Utilice este procedimiento para eliminar todas las colecciones que pertenecen al usuario actual en la sesión actual de Application Express, independientemente de la ID de la aplicación.

La sintaxis del procedimiento es:

APEX_COLLECTION.DELETE_ALL_COLLECTIONS_SESSION;

Un ejemplo del uso de este procedimiento es:

Begin
     APEX_COLLECTION.DELETE_ALL_COLLECTIONS_SESSION;
End;

 

Procedimiento DELETE_COLLECTION

Utilice este procedimiento para eliminar una colección con nombre. Todos los miembros que pertenecen a la colección se eliminan y la colección nombrada se elimina. Si la colección nombrada no existe para el mismo usuario en la sesión actual para el Id. de aplicación actual, se genera un error de aplicación.

La sintaxis del procedimiento es:

APEX_COLLECTION.DELETE_COLLECTION (
     p_collection_name IN VARCHAR2);

Donde:

Parámetro Descripción

p_collection_name

El nombre de la colección de la que se quitarán y soltarán todos los miembros. Se devuelve un error si esta colección no existe con el nombre especificado del usuario actual y en la misma sesión.

Un ejemplo del uso de este procedimiento es:

Begin
     APEX_COLLECTION.DELETE_COLLECTION(
          p_collection_name => ‘EMPLOYEE’);
End;

 

Procedimiento DELETE_MEMBER

Utilice este procedimiento para eliminar un miembro específico de una colección con nombre determinado. Si la colección nombrada no existe para el mismo usuario en la sesión actual para el Id. de aplicación actual, se genera un error de aplicación.

La sintaxis del procedimiento es:

APEX_COLLECTION.DELETE_MEMBER (
     p_collection_name IN VARCHAR2,
     p_seq IN VARCHAR2);

Donde:

Parámetro Descripción

p_collection_name

El nombre de la colección de la que se eliminará el miembro especificado. La longitud máxima es de 255 caracteres. Los nombres de las colecciones no distinguen entre mayúsculas y minúsculas y se convierten a mayúsculas. Se devuelve un error si esta colección no existe para el usuario actual en la misma sesión.

p_seq

El identificador de secuencia del miembro de la colección a eliminar.

Un ejemplo del uso de este procedimiento es:

Begin
     APEX_COLLECTION.DELETE_MEMBER(
          p_collection_name => ‘EMPLOYEES’,
          p_seq => ‘2’);
End;

 

Procedimiento DELETE_MEMBERS

Utilice este procedimiento para eliminar todos los miembros de una colección determinada donde el atributo especificado por el número de atributo es igual al valor proporcionado. Si la colección nombrada no existe para el mismo usuario en la sesión actual para el Id. de aplicación actual, se genera un error de aplicación. Si el número de atributo especificado no es válido o está fuera del rango de 1 a 50, se genera un error.

Si el valor del atributo proporcionado es nulo, todos los miembros de la colección nombrada se eliminan donde el atributo, especificado por p_attr_number, es nulo.

La sintaxis del procedimiento es:

APEX_COLLECTION.DELETE_MEMBERS (
     p_collection_name IN VARCHAR2,
     p_attr_number IN VARCHAR2,
     p_attr_value IN VARCHAR2);

Donde:

Parámetro Descripción

p_collection_name

El nombre de la colección de la que se eliminarán los miembros especificados. La longitud máxima es de 255 caracteres. Los nombres de las colecciones no distinguen entre mayúsculas y minúsculas y se convierten a mayúsculas. Se devuelve un error si esta colección no existe para el usuario actual en la misma sesión.

p_attr_number

Número de atributo del atributo de miembro utilizado para hacer coincidir el valor de atributo especificado para su eliminación. Los valores válidos son del 1 al 50 y nulo.

p_attr_value

Valor de atributo del atributo de miembro utilizado para hacer coincidir la eliminación. La longitud máxima puede ser de 4.000 bytes. El valor del atributo se trunca a 4000 bytes si es mayor que esta cantidad.

Un ejemplo del uso de este procedimiento es:

Begin
     apex_collection.delete_members(
          p_collection_name => ‘GROCERIES’
          p_attr_number => 5,
          p_attr_value => ‘APPLE’ );
     Commit;
End;

 

Función GET_MEMBER_MD5

Utilice esta función para calcular y devolver el resumen del mensaje de los atributos del miembro especificado por el ID de secuencia. Este cálculo del resumen del mensaje es igual al cálculo realizado de forma nativa por las colecciones. Así, el resultado de esta función podría compararse con la columna MD5_ORIGINAL de la vista apex_collections.

Si no existe una colección con el nombre especificado para el usuario actual en la misma sesión y para el ID de aplicación actual, se genera un error de aplicación. Si el miembro especificado por el ID de secuencia p_seq no existe, se genera un error de aplicación.

La sintaxis de la función es:

APEX_COLLECTION.GET_MEMBER_MD5 (
     p_collection_name IN VARCHAR2,
     p_seq IN NUMBER)
RETURN VARCHAR2;

Donde:

Parámetro Descripción

p_collection_name

El nombre de la colección a la que se agregará esta matriz de miembros. Se devuelve un error si esta colección no existe con el nombre especificado del usuario actual y en la misma sesión.

p_seq

ID de secuencia del miembro de la colección.

Un ejemplo del uso de esta función es:

declare
     l_md5 varchar2(4000);
begin
     l_md5 := apex_collection.get_member_md5(
          p_collection_name => ‘GROCERIES’
          p_seq => 10 );
end;

 

Procedimiento MERGE_MEMBERS

Utilice este procedimiento para fusionar miembros de la colección con nombre dada con los valores pasados ​​en las matrices. Si la colección nombrada no existe, se crea una. Si se proporciona p_init_query, la colección se crea a partir de la consulta SQL proporcionada. Si la colección nombrada existe, ocurre lo siguiente:

  1. Se eliminan las filas de la colección y no de las matrices.
  2. Se actualizan las filas de las colecciones y de las matrices.
  3. Se insertan filas en las matrices y no en la colección.

El recuento de elementos en la tabla p_c001 PL/SQL se utiliza como el número total de elementos en todas las tablas PL/SQL. Por ejemplo, si p_c001.count es 2 y p_c002.count es 10, solo se fusionan 2 miembros. Si p_c001 es nulo, se genera un error de aplicación.

La sintaxis del procedimiento es:

APEX_COLLECTION.MERGE_MEMBERS (
      p_collection_name IN VARCHAR2,
      p_seq IN APEX_APPLICATION_GLOBAL.VC_ARR2 DEFAULT empty_vc_arr,
      p_c001 IN APEX_APPLICATION_GLOBAL.VC_ARR2 DEFAULT empty_vc_arr,
      p_c002 IN APEX_APPLICATION_GLOBAL.VC_ARR2 DEFAULT empty_vc_arr,
      p_c003 IN APEX_APPLICATION_GLOBAL.VC_ARR2 DEFAULT empty_vc_arr,
      …
      p_c050 IN APEX_APPLICATION_GLOBAL.VC_ARR2 DEFAULT empty_vc_arr,
      p_null_index IN NUMBER DEFAULT 1,
      p_null_value IN VARCHAR2 DEFAULT null,
      p_init_query IN VARCHAR2 DEFAULT null);

Donde:

Parámetro Descripción

p_collection_name

El nombre de la colección. La longitud máxima es de 255 bytes. Los nombres de las colecciones no distinguen entre mayúsculas y minúsculas y se convierten a mayúsculas.

p_c001 through p_c050

Matriz de valores de atributos que se fusionarán. La longitud máxima es de 4.000 bytes. Cualquier atributo de carácter que supere los 4000 caracteres se trunca a 4000 caracteres. El recuento de la matriz p_c001 se usa en todas las matrices. Si no se proporcionan valores, no se realizan acciones.

p_c0xx

Atributo de los valores de los atributos NN que se fusionarán. La longitud máxima puede ser de 4.000 bytes. El valor del atributo se trunca a 4000 bytes si es mayor que esta cantidad.

p_seq

Identifica el número de secuencia de la colección que se fusionará.

p_null_index

Esto es, si el elemento identificado por este valor es nulo, trate esta fila como una fila nula. Por ejemplo, si p_null_index es 3, entonces p_c003 se trata como una fila nula. En otras palabras, dígale a la función de combinación que ignore esta fila. Esto da como resultado que las filas nulas se eliminen de la colección. El índice nulo funciona con el valor nulo. Si el valor del argumento p_cXXX es igual a p_null_value, la fila se trata como nula.

p_null_value

Se usa con el argumento p_null_index. Identifica el valor nulo. Si se utiliza, este valor no debe ser nulo. Un valor típico para este argumento es “0”

p_init_query

Si la colección no existe, la colección se crea mediante esta consulta.

Un ejemplo del uso de este procedimiento es:

DECLARE
      l_seq APEX_APPLICATION_GLOBAL.VC_ARR2;
      l_c001 APEX_APPLICATION_GLOBAL.VC_ARR2;
      l_c002 APEX_APPLICATION_GLOBAL.VC_ARR2;
      l_c003 APEX_APPLICATION_GLOBAL.VC_ARR2;
BEGIN
      l_seq(1) := 1;
      l_c001(1) := 7369;
      l_c002(1) := ‘SMITH’;
      l_c003(1) := ‘MANAGER’;
      l_seq(2) := 2;
      l_c001(2) := 7499;
      l_c002(2) := ‘ALLEN’;
      l_c003(2) := ‘CLERK’;

               APEX_COLLECTION.MERGE_MEMBERS(
                   p_collection_name => ‘EMPLOYEES’,
                   p_seq => l_seq,
                  p_c001 => l_c001,
                  p_c002 => l_c002,
                  p_c003 => l_c003,
                  p_init_query => ‘select empno, ename, job from emp order by empno’);
           END;

 

Procedimiento MOVE_MEMBER_DOWN

Utilice este procedimiento para ajustar el Id. de secuencia de un miembro específico en la colección nombrada dada en uno (restar uno), intercambiando el Id. de secuencia con el que está reemplazando. Por ejemplo, 3 se convierte en 2 y 2 se convierte en 3.

Si no existe una colección con el nombre especificado para el usuario actual en la misma sesión y para el ID de aplicación actual, se genera un error de aplicación.

Si el miembro especificado por el ID de secuencia p_seq no existe, se genera un error de aplicación. Si el miembro especificado por el ID de secuencia p_seq es la secuencia más baja de la colección, NO se devuelve un error de aplicación.

La sintaxis del procedimiento es:

APEX_COLLECTION.MOVE_MEMBER_DOWN (
     p_collection_name IN VARCHAR2,
     p_seq IN NUMBER );

Donde:

Parámetro Descripción
p_collection_name El nombre de la colección. La longitud máxima es de 255 bytes. Los nombres de las colecciones no distinguen entre mayúsculas y minúsculas y se convierten a mayúsculas. Se devuelve un error si esta colección no existe con el nombre especificado del usuario actual en la misma sesión.
p_seq Identifica el número de secuencia del miembro de la colección que se moverá hacia abajo en uno.

Un ejemplo del uso de este procedimiento es:

BEGIN
     APEX_COLLECTION.MOVE_MEMBER_DOWN(
          p_collection_name => ‘EMPLOYEES’,
          p_seq => ‘5’ );
END;

 

Procedimiento MOVE_MEMBER_UP

Utilice este procedimiento para ajustar el ID de secuencia del miembro especificado en la colección nombrada dada en uno (agregar uno), intercambiando el ID de secuencia con el que está reemplazando. Por ejemplo, 2 se convierte en 3 y 3 se convierte en 2.

Si no existe una colección con el nombre especificado para el usuario actual en la misma sesión y para el ID de aplicación actual, se genera un error de aplicación.

Si el miembro especificado por el ID de secuencia p_seq no existe, se genera un error de aplicación. Si el miembro especificado por el ID de secuencia p_seq es la secuencia más alta de la colección, no se devuelve un error de aplicación.

La sintaxis del procedimiento es:

APEX_COLLECTION.MOVE_MEMBER_UP (
     p_collection_name IN VARCHAR2,
     p_seq IN NUMBER );

Donde:

Parámetro Descripción
p_collection_name El nombre de la colección. La longitud máxima es de 255 bytes. Los nombres de las colecciones no distinguen entre mayúsculas y minúsculas y se convierten a mayúsculas. Se devuelve un error si esta colección no existe con el nombre especificado del usuario actual en la misma sesión.
p_seq Identifica el número de secuencia del miembro de la colección que se moverá hacia arriba en uno.

Un ejemplo del uso de este procedimiento es:

BEGIN
     APEX_COLLECTION.MOVE_MEMBER_UP(
          p_collection_name => ‘EMPLOYEES’,
          p_seq => ‘5’ );
END;

 

Procedimiento RESEQUENCE_COLLECTION

Para una colección con nombre, use este procedimiento para actualizar el valor seq_id de cada miembro para que no existan espacios en la secuencia. Por ejemplo, una colección con el siguiente conjunto de ID de secuencia (1,2,3,5,8,9) se convierte en (1,2,3,4,5,6). Si no existe una colección con el nombre especificado para el usuario actual en la misma sesión y para el ID de aplicación actual, se genera un error de aplicación.

La sintaxis del procedimiento es:

APEX_COLLECTION.RESEQUENCE_COLLECTION (
     p_collection_name IN VARCHAR2);

Donde:

Parámetro Descripción
p_collection_name El nombre de la colección a resecuenciar. Se devuelve un error si esta colección no existe con el nombre especificado del usuario actual y en la misma sesión.

Un ejemplo del uso de este procedimiento es:

BEGIN
     APEX_COLLECTION.RESEQUENCE_COLLECTION (
          p_collection_name => ‘DEPARTMENTS’);
END;

 

En la siguiente entrada, continuaremos con el detalle del segundo grupo de procedimientos y funciones que componen el paquete APEX_COLLECTION.

También te puede gustar…

Share This