resueltos - Oracle PL/SQL-¿Cómo crear una variable de matriz simple?
pl sql oracle (4)
Me gustaría crear una variable de matriz en memoria que se pueda usar en mi código PL / SQL. No puedo encontrar ninguna colección en Oracle PL / SQL que use memoria pura, todas parecen estar asociadas con tablas. Estoy buscando hacer algo como esto en mi PL / SQL (sintaxis C #):
string[] arrayvalues = new string[3] {"Matt", "Joanne", "Robert"};
Editar: Oracle: 9i
Otra solución es utilizar una Colección Oracle como Hashmap:
declare
-- create a type for your "Array" - it can be of any kind, record might be useful
type hash_map is table of varchar2(1000) index by varchar2(30);
my_hmap hash_map ;
-- i will be your iterator: it must be of the index''s type
i varchar2(30);
begin
my_hmap(''a'') := ''apple'';
my_hmap(''b'') := ''box'';
my_hmap(''c'') := ''crow'';
-- then how you use it:
dbms_output.put_line (my_hmap(''c'')) ;
-- or to loop on every element - it''s a "collection"
i := my_hmap.FIRST;
while (i is not null) loop
dbms_output.put_line(my_hmap(i));
i := my_hmap.NEXT(i);
end loop;
end;
Podría declarar un DBMS_SQL.VARCHAR2_TABLE para contener una matriz de longitud variable en memoria indexada por 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;
Podría usar una matriz asociativa (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 composición de tipos de registros.
Espero que ayude, Ollie.
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, necesita 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.
También puede usar una 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;
Yo usaría matriz en memoria. Pero con la mejora de .COUNT
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 @Jchomel here
NÓTESE BIEN:
¡Con Oracle 12c incluso puedes consultar arreglos directamente ahora !