Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет 2 лаба.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
3.24 Mб
Скачать

Лабораторная работа №2

ОБЪЕКТНО-РЕЛЯЦИОННЫЕ РАСШИРЕНИЯ ORACLE

Программа работы

  1. Большие объекты: BLOB и CLOB

    1. Дополнить одну из таблиц атрибутами типа BLOB и CLOB;

    2. На основе кода примера создать процедуру для заполнения BLOB и CLOB полей данными из файла. На вход процедуры должно передаваться, по крайней мере, имя файла и идентификатор обновляемого объекта. См. 01_lobs.sql;

    3. Написать процедуру записи данных из поля BLOB или CLOB в файл;

  2. Пользовательские типы данных: массивы-коллекции varray (пример – 02_varray.sql)

    1. Создать тип – массив переменной длины из типа varchar2 или number (integer);

    2. Добавить в имеющуюся таблицу атрибут нового созданного типа;

    3. Проверить операции insert, update, select с атрибутом нового типа;

    4. На основе кода примера создать процедуры для выборки и изменения атрибута нового типа-массива в таблице;

  3. Работа с табличным типом:

    1. Создание типов: 04_t_org_po.tps и 05_tt_org_po.tps;

    2. Разработать процедуры по аналогии со следующими:

      1. payment_order_select

      2. payment_order_select_1

      3. payment_order_select_2

      4. payment_order_select_p

      5. payment_order_select_p1

      6. payment_order_select_p2

  4. Работа с типом XMLTYPE. Примеры -- 06_xmltype.sql. На основе примеров необходимо:

    1. Добавить поле XMLTYPE;

    2. Разработать процедуру для записи и выборки поля;

    3. Разработать процедуру, использующую XPath-выражение;

    4. Разработать процедуру для генерации XML.

Выполнение заданий

  1. Большие объекты: blob и clob

    1. Дополнение таблицы SOTRUDNIK атрибутом типа BLOB;

alter table sotrudnik add photo BLOB;

comment on column sotrudnik.photo is 'Фото';

    1. На основе кода примера создать процедуру для заполнения BLOB полей данными из файла. На вход процедуры должно передаваться, по крайней мере, имя файла и идентификатор обновляемого объекта. См. 01_lobs.sql;

grant create any directory to Pavel;

grant drop any directory to Pavel;

-- Директория для работы с LOBs

create or replace directory LOB_DIR

as 'c:\tmp';

Процедура для вставки фото сотрудника photo_insert

create or replace PROCEDURE photo_insert(

out_res out integer, -- код результата

in_id IN sotrudnik.id_sotr%type,

in_name IN varchar2

) IS

src bfile; -- объект - ссылка на внешний файл

dst blob;

BEGIN

out_res:=0; -- 0 - все нормально

IF in_id IS NULL THEN

out_res:=1;

ELSE

src := bfilename('LOB_DIR', in_name); -- инициализируем BFILE

dbms_lob.open(src); -- открываем его

dbms_lob.createtemporary(dst, true); -- новый пустой BLOB

-- чтение из BFILE в BLOB

dbms_lob.loadfromfile( dest_lob => dst,

src_lob => src,

amount => dbms_lob.getlength(src));

dbms_lob.close(src); -- BFILE закрываем

-- обновляем запись в таблице films, заполняем поле logo

update sotrudnik set

photo = dst

where id_sotr = in_id;

if sql%rowcount = 0 then

-- если ни одной записи не обновлено

out_res:=2; -- некий код ошибки "неверный идентификатор"

commit;

end if;

end if;

END;

Выполнение процедуры и её результат приведены на рисунках ниже:

  1. Пользовательские типы данных: массивы-коллекции varray (пример – 02_varray.sql)

    1. Создать тип – массив переменной длины из типа varchar2 или number (integer).

-- Создание типа - массива переменной длины

-- максимальной длины в 100 элементов типа varchar2(10)

create or replace type t_varchar_array is varray(100) of varchar2(20);

    1. Добавить в имеющуюся таблицу атрибут нового созданного типа;

-- В таблице sotrudnik новое поле этого типа

alter table sotrudnik add pas_dan t_varchar_array;

    1. Проверить операции insert, update, select с атрибутом нового типа;

-- Пример запроса обновления

update sotrudnik set pas_dan = t_varchar_array('6045','123342') where id_sotr = 5;

commit;

-- Пример запроса выборки

select pas_dan from sotrudnik where id_sotr = 5;

-- Выборка с разворачиванием коллекции в набор данных

select * from table (

select pas_dan from sotrudnik where id_sotr = 5);

-- Пример добавления элемента в имеющийся массив

declare

l_sotr t_varchar_array; -- Локальная переменная массив

begin

-- выборка сохраненного ранее значения

select pas_dan into l_sotr from sotrudnik where id_sotr=5;

dbms_output.put_line(l_sotr.count);

-- увеличение массива на 1 элемент

l_sotr.extend(1);

dbms_output.put_line(l_sotr.count);

-- присвоение последнему элементу нового значения

l_sotr(l_sotr.count) := '542725';

-- обновление записи

update sotrudnik set pas_dan = l_sotr where id_sotr = 5;

commit;

end;