Управление динамическим размещением объектов в библиотечном буфере — КиберПедия 

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Управление динамическим размещением объектов в библиотечном буфере

2022-12-20 19
Управление динамическим размещением объектов в библиотечном буфере 0.00 из 5.00 0 оценок
Заказать работу

Раз попавшие в библиотечный буфер объекты можно закреплять в ОЗУ для того, чтобы они не участвовали в схеме освобождения памяти под новые объекты. Для этого имеется системный пакет DBMS_SHARED_POOL. Процедуры KEEP и UNKEEP этого пакета закрепляют или открепляют от памяти объекты следующих типов в соответствии с указанием поля FLAG:

 

P или p Пакет, процедура или функция
Q или q Генератор уникальных номеров
R или r Триггерная процедура
T или t Тип (версия 8.1 и выше)
Любой другой символ (логично указывать C или с) Курсор

 

Перечень закрепленных в памяти объектов можно получить в таблице V$DB_OBJECT_CACHE.

 

Процедура SIZES позволяет выдать список объектов, размер которых не превышает аргумент этой функции, задаваемый в килобайтах, например:

 

SET SERVEROUTPUT ON SIZE 100000

EXECUTE SYS. DBMS_SHARED_POOL.SIZES (70)

 

Процедура ABORTED_REQUEST_TRESHOLD позволяет задать порог в байтах на размер размещаемого в памяти нового объекта. Если размер нового размещаемого объекта больше порогового значения и в shared pool нет места для размещения, Oracle не будет пытаться освободить для такого объекта место, удаляя не используемые в данный момент объекты. 

 

Размер подпрограмм – кандидатов на закрепление в памяти можно посмотреть непосредственно из таблицы DBA_OBJECT_SIZE или из DBA_KEEPSIZES (создается при заведении DBMS_SHARED_POOL).

 

Сценарий создания пакета хранится в файлах dbmspool. sql и prvtpool. plb в rdbms/ admin.

 

Фирма Oracle не гарантирует, что пакет DBMS_SHARED_POOL в будущих версиях останется, но пока он не отменен.

 

 

Манипулирование большими неструктурированными объектами

Главный системный пакет в этой области – DBMS_LOB (сценарий dbmslob. sql). С его помощью можно выполнять следующие операции над разными типами объектов (полный список см. в документации):

 

Операция BFILE BLOB CLOB NCLOB
APPEND   X X X
COMPARE X X X X
COPY   X X X
ERASE   X X X
FILECLOSE X      
FILECLOSEALL X      
FILEEXISTS X      
FILEGETNAME X      
FILEISOPEN X      
FILEOPEN X      
GETLENGTH X X X X
INSTR X X X X
LOADFROMFILE X X X X
READ X X X X
SUBSTR X X X X
TRIM   X X X
WRITE   X X X

 

(Длина LOB-объекта в версии 8.1.7 может быть до 4 Гб -1).

 

Пояснение.

 

LOB-объект хранится в базе самостоятельно, а в полях таблиц (и в переменной PL/SQL) хранится указатель на него. Если в поле типа LOB указатель отсутствует, значение поля считается как NULL:

 

SQL> DECLARE c CLOB;

2 BEGIN IF c IS NULL THEN DBMS_OUTPUT.PUT_LINE ('NULL'); END IF; END;

3 /

NULL

 

Если в поле типа LOB указатель направляет на LOB-объект нулевой длины, считается, что оно пусто (empty). На один LOB-объект может быть заведено несколько указателей. Список LOB-объектов можно посмотреть в таблице SYS.DBA_LOBS.

 

Пример использования пакета:

 

DECLARE

document   CLOB;

initext        VARCHAR2 (4000):= ‘Приказ № 1’;

BEGIN

DBMS_LOB.CREATETEMPORARY (document, TRUE, DBMS_LOB.SESSION);

DBMS_LOB.WRITE (document, length (initext), 1, initext);

-- Продолжаем работу с документом...

--

DBMS_LOB.FREETEMPORARY (document);

END;

/

 

Пояснение примера.

 

Здесь в программе использовалась «временная LOB-переменная», то есть переменная, временно хранимая в базе. Срок хранения указан третьим параметром, DBMS_LOB.SESSION – это сеанс. Процедура DBMS_LOB.FREETEMPORARY способна удалить такую переменную раньше.

 

На временную LOB-переменную не распространяются обычные транзакционные правила существования.

 

Процедура DBMS_LOB.CREATETEMPORARY по правилам своей работы создает пустой LOB-объект, а инициализация и занесение значения в него выполняются в данном случае процедурой DBMS_LOB.WRITE.

 

Начиная с версии 9.2 некоторые операции с объектами LOB стало возможным оформлять без пакета DBMS_LOB, с использованием традиционного синтаксиса для строк (в том числе LIKE, SUBSTR и др.). Так, пример выше может быть переписан проще:

 

DECLARE

document   CLOB;

initext         VARCHAR2 (4000):= ‘Приказ № 1’;

BEGIN

document:= initext;

-- Продолжаем работу с документом...

--

DBMS_LOB.FREETEMPORARY (document);

END;

/

 

... или даже еще проще:

 

SET SERVEROUTPUT ON

DECLARE

document   CLOB:= ‘Приказ № 1’;

BEGIN

IF document LIKE '%№ 1%' THEN DBMS_OUTPUT.PUT_LINE ('One'); END IF;

-- Продолжаем работу с документом...

--

DBMS_LOB.FREETEMPORARY (document);

END;

/

 

В последних двух примерах обращаться к процедуре DBMS_LOB.FREETEMPORARY не обязательно (по завершении сеанса память, выделенная здесь неявно для объекта LOB, освободится автоматически), но рекомендуется: по той же причине, по которой советуют закрывать открытые в программе курсоры.

 

Еще пример:

 

CREATE DIRECTORY docdir AS 'c:\crs';

 

CREATE TABLE documents (descr VARCHAR2(60), doc BLOB);

 

DECLARE

file_loc   BFILE:= BFILENAME('DOCDIR', 'sql971.doc');

doc_loc    BLOB;

BEGIN

   INSERT INTO documents

      VALUES ('Programming Oracle with SQL', EMPTY_BLOB())

      RETURNING doc INTO doc_loc;

   DBMS_LOB. FILEOPEN (file_loc, DBMS_LOB.FILE_READONLY);

   DBMS_LOB. LOADFROMFILE

            (dest_lob => doc_loc

           ,src_bfile => file_loc

           ,amount => DBMS_LOB. GETLENGTH (file_loc));

   COMMIT;

   DBMS_LOB. FILECLOSE (file_loc);

EXCEPTION

           WHEN OTHERS THEN

                           DBMS_OUTPUT.PUT_LINE('Exception: ' || SQLERRM);

END;

/

 

Пояснение примера.

 

Системная функция BFILENAME позволяет инициализировать BFILE-переменную ссылкой на файл. Системная функция EMPTY_BLOB позволяет инициализировать поле таблицы пустым BLOB-объектом (нулевой длины).

 

Замечание. Если задача состоит только в загрузке строк, содержащих поля типа LOB, ее можно решить также с помощью программы SQL*Loader.

 

 


Поделиться с друзьями:

Опора деревянной одностоечной и способы укрепление угловых опор: Опоры ВЛ - конструкции, предназначен­ные для поддерживания проводов на необходимой высоте над землей, водой...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.02 с.