Oracle Live

23/08/2016

PLSQL – Collections. Ejemplos de uso

Filed under: PLSQL — mogukiller @ 2:12 pm
Tags:

Para los programadores en PL.

Tipos de Collections:

a) Nested tables: Podemos pensar en un array de valores sin tener que declarar su longitud previamente.
Podemos generar nested tables multidimensionales haciendo nested tables de nested tables.
Pueden almacenar la fila de una tabla mientras que los Arrays asociativos no.
Son buenas cuando:
. Los indices de los valores no son consecutivos.
. Cuando se quieren elminar o actualizar algunos elementos.
. Cuando quiero crear una tabla de lookup y luego hacer un join.
b) Varrays: Permite acceder a sus elementos de forma individual o trabajar con el array como si fuese un todo.
Un varray tiene un tamaño maximo que se debe especificar en su declaracion.
c) Arrays asociativos: Los podemos entender como un array compuesto por duplas llave – valor.
Es la forma mas eficiente de pasar valores con BULK COLLECT o FORALL.
Son buenos cuando:
. Se conoce el numero de objetos devueltos a priori.
. Se acceden a los elementos de forma consecutiva.

Para crear una coleccion primero debemos de definir un tipo y despues declarar variables de ese tipo.

Para un Varray seria:
TYPE Calendario IS VARRAY(366) OF DATE;

Para un array asociativo:
TYPE EmpTabTyp IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;

Para una nested table:
TYPE nested_type IS TABLE OF VARCHAR2(30);

-- Ejemplo de Array asociativo

DECLARE
    TYPE population_type IS TABLE OF NUMBER INDEX BY VARCHAR2(64);
    country_population population_type;
    continent_population population_type;
    howmany NUMBER;
    which VARCHAR2(64);
BEGIN
    country_population('Greenland') := 100000; -- Nueva entrada    
-- Obtenemos el valor asociado a una entrada
    howmany := country_population('Greenland');    
-- .FIRST devuelve en orden alfabetico
    which := continent_population.FIRST;
    which := continent_population.LAST;
    howmany := continent_population(continent_population.LAST);
END;
/

-- Ejemplo de Nested table:
DECLARE
    TYPE nested_type IS TABLE OF VARCHAR2(30);
    v1 nested_type;
BEGIN
    v1 := nested_type('Shipping','Sales','Finance','Payroll');    
	
	FOR i IN v1.FIRST .. v1.LAST
	LOOP
		IF v1(i) = 'Sales' THEN
			DBMS_OUTPUT.PUT_LINE(v1(i)); 
		END IF;
	END LOOP;
	
END;
/

-- Ejemplo Varray.

DECLARE
-- Varray de varchar2
TYPE dnames_var IS VARRAY(20) OF VARCHAR2(30);
dept_names dnames_var;
-- Varray de record.
TYPE name_rec IS RECORD ( first_name VARCHAR2(20), last_name VARCHAR2(25) );
TYPE names IS VARRAY(250) OF name_rec;
BEGIN
dept_names := dnames_var('Shipping','Sales','Finance','Payroll');
END;
/

-- Ejemplo Asociamos la salida de una query a un Array asiciativo.

DECLARE
   TYPE PrueTabTyp IS TABLE OF T_PRUEBAS%ROWTYPE
      INDEX BY PLS_INTEGER;
   prueba_tab PrueTabTyp;
BEGIN   
   SELECT * INTO prueba_tab(100) FROM T_PRUEBAS WHERE ID = 100;
END;
/

-- Ejemplo Asignamos el resultado de una query a una coleccion

DECLARE
-- Asignamos toda una fila
   TYPE t_pruebas_all IS TABLE OF T_PRUEBAS%ROWTYPE;
   all_columns t_pruebas_all; 

-- Opcion para asignar un conjunto de columnas   
   CURSOR c1 IS SELECT id, valor FROM T_PRUEBAS; --> Creamos un cursor con las columnas :-)
   
   TYPE t_pruebas_part IS TABLE OF c1%ROWTYPE;
   some_columns t_pruebas_part; 
   
BEGIN

   SELECT * BULK COLLECT INTO all_columns FROM T_PRUEBAS;
   DBMS_OUTPUT.PUT_LINE('Table all_columns: '||all_columns.COUNT || ' registros');

   SELECT id, valor BULK COLLECT INTO some_columns FROM T_PRUEBAS WHERE ROWNUM < 11;
   FOR i IN some_columns.FIRST .. some_columns.LAST
   LOOP
      DBMS_OUTPUT.PUT_LINE('id: '||all_columns(i).id|| ' valor: '||all_columns(i).valor);
   END LOOP;   
END;
/

Dejar un comentario »

Aún no hay comentarios.

RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: