Oracle PL / SQL-как создать простую переменную массива?
Я хотел бы создать переменную массива в памяти, которая может быть использована в моем коде PL/SQL. Я не могу найти никаких коллекций в Oracle PL/SQL, которые используют чистую память, все они, похоже, связаны с таблицами. Я хочу сделать что-то вроде этого в моем PL/SQL (синтаксис C#):
string[] arrayvalues = new string[3] {"Matt", "Joanne", "Robert"};
Edit:
Оракул: 9и
4 ответов:
вы можете использовать VARRAY для массива фиксированного размера:
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;или таблица для неограниченного массива:
... type array_t is table of varchar2(10); ...слово "стол" здесь не имеет ничего общего с таблицами базы данных, к сожалению. Оба метода создают массивы в памяти.
С любым из них вам нужно как инициализировать, так и расширить коллекцию перед добавлением элементов:
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;первый индекс равен 1, а не 0.
вы можете просто объявить DBMS_SQL.VARCHAR2_TABLE для хранения массива переменной длины в памяти, индексированного 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;вы можете использовать ассоциативный массив (используемый для вызова таблиц PL/SQL), поскольку они являются массивом в памяти.
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;ассоциативный массив может содержать любые типы записей.
надеюсь, что это помогает, Олли.
другое решение-использовать коллекцию Oracle в качестве хэш-карты:
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;
вы также можете использовать
oracle defined collectionDECLARE 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;Я бы использовал массив в памяти. Но с помощью
.COUNTулучшение, предложенное узиберией: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;другое решение было бы использовать Hashmap, как @Jchomel здесь
NB:
С Oracle 12c, вы можете даже массивы запросов прямо сейчас!
Comments