HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: субд, базы данных, object, oracle, управление базами данных, fifo, циклический буфер</p>
1 <p>Теги: субд, базы данных, object, oracle, управление базами данных, fifo, циклический буфер</p>
2 <p>Давайте рассмотрим пример организации циклического буфера<strong>FIFO</strong>. Cоздадим<strong>глобальный тип</strong>массива на 100 элементов:</p>
2 <p>Давайте рассмотрим пример организации циклического буфера<strong>FIFO</strong>. Cоздадим<strong>глобальный тип</strong>массива на 100 элементов:</p>
3 CREATE type t_last_sess_arr is varray(100) of number(32,0);<p>Теперь создадим<strong>объектный тип</strong>с полями текущей позиции массива и самим массивом. В объекте 3 метода: 1.<strong>конструктор</strong>, инициализирующий массив пустыми значениями; 2.<strong>процедура</strong>, которая сдвигает позицию и заменяет элемент массива в этой позиции; 3.<strong>функция</strong>, которая возвращает объект с обновлённым элементом и сдвинутой позицией.</p>
3 CREATE type t_last_sess_arr is varray(100) of number(32,0);<p>Теперь создадим<strong>объектный тип</strong>с полями текущей позиции массива и самим массивом. В объекте 3 метода: 1.<strong>конструктор</strong>, инициализирующий массив пустыми значениями; 2.<strong>процедура</strong>, которая сдвигает позицию и заменяет элемент массива в этой позиции; 3.<strong>функция</strong>, которая возвращает объект с обновлённым элементом и сдвинутой позицией.</p>
4 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; /<h2>Пример использования данного объектного типа</h2>
4 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; /<h2>Пример использования данного объектного типа</h2>
5 <p><strong>Буфер</strong>для сохранения последних 100 сессий по каждому отдельному типу:</p>
5 <p><strong>Буфер</strong>для сохранения последних 100 сессий по каждому отдельному типу:</p>
6 create table last_sessions ( type_id int primary key, sess_arr t_last_sess) organization index;<p><strong>Инициализация буфера</strong>для типа сессий=1</p>
6 create table last_sessions ( type_id int primary key, sess_arr t_last_sess) organization index;<p><strong>Инициализация буфера</strong>для типа сессий=1</p>
7 INSERT INTO last_sessions VALUES(1, t_last_sess());<p><strong>Обновление буфера</strong>:</p>
7 INSERT INTO last_sessions VALUES(1, t_last_sess());<p><strong>Обновление буфера</strong>:</p>
8 update last_sessions t set t.sess_arr=t.sess_arr.updArr(&lt;ИД сессии&gt;) where bill_type_id=1;<p><em>На этом пока всё, следите за новостями и высказывайте своё мнение в комментариях!</em></p>
8 update last_sessions t set t.sess_arr=t.sess_arr.updArr(&lt;ИД сессии&gt;) where bill_type_id=1;<p><em>На этом пока всё, следите за новостями и высказывайте своё мнение в комментариях!</em></p>
9  
9