Использование типа Object
Давайте рассмотрим пример организации циклического буфера FIFO.
CREATE type t_last_sess_arr is varray(100) of number(32,0);
Теперь создадим объектный тип с полями текущей позиции массива и самим массивом. В объекте 3 метода: 1. конструктор, инициализирующий массив пустыми значениями; 2. процедура, которая сдвигает позицию и заменяет элемент массива в этой позиции; 3. функция, которая возвращает объект с обновлённым элементом и сдвинутой позицией.
CREATE OR REPLACE TYPE t_last_sess AS OBJECT ( position INT , last_sess t_last_sess_arr , CONSTRUCTOR FUNCTION t_last_sess RETURN SELF AS RESULT , MEMBER PROCEDURE addBS (b_session_id NUMBER) , MEMBER FUNCTION updArr (b_session_id NUMBER) RETURN t_last_sess ); / CREATE OR REPLACE TYPE BODY t_last_sess AS CONSTRUCTOR FUNCTION t_last_sess RETURN SELF AS RESULT AS BEGIN SELF.position := 1; SELF.last_sess := t_last_sess_arr(); SELF.last_sess.EXTEND(100); RETURN; END t_last_sess; MEMBER PROCEDURE addBS (b_session_id NUMBER) IS BEGIN SELF.last_sess(SELF.position) := b_session_id; IF SELF.position = 100 THEN SELF.position := 1; ELSE SELF.position := SELF.position +1; END IF; RETURN; END addBS; MEMBER FUNCTION updArr (b_session_id NUMBER) RETURN t_last_sess IS l_arr t_last_sess; BEGIN l_arr:= SELF; l_arr.addBS(b_session_id); RETURN l_arr; END updArr; END; /
Пример использования данного объектного типа
Буфер для сохранения последних 100 сессий по каждому отдельному типу:
create table last_sessions ( type_id int primary key, sess_arr t_last_sess) organization index;
Инициализация буфера для типа сессий=1
INSERT INTO last_sessions VALUES(1, t_last_sess());
Обновление буфера:
update last_sessions t set t.sess_arr=t.sess_arr.updArr(<ИД сессии>) where bill_type_id=1;
На этом пока всё, следите за новостями и высказывайте своё мнение в комментариях!