
- •Лабораторная работа №2
- •Выполнение заданий
- •Большие объекты: blob и clob
- •На основе кода примера создать процедуры для выборки и изменения атрибута нового типа-массива в таблице;
- •Работа с табличным типом:
- •Создание типов: 04_t_org_po.Tps и 05_tt_org_po.Tps;
- •Разработать процедуры по аналогии со следующими:
- •Работа с типом xmltype. Примеры -- 06_xmltype.Sql. На основе примеров необходимо:
- •Добавить поле xmltype;
- •Разработать процедуру для записи и выборки поля;
- •Разработать процедуру, использующую xPath-выражение;
- •Разработать процедуру для генерации xml.
Лабораторная работа №2
ОБЪЕКТНО-РЕЛЯЦИОННЫЕ РАСШИРЕНИЯ ORACLE
Программа работы
Большие объекты: BLOB и CLOB
Дополнить одну из таблиц атрибутами типа BLOB и CLOB;
На основе кода примера создать процедуру для заполнения BLOB и CLOB полей данными из файла. На вход процедуры должно передаваться, по крайней мере, имя файла и идентификатор обновляемого объекта. См. 01_lobs.sql;
Написать процедуру записи данных из поля BLOB или CLOB в файл;
Пользовательские типы данных: массивы-коллекции varray (пример – 02_varray.sql)
Создать тип – массив переменной длины из типа varchar2 или number (integer);
Добавить в имеющуюся таблицу атрибут нового созданного типа;
Проверить операции insert, update, select с атрибутом нового типа;
На основе кода примера создать процедуры для выборки и изменения атрибута нового типа-массива в таблице;
Работа с табличным типом:
Создание типов: 04_t_org_po.tps и 05_tt_org_po.tps;
Разработать процедуры по аналогии со следующими:
payment_order_select
payment_order_select_1
payment_order_select_2
payment_order_select_p
payment_order_select_p1
payment_order_select_p2
Работа с типом XMLTYPE. Примеры -- 06_xmltype.sql. На основе примеров необходимо:
Добавить поле XMLTYPE;
Разработать процедуру для записи и выборки поля;
Разработать процедуру, использующую XPath-выражение;
Разработать процедуру для генерации XML.
Выполнение заданий
Большие объекты: blob и clob
Дополнение таблицы SOTRUDNIK атрибутом типа BLOB;
alter table sotrudnik add photo BLOB;
comment on column sotrudnik.photo is 'Фото';
На основе кода примера создать процедуру для заполнения 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;
Выполнение процедуры и её результат приведены на рисунках ниже:
Пользовательские типы данных: массивы-коллекции varray (пример – 02_varray.sql)
Создать тип – массив переменной длины из типа varchar2 или number (integer).
-- Создание типа - массива переменной длины
-- максимальной длины в 100 элементов типа varchar2(10)
create or replace type t_varchar_array is varray(100) of varchar2(20);
Добавить в имеющуюся таблицу атрибут нового созданного типа;
-- В таблице sotrudnik новое поле этого типа
alter table sotrudnik add pas_dan t_varchar_array;
Проверить операции 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;