Ассоциативные массивы (индексированные таблицы)

Ассоциативный массив в PL/SQL это коллекция элементов, которые используют произвольные числа и строки в качестве индекса значения.
Объявление ассоциативного массива в декларативной части PL/SQL-элемента (пакета, процедуры и т.п.):

DECLARE
   TYPE AssocArray IS TABLE OF ElementType
   INDEX BY BINARY_INTEGER|pls_integer|VARCHAR2(size);


Ассоциативный массив можно представить как таблицу в памяти имеющую свой первичный ключ. Первичный ключ может быть как Integer (BINARY_INTEGER и PLS_INTEGER) так и String (VARCHAR2 или любой из его подтипов).

Пример использования ассоциативных массивов:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DECLARE
   TYPE dept_rty IS RECORD
      (deptNo NUMBER, extra_tx VARCHAR2(2000));
   TYPE dept_aa IS TABLE OF dept_rty
      INDEX BY BINARY_INTEGER;
   v_dept_aa dept_aa;
   CURSOR c_emp IS
      SELECT eName, deptNo
         FROM emp;
BEGIN
   v_dept_aa(10).deptNo:=10;
   v_dept_aa(20).deptNo:=20;
   v_dept_aa(30).deptNo:=30;
      FOR r_emp IN c_emp LOOP
         v_dept_aa(r_emp.deptNo).extra_tx:=
            v_dept_aa(r_emp.deptNo).extra_tx||' '||r_emp.eName;
      END LOOP;
END;

Строка 6: Ассоциативные массивы начинают существовать сразу после объявления переменной.

Строки 11–13: Объявление элементов коллекции. Нет необходимости расширять коллекцию для добавления новых элементов, все что нужно для этого — присвоить любое значние любому атрибуту элемента с нужным индексом. Оракл создаст элементы коллекции таким образом что индекс 20 будет располагаться сразу после 10-го.

Строки 15–16: Так как DEPTNO используется в качестве индекса коллекции, довольно легко обновить правильную строку массива.

Формирование листа сотрудников сгруппированного по двум параметрам: департаменту и кварталу принятия на работу

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
DECLARE
	TYPE list_aa IS TABLE OF VARCHAR2(2000)
		INDEX BY VARCHAR2(256);
	v_list_aa list_aa;
 
	CURSOR c_dept IS
		SELECT deptNo
		FROM dept
		ORDER BY deptNo;
	CURSOR c_emp IS
		SELECT eName, deptNo, TO_CHAR(hireDate,'q') q_nr
		FROM emp;
	v_subscript_tx VARCHAR2(256);
BEGIN
	FOR r_dept IN c_dept LOOP
		v_list_aa(r_dept.deptNo||'|1'):='Q1 Dept#'||r_dept.deptno||':';
		v_list_aa(r_dept.deptNo||'|2'):='Q2 Dept#'||r_dept.deptno||':';
		v_list_aa(r_dept.deptNo||'|3'):='Q3 Dept#'||r_dept.deptno||':';
		v_list_aa(r_dept.deptNo||'|4'):='Q4 Dept#'||r_dept.deptno||':';
	END LOOP;
 
	FOR r_emp IN c_emp LOOP
		v_list_aa(r_emp.deptNo||'|'||r_emp.q_nr):=
			v_list_aa(r_emp.deptNo||'|'||r_emp.q_nr)||' '||r_emp.eName;
	END LOOP;
 
	v_subscript_tx:=v_list_aa.FIRST;
 
	LOOP
		DBMS_OUTPUT.put_line(v_list_aa(v_subscript_tx));
		v_subscript_tx:=v_list_aa.next(v_subscript_tx);
		EXIT WHEN v_subscript_tx IS NULL;
	END LOOP;
END;

Оставить комментарий