Solución:
Puede usar VARRAY para una matriz de tamaño fijo:
declare
type array_t is varray(3) of varchar2(10);
array array_t := array_t('Matt', 'Joanne', 'Robert');
begin
for i in 1..array.count loop
dbms_output.put_line(array(i));
end loop;
end;
O TABLE para una matriz ilimitada:
...
type array_t is table of varchar2(10);
...
La palabra “tabla” aquí no tiene nada que ver con las tablas de la base de datos, de manera confusa. Ambos métodos crean matrices en memoria.
Con cualquiera de estos, debe inicializar y extender la colección antes de agregar elementos:
declare
type array_t is varray(3) of varchar2(10);
array array_t := array_t(); -- Initialise it
begin
for i in 1..3 loop
array.extend(); -- Extend it
array(i) := 'x';
end loop;
end;
El primer índice es 1, no 0.
Podría simplemente declarar un DBMS_SQL.VARCHAR2_TABLE para contener una matriz de longitud variable en la memoria indexada por un BINARY_INTEGER:
DECLARE
name_array dbms_sql.varchar2_table;
BEGIN
name_array(1) := 'Tim';
name_array(2) := 'Daisy';
name_array(3) := 'Mike';
name_array(4) := 'Marsha';
--
FOR i IN name_array.FIRST .. name_array.LAST
LOOP
-- Do something
END LOOP;
END;
Puede usar una matriz asociativa (que solía llamarse tablas PL / SQL) ya que son una matriz en memoria.
DECLARE
TYPE employee_arraytype IS TABLE OF employee%ROWTYPE
INDEX BY PLS_INTEGER;
employee_array employee_arraytype;
BEGIN
SELECT *
BULK COLLECT INTO employee_array
FROM employee
WHERE department = 10;
--
FOR i IN employee_array.FIRST .. employee_array.LAST
LOOP
-- Do something
END LOOP;
END;
La matriz asociativa puede contener cualquier tipo de registro.
Espero que te ayude, Ollie.
También puede utilizar un oracle defined collection
DECLARE
arrayvalues sys.odcivarchar2list;
BEGIN
arrayvalues := sys.odcivarchar2list('Matt','Joanne','Robert');
FOR x IN ( SELECT m.column_value m_value
FROM table(arrayvalues) m )
LOOP
dbms_output.put_line (x.m_value||' is a good pal');
END LOOP;
END;
Usaría una matriz en memoria. Pero con el .COUNT
mejora sugerida por uziberia:
DECLARE
TYPE t_people IS TABLE OF varchar2(10) INDEX BY PLS_INTEGER;
arrayvalues t_people;
BEGIN
SELECT *
BULK COLLECT INTO arrayvalues
FROM (select 'Matt' m_value from dual union all
select 'Joanne' from dual union all
select 'Robert' from dual
)
;
--
FOR i IN 1 .. arrayvalues.COUNT
LOOP
dbms_output.put_line(arrayvalues(i)||' is my friend');
END LOOP;
END;
Otra solución sería usar un Hashmap como lo hizo @Jchomel aquí.
NÓTESE BIEN:
¡Con Oracle 12c incluso puede consultar matrices directamente ahora!