Использование типа Object

Subd_Deep_26.12_site-5020-d39010.png

Давайте рассмотрим пример организации циклического буфера FIFO. Cоздадим глобальный тип массива на 100 элементов:

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;

На этом пока всё, следите за новостями и высказывайте своё мнение в комментариях!

Автор
0 комментариев
Для комментирования необходимо авторизоваться