Continuando con el tema de las colecciones APEX, en esta entrada quiero centrarme en tres acciones específicas que tienen que ver con la creación y acceso a las mismas:
- Nombrado de colecciones
- Creado de colecciones
- Acceso de colecciones
Nombrado de colecciones
Toda colección que creemos, debe tener un nombre que la identifique de manera única. Este sombre debe cumplir con las siguientes características:
- No debe ser mayor de 255 caracteres
- No son sensitivos a mayúsculas o minúsculas, pues son convertidos a mayúsculas
- Este nombre nos sirve para acceder a los valores de la colección al ejecutar una consulta SQL contra la vista APEX_COLLECTIONS
Al final de esta entrada encontrarán un ejemplo de una consulta SQL de una colección.
Creado de colecciones
Como se mencionó en la entrada anterior, cada colección contiene una lista de elementos de datos o miembros de las características y en las cantidades allí mencionadas. Para crear una colección, podemos usar los siguientes métodos:
CREATE_COLLECTION | Este método crea una colección vacía con el nombre que se proporciona. Si la colección ya existe, entonces se produce una excepción. |
Ejemplo:
1 2 3 4 |
<i> Begin</i> <i> apex_collection.create_collection(</i> <i> p_collection_name => ‘Salarios’);</i> <i> End;</i> |
En este ejemplo, estamos creando una colección vacía llamada “Salarios”.
CREATE_OR_TRUNCATE_COLLECTION | Si el nombre de la colección que se proporciona no existe, este método crea una colección vacía con el mismo. Si el nombre de la colección ya existe, este método la trunca, lo que implica vaciarla pero mantenerla en su lugar. |
Un ejemplo de este método, similar al anterior, sería:
1 2 3 4 |
<i>Begin</i> <i> apex_collection.create_or_truncate_collection(</i> <i> p_collection_name => ‘Salarios’);</i> <i> End;</i> |
CREATE_COLLECTION_FROM_QUERY | Con este método creamos una colección y la poblamos con los resultados de la consulta especificada. Si la colección ya existe vamos a recibir una excepción como resultado. Este método se puede utilizar con una consulta de hasta 50 columnas en una sentencia SELECT, la cual puebla o rellenas los 50 atributos tipo carácter de la colección (c001 a c050). |
En el siguiente ejemplo, creamos una colección de nombre “EMPLEADOS” y le agregamos los datos de los empleados en la tabla EMPLEADOS:
1 2 3 4 5 6 7 |
<i>Begin</i> <i> w_query := ‘select nombre, puesto, oficina, ciudad from EMPLEADOS’;</i> <i> apex_collections.create_collection_from_query(</i> <i> p_collection_name => ‘EMPLEADOS’,</i> <i> p_query => w_query,</i> <i> p_generate_md5 => ‘YES’);</i> <i> End;</i> |
CREATE_COLLECTION_FROM_QUERY2 | Este método es idéntico al anterior, sin embargo, las 5 primeras columnas de la sentencia SELECT deben ser numéricas, luego de las cuales puede haber hasta 50 columnas de tipo carácter en la sentencia. |
En este ejemplo, incluimos la consulta directamente en el llamado del método y creamos una colección llamada “NOMINA” a partir de una tabla llamada “SALARIOS”:
1 2 3 4 5 6 7 |
<i>Begin</i> <i> apex_collections.create_collection_from_query2(</i> <i> p_collection_name => ‘EMPLEADOS’,</i> <i> p_query => ‘select no_empleado, salario, comision, depto, null, fecha_ingreso, null, null, null, null, nombre, puesto, oficina, ciudad from SALARIOS’,</i> <i> p_generate_md5 => ‘NO’);</i> <i> End;</i> |
Del ejemplo anterior, deberían tomar nota de lo siguiente:
- Si no tenemos cinco columnas de tipo numérico que seleccionar, se deben completar las mismas con columnas nulas.
- Se agrega además una columna de tipo fecha y como en el caso anterior, se debe completar a cinco columnas con valores nulos, pues como se explicó en la entrada anterior, la cantidad de miembros de tipo fecha de una colección es de 5.
- No se está calculando el valor de verificación MD5 en este caso.
CREATE_COLLECTION_FROM_QUERY_B | Este método es mucho más rápido que el método CREATE_COLLECTION_FROM_QUERY, al ejecutar operaciones de SQL en bulto, pero tiene las siguientes limitaciones:
|
En el ejemplo siguiente, se puede observar que como se comentó arriba, el valor de verificación MD5 no se calcula, y el formato es igual al del método CREATE_COLLECTION_FROM_QUERY:
1 2 3 4 5 6 7 |
<i>Begin</i> <i> w_query := ‘select nombre, puesto, oficina, ciudad from EMPLEADOS’;</i> <i> apex_collections.create_collection_from_query(</i> <i> p_collection_name => ‘EMPLEADOS’,</i> <i> p_query => w_query,</i> <i> p_generate_md5 => ‘YES’);</i> <i> End;</i> |
CREATE_COLLECTION_FROM_QUERYB2 | Este método es idéntico al anterior, sin embargo, las cinco primeras columnas de la sentencia SELECT deben ser numéricas, luego de las cuales se pueden incluir hasta 50 columnas de tipo carácter. |
En este caso, siguiendo con los ejemplos de arriba, el de este método se vería así:
1 2 3 4 5 6 7 8 |
<i>Begin</i> <i> </i><i>w_query := </i><i>‘select no_empleado, salario, comision, depto, null, fecha_ingreso, null, null, null, null, nombre, puesto, oficina, ciudad from SALARIOS’</i> <i> apex_collections.create_collection_from_query2(</i> <i> p_collection_name => ‘EMPLEADOS’,</i> <i> p_query => w_query,</i> <i> p_generate_md5 => ‘NO’);</i> <i> End;</i> |
Acceso de colecciones
Se puede acceder a los miembros de una colección consultando la vista de base de datos APEX_COLLECTIONS, la cual tiene la siguiente definición:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Nombre ¿Nulo? Tipo --------------- -------- -------------- COLLECTION_NAME NOT NULL VARCHAR2(255) SEQ_ID NOT NULL NUMBER C001 VARCHAR2(4000) ... C050 VARCHAR2(4000) CLOB001 CLOB BLOB001 BLOB XMLTYPE001 SYS.XMLTYPE N001 NUMBER ... N005 NUMBER D001 DATE ... D005 DATE MD5_ORIGINAL VARCHAR2(4000) |
Utilizamos la vista APEX_COLLECTIONS en nuestras aplicaciones de la misma manera en que lo hacemos con cualquier otra vista o tabla de nuestras aplicaciones, como por ejemplo:
1 2 3 |
<i> SELECT c001, c002, c003, n001, d001, clob001</i> <i> FROM apex_collections</i> <i> WHERE collection_name = ‘NOMINA’</i> |
En este caso estamos seleccionando los tres primeros miembros de tipo carácter, el primer miembro numérico, el primer miembro de tipo fecha y el miembro de tipo CLOB de la colección llamada “NOMINA”.
En la siguiente entrada estaré explicando como “unir”, truncar y eliminar colecciones.