salida resueltos procedimientos procedimiento parametros funciones example español ejemplos ejecutar developer con almacenado 11g oracle plsql oracle9i

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 !