Пример организации циклического буфера FIFO
Создаем глобальный тип массива на 100 элементов
Создаем объектный тип с полями текущей позиции массива и самим массивом.
В объекте 3 метода
Пример использования данного объектного типа
Буфер для сохранения последних 100 сессий по каждому отдельному типу
create table last_sessions (
type_id int primary key,
sess_arr t_last_sess)
organization index;
Создаем глобальный тип массива на 100 элементов
CREATE type t_last_sess_arr is varray(100) of number(32,0);
Создаем объектный тип с полями текущей позиции массива и самим массивом.
В объекте 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;