Oracle/PL/SQL/Tipos compuestos
Apariencia
Registros
[editar]El usuario puede definir sus propios registros tambien su tipos de datos, incluyendo tipos independientes, derivados de tablas y otros registros:
declare type t_registro is record ( guia varchar2(20) not null := 'Registros y Colecciones', apellido employees.last_name%type, region regins%rowtype ); v_registro t_registro; begin v_registro.apellido := 'Gonzalez'; v_registro.guia := 'Registros'; v_registro.region.region_id := 5; v_registro.region.region_name := 'Antártida'; end;
Colecciones
[editar]Nested Tables
[editar]declare type t_vector is table of varchar2(30); v_vector t_vector; begin v_vector := t_vector('Uno', 'Dos', 'Tres'); for i in v_vector.first .. v_vector.last loop dbms_output.put_line(i ||': '|| v_vector(i)); end loop; end;
Associative Arrays
[editar]Se asocia un valor con un subíndice, sin un orden ni capacidad determinados.
Ejemplo con subíndice entero:
declare type t_vector is table of varchar2(30) index by pls_integer; v_vector t_vector; n pls_integer; begin v_vector(10) := 'Diez'; v_vector(20) := 'Veinte'; v_vector(12) := 'Doce'; for i in v_vector.first .. v_vector.last loop if (v_vector.exists(i)) then dbms_output.put_line(i ||': '|| v_vector(i)); end if; end loop; dbms_output.put_line('count: '|| v_vector.count); n := v_vector.first; while n is not NULL loop dbms_output.put_line(n ||': '|| v_vector(n)); n := v_vector.next(n); end loop; end;
Ejemplo con subíndice de texto:
declare type t_vector is table of number(3) index by varchar2(10); v_vector t_vector; subind varchar2(10); begin v_vector('Cuarenta') := 40; v_vector('cuarenta') := -40; v_vector('Cinco') := 5; v_vector('Quince') := 15; dbms_output.put_line('count: '|| v_vector.count); subind := v_vector.first; while subind is not NULL loop dbms_output.put_line(subind ||': '|| v_vector(subind)); subind := v_vector.next(subind); end loop; end;
Operaciones masivas
[editar]Lectura de Colecciones usando SELECT INTO y BULK COLLECT.
Ejemplo con Nested Table:
declare type t_emp is table of employees%rowtype; v_emp t_emp; begin select * bulk collect into v_emp from employees where salary > 12000; for i in v_emp.first .. v_emp.last loop dbms_output.put_line(v_emp(i).last_name ||': '|| v_emp(i).salary); end loop; end;
Ejemplo con Associative Arrays indexados por enteros:
declare type t_emp is table of employees%rowtype index by pls_integer; v_emp t_emp; begin select * bulk collect into v_emp from employees where salary > 12000; for i in v_emp.first .. v_emp.last loop dbms_output.put_line(v_emp(i).last_name ||': '|| v_emp(i).salary); end loop; end;
Optimización de DML:
declare type t_vector is table of ...; v_vector t_vector; begin forall i in v_vector.first .. v_vector.last insert into tabla values (v_vector(i)); forall i in v_vector.first .. v_vector.last delete from tabla where campo = v_vector(i); end;
También es válido para UPDATE.