Пример создания коллекции
--Вложенная таблица
DECLARE TYPE list_of_dates_t IS TABLE OF DATE; TYPE list_of_names_t IS TABLE OF VARCHAR2 (100) INDEX BY BINARY_INTEGER; birthdays list_of_dates_t:=list_of_dates_t(); happyfamily list_of_names_t; BEGIN birthdays.EXTEND; birthdays(1):=’23.09.1985’; birthdays.EXTEND; birthdays(2):=’09.04.1978’; happyfamily(-15070):=‘Иван’; happyfamily(88):=‘Ева’; happyfamily(909):=‘Женя’; happyfamily(2020202020):=‘Таня’; DBMS_OUTPUT.put_line (birthdays.COUNT); DBMS_OUTPUT.put_line (happyfamily.FIRST); END; 2 -15070
--Ассоциативный массив
Встроенные методы коллекций
Пример перебора элементов коллекции
DECLARE TYPE population IS TABLE OF NUMBER INDEX BY VARCHAR2(64); city_population population; i VARCHAR2(64); BEGIN city_population(‘Бердск') := 100259; city_population(‘Омск') := 1160670; city_population(‘Новосибирск') := 1473754; city_population(‘Бердск') := 100260; i := city_population.FIRST; WHILE i IS NOT NULL LOOP DBMS_Output.PUT_LINE (‘Население в ' || i || ‘е составляет ' ||TO_CHAR(city_population(i))); i := city_population.NEXT(i); END LOOP; END; Население в Бердске 100260 Население в Новосибирске 1473754 Население в Омске 1473754
Объявление вложенной таблицы или типа VARRAY
Перед объявлением вложенной таблицы или VARRAY, также как и при объявлении ассоциативного массива, нужно объявить соответствующий тип. Его можно задать либо в базе данных, либо в блоке PL/SQL.
Создание типа вложенной таблицы в базе данных:
Create [or replace] TYPE имя_типа AS|IS TABLE OF тип_данных_элемента [NOT NULL];
Создание типа VARRAY в базе данных:
Create [or replace] TYPE имя_типа AS|IS VARRAY(максимальный индекс) OF тип_данных_элемента [NOT NULL];
Для удаления любого типа данных, необходимо выполнить команду:
DROP TYPE имя_типа [FORCE];
Объявление вложенных таблиц или VARRAY в PL/SQL
Создание типа вложенной таблицы в PL/SQL:
TYPE имя_типа AS|IS TABLE OF тип_данных_элемента [NOT NULL];
Создание типа VARRAY в PL/SQL:
TYPE имя_типа AS|IS VARRAY(максимальный индекс) OF тип_данных_элемента [NOT NULL];
Пример использования вложенной таблицы
1. Создаём тип typ_color в базе данных:
CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR2(30);
2. Создаём анонимный блок в котором мы будем использовать тип typ_color:
DECLARE v_font_colors typ_color:=typ_color('Зелёный','Синий','Голубой'); BEGIN for i in 1..v_font_colors.count loop DBMS_Output.PUT_LINE(v_font_colors(i)); end loop; END;
Зелёный Синий Голубой
Мультимножество
MULTISET EXCEPT
MULTISET EXCEPT
MULTISET INTERSECT
MULTISET UNION
MULTISET UNION DISTINCT
Уникальное множество
Оператор MULTISET UNION
CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR2(30); DECLARE v_font_colors typ_color:=typ_color('Зелёный','Синий','Голубой'); v_font_colors2 typ_color:=typ_color('Красный','Синий','Голубой'); v_font_colors3 typ_color:=typ_color(); BEGIN v_font_colors3:=v_font_colors MULTISET UNION v_font_colors2 ; for i in 1..v_font_colors3.count loop DBMS_Output.PUT_LINE(v_font_colors3(i)); end loop; END;
Зелёный Синий Голубой Красный Синий Голубой
Оператор MULTISET UNION DISTINCT
CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR2(30); DECLARE v_font_colors typ_color:=typ_color('Зелёный','Синий','Голубой'); v_font_colors2 typ_color:=typ_color('Красный','Синий','Голубой'); v_font_colors3 typ_color:=typ_color(); BEGIN v_font_colors3:=v_font_colors MULTISET UNION DISTINCT v_font_colors2 ; for i in 1..v_font_colors3.count loop DBMS_Output.PUT_LINE(v_font_colors3(i)); end loop; END;
Зелёный Синий Голубой Красный
Оператор MULTISET INTERSECT
DECLARE v_font_colors typ_color:=typ_color('Зелёный','Синий','Голубой'); v_font_colors2 typ_color:=typ_color('Красный','Синий','Голубой'); v_font_colors3 typ_color:=typ_color(); BEGIN v_font_colors3:=v_font_colors MULTISET INTERSECT v_font_colors2 ; for i in 1..v_font_colors3.count loop DBMS_Output.PUT_LINE(v_font_colors3(i)); end loop; END;
Синий Голубой
Оператор MULTISET EXCEPT
CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR2(30); DECLARE v_font_colors typ_color:=typ_color('Зелёный','Синий','Голубой'); v_font_colors2 typ_color:=typ_color('Красный','Синий','Голубой'); v_font_colors3 typ_color:=typ_color(); BEGIN v_font_colors3:=v_font_colors MULTISET EXCEPT v_font_colors2 ; for i in 1..v_font_colors3.count loop DBMS_Output.PUT_LINE(v_font_colors3(i)); end loop; END;
Зелёный
Использование коллекций
CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR2(30);
DECLARE( TYPE toys is RECORD (form NUMBER, weight NUMBER, color typ_color );
CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR2(30); CREATE OR REPLACE PROCEDURE make_colors_superset(first_colors IN typ_color, Second_colors IN typ_color, superset OUT typ_color,type_multiset IN NUMBER) as Begin IF type_multiset=1 then superset :=first_colors MULTISET UNION second_colors ; ELSIF type_multiset=2 then superset :=first_colors MULTISET INTERSECT Second_colors ; ELSIF type_multiset=3 then superset :=first_colors MULTISET EXCEPT Second_colors ; ELSE superset :=first_colors MULTISET UNION DISTINCT Second_colors; END IF; End;
DECLARE v_font_colors typ_color:=typ_color('Зелёный','Синий','Голубой'); v_font_colors2 typ_color:=typ_color('Красный','Синий','Голубой'); v_font_colors3 typ_color:=typ_color(); BEGIN make_colors_superset(v_font_colors ,v_font_colors2,v_font_colors3,1) ; for i in 1..v_font_colors3.count loop DBMS_Output.PUT_LINE(v_font_colors3(i)); end loop; END;
Зелёный Синий Голубой Красный Синий Голубой
Выборка данных
Механизмы доступа к данных из PL/SQL
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.