ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.04.2021
Просмотров: 1856
Скачиваний: 3

!
!
Пр
акт
ич
еск
ое
зан
ят
ие
3.
Заг
руз
ка
и
вы
гру
зка
дан
ны
х
!
21
E-
:
mar
ket
@re
lex.r
u
ЗАО
./inl –u SYSTEM/MANAGER
SQL>select * from T1;
Задача
3.
Создать
таблицу
T1
и
загрузить
ее
данные
из
файла
формата
XML.
1.
Предполагаем
,
в
файле
/home/linter/prac3/dbstore_xml/SYSTEM.lod/T1.xml
находится
описание
таблицы
T1
и
ее
данных
;
2.
Перейдем
в
каталог
bin
дистрибутива
и
подадим
команду
на
удаление
данных
из
таблицы
при
помощи
утилиты
inl:
./inl –u SYSTEM/MANAGER
SQL>drop table T1;
3.
Запустим
процесс
импорта
данных
командой
:
./loarel –u SYSTEM/MANAGER –f /home/linter/prac3/
dbstore_xml/SYSTEM.lod/T1.xml –x
(
указанная
команда
привела
к
падению
loarel
на
Linux x86_64,
на
Windows
падение
не
воспроизводится
)
При
этом
будет
создана
таблица
и
будут
импортированы
данные
.
Задача
4.
(
студенты
выполняют
самостоятельно
)
Создать
три
таблицы
,
описывающие
взаимосвязь
между
автомобилями
и
их
владельцами
(T_AUTO, T_PERSON,
T_LINK),
с
учетом
хранения
промежутков
времени
владения
человеком
данной
машиной
.
Заполнить
их
данными
.
Провести
экспорт
в
текстовые
файлы
,
поля
которых
разделены
‘#’.
Импортировать
данные
в
другие
таблицы
(T1_AUTO, T1_PERSON, T1_LINK).
3.4.
Импорт
данных
из
формата
DBF
Помимо
широкого
спектра
утилит
администрирования
,
которые
«
умеют
»
загружать
данные
в
таблицы
из
DBF-
формата
,
существует
утилита
dbf2lin,
запускаемая
из
командной
строки
.
Полный
формат
вызова
утилиты
таков
:
dbf2lin -f
имя
_
файла
_dbf
[-u
имя
_
пользователя
/
пароль
]
[-n
сервер
] [-t
имя
_
таблицы
]
[-i
имя
_
файла
_
входных
_
параметров
]
[-o
имя
_
файла
_
выходных
_
параметров
]
[-b
тип
_
данных
_
атрибута
_blob]
[-s
номер
_
уровня
_
загрузки
]
[-l] [-p] [-e] [-h] [-version]
[-k
тип
кодировки
]
[-2
имя
_
файла
_
перенаправления
_
вывода
]
[-c
количество
записей
в
одной
транзакции
]
[-d
имя
_blob_
файла
]

!
22
Пр
акт
ич
еск
ое
зан
ят
ие
3.
Заг
руз
ка
и
вы
гру
зка
дан
ны
х
!
!
E-
:
mar
ket
@re
lex.r
u
ЗАО
Задача
5.
Создать
таблицу
AUTO
и
импортировать
в
нее
данные
из
файла
/home/
linter/samples/db/dbf/auto.dbf
1.
Создадим
таблицу
AUTO (
предполагаем
,
что
СУБД
ЛИНТЕР
установлена
в
каталог
/home/linter):
inl –u SYSTEM/MANAGER –f /home/linter/samples/db/sql/auto/
cauto.sql;
2.
Запустим
процесс
импорта
:
dbf2lin –u SYSTEM/MANAGER –t AUTO –f /home/linter/samples/
db/dbf/auto.dbf
Задача
6.
(
студенты
выполняют
самостоятельно
)
Импортировать
данные
из
файла
/home/linter/samples/db/dbf/person.dbf
без
предварительного
создания
таблицы
.
3.5.
Импорт
и
экспорт
данных
при
помощи
ldba
Как
было
показано
в
таблице
(
см
. «
Обзор
средств
для
экспорта
-
импорта
данных
»),
многие
утилиты
администрирования
поддерживают
импорт
и
экспорт
данных
.
В
утилите
ldba
существует
специальное
подменю
Файл
,
в
котором
представлены
пункты
для
импорта
и
экспорта
данных
.
Задача
7.
Импортировать
данные
из
файла
:
/home/linter/prac3/dbstore_xml/SYSTEM.lod/T1.xml.
1.
Запустим
ldba:
ldba –u SYSTEM/MANAGER
2.
Через
меню
вызовем
диалог
Файл
|
Импорт
из
XML
;
3.
Выберем
файл
/home/linter/prac3/dbstore_xml/SYSTEM.lod/T1.xml;
4.
Согласимся
с
конвертированием
в
новую
таблицу
;
5.
Введем
имя
новой
таблицы
T1_1;
6.
В
появившемся
диалоге
выберем
кнопку
Выполнить
.
Задача
8.
(
студенты
выполняют
самостоятельно
)
Создать
таблицу
AUTO_PLANTS
со
столбцами
ID
типа
integer,
автоинкремент
,
первичный
ключ
;
и
NAME
типа
char(50),
уникальное
.
Импортировать
данные
из
файла
/home/linter/samples/db/dbf/auto.dbf,
занося
в
столбец
NAME
данные
из
столбца
MAKE.

Практическое
занятие
4
Создание
,
исполнение
и
отладка
хранимых
процедур
и
триггеров
Практика
2
часа
(
Лекция
4)
Целью
занятия
является
освоение
способов
создания
,
исполнения
и
отладки
хранимых
процедур
и
триггеров
.
4.1.
Основные
приемы
создания
,
исполнения
и
отладки
на
примере
хранимой
процедуры
для
генерации
значений
уникальных
ключей
При
проектировании
баз
данных
часть
в
качестве
первичного
ключа
некоторой
таблицы
используется
суррогатный
ключ
–
уникальное
числовое
значение
.
Для
генерации
значений
такого
ключа
удобно
использовать
механизм
последовательностей
(sequence).
Однако
,
в
СУБД
ЛИНТЕР
версий
младше
5.9
последовательности
не
поддерживаются
.
Другим
удобным
и
универсальным
способом
для
генерации
уникальных
значений
может
быть
использование
хранимой
процедуры
.
Хранимая
процедура
будет
обращаться
к
специальной
таблице
(
назовем
ее
SEQUENCES),
чтобы
определить
очередное
значение
.
Таблицу
SEQUENCES
можно
создать
следующим
запросом
:
create table SEQUENCES(
TAB_NAME VARCHAR(64) primary key not null,
CUR_VALUE INT not null
);
Здесь
колонка
TAB_NAME
хранит
имена
таблиц
,
для
которых
генерируются
уникальные
значения
,
а
колонка
CUR_VALUE –
текущее
значение
для
генерации
.
Соответствующая
хранимая
процедура
должна
получать
на
входе
имя
таблицы
,
а
на
выходе
выдавать
сгенерированное
значение
.
Логика
работы
процедуры
проста
:
если
запись
о
нужной
таблице
уже
есть
в
SEQUENCES,
надо
выдать
соответствующее
значение
и
увеличить
его
на
1,
если
же
записи
еще
не
было
,
надо
добавить
новую
запись
со
значением
1.
SQL-
операторы
на
создание
таблицы
SEQUENCES
и
хранимой
процедуры
GeneratePK
содержатся
в
файле
sp_seq.sql.
Процедура
создается
таким
запросом
:
create procedure GeneratePK(in tabname char(64)) result int
for debug
declare
var v cursor(value int); //
code
execute direct "lock table SEQUENCES wait;"; //
execute direct "update SEQUENCES set CUR_VALUE =
CUR_VALUE + 1 where TAB_NAME = '"+
tabname+"';"; //
if rowcount() > 0 then

!
24
Пр
акт
ич
еск
ое
зан
ят
ие
4
Со
зда
ни
е
,
ис
по
лне
ни
е
и
отл
адк
а
хра
ни
мы
х
пр
оце
дур
и
тр
игг
еро
в
!
!
E-
:
mar
ket
@re
lex.r
u
ЗАО
open v for direct "select CUR_VALUE from SEQUENCES
where TAB_NAME = '"+
tabname+"';"; //
else
execute direct "insert into SEQUENCES values
('"+tabname+"',1);"; //
v.value := 1; //
endif
execute direct "unlock table SEQUENCES;"; //
commit; //
return v.value; //
end;
Перед
созданием
процедуры
должна
быть
создана
таблица
процедур
с
использованием
dict\systab.sql.
(
замечание
:
мы
использовали
блокировку
таблицы
,
чтобы
оградить
двух
одновременно
работающих
пользователей
от
возможности
модификации
одних
и
тех
же
данных
;
надо
иметь
в
виду
,
что
работать
это
будет
только
в
режиме
обработки
транзакций
,
отличном
от
autocommit).
Обратите
внимание
,
что
в
теле
процедуры
все
операторы
,
завершающиеся
точкой
с
запятой
,
содержат
пустой
комментарий
в
конце
строки
(
символы
//).
Эта
простая
техника
позволяет
выполнять
такой
запрос
из
утилиты
inl,
которая
считает
точку
с
запятой
в
конце
строки
признаком
окончания
запроса
.
Итак
,
простым
способом
создания
хранимой
процедуры
является
подача
соответствующего
запроса
;
например
,
из
утилиты
inl.
Выполняем
команды
:
•
перейти
в
директорию
,
содержащую
файл
sp_seq.sql;
•
запускаем
inl
и
соединяемся
с
сервером
БД
;
•
исполняем
файл
: _sp_seq.
Теперь
процедура
создана
.
Запустить
ее
можем
тут
же
,
из
inl,
например
:
SQL>
Return value = 1
SQL> execute generatepk(‘TEST’);
Return value = 2
Мы
создали
процедуру
с
опцией
FOR DEBUG,
что
позволяет
нам
отлаживать
ее
исполнение
.
Для
отладки
необходимо
запустить
утилиту
spman
(
ЛИНТЕР
-
ВС
:
в
дистрибутиве
ЛИНТЕР
-
ВС
утилита
для
отладки
хранимых
процедур
и
триггеров
называется
spdebug;
отличается
она
тем
,
что
в
ней
нет
возможности
создавать
и
модифицировать
процедуры
).
По
команде
«
Открыть
процедуру…
»
в
меню
«
Файл
»
выбираем
нужную
процедуру
.
Ее
код
показывается
в
отдельном
окне
.
Теперь
можно
запустить
ее
из
-
под
отладчика

!
!
Пр
акт
ич
еск
ое
зан
ят
ие
4
Со
зда
ни
е
,
ис
по
лне
ни
е
и
отл
адк
а
хра
ни
мы
х
пр
оце
дур
и
тр
игг
еро
в
!
25
E-
:
mar
ket
@re
lex.r
u
ЗАО
(
команда
«
Отладчик
/
Пуск
»
или
клавиша
F9).
На
запрос
входных
параметров
укажем
значение
‘TEST’ (
апострофы
обязательны
для
символьных
констант
).
В
результате
процедура
запускается
и
останавливается
для
отладки
на
первой
строке
(
она
подсвечивается
).
Можно
наблюдать
значения
локальных
переменных
.
В
меню
«
Отладчик
»
перечислены
команды
для
отладки
процедур
и
соответствующие
горячие
клавиши
.
Так
,
можно
пройти
процедуру
по
шагам
,
исполнять
процедуру
до
точек
останова
,
до
конца
,
или
принудительно
завершить
процедуру
,
если
на
c
не
устраивает
текущих
ход
ее
работы
.
Кроме
локальных
переменных
,
можно
просматривать
значения
любых
приложений
и
стека
вызова
(
если
процедура
вызвана
из
другой
процедуры
).
Выполняем
команды
:
•
проходим
процедуру
по
шагам
до
конца
(
в
окне
«
Сообщения
»
отображаются
результаты
работы
);
•
заново
запускаем
процедуру
,
но
в
качестве
параметра
передаем
‘TEST1’;
проходим
процедуру
по
шагам
(
видно
,
что
исполнение
теперь
идет
по
другой
ветке
:
вставляется
новая
запись
в
таблицу
SEQUENCES).
Отлаживать
можно
также
процедуру
,
запущенную
не
только
из
-
под
отладчика
,
но
и
любой
другой
задачей
.
Для
этого
надо
включить
ожидание
запуска
процедуры
:
открыть
процедуру
в
spman,
открыть
отладочную
сессию
(
если
она
еще
не
открыта
),
и
активизировать
ожидание
(
команда
«
Ждать
процедуру
/
триггер
»).
Теперь
можно
в
другой
сессии
запустить
inl
и
подать
запрос
типа
execute.
Процедура
попадет
в
режим
отладки
,
а
inl
будет
ждать
ее
окончательного
завершения
.
4.2.
Модификация
процедуры
,
синтаксические
ошибки
Допустим
теперь
,
что
мы
хотим
,
чтобы
была
возможность
задать
приращение
для
генерируемых
нашей
процедурой
значений
.
Для
этого
надо
добавить
еще
один
входной
параметр
(
со
значением
по
умолчанию
1),
и
использовать
его
в
теле
процедуры
.
Чтобы
модифицировать
процедуру
,
надо
выполнить
запрос
alter procedure
с
полным
новым
телом
процедуры
.
Можно
сделать
соответствующий
sql-
файл
и
использовать
inl,
но
еще
удобнее
воспользоваться
spman.
Просто
отредактируем
заголовок
процедуры
в
ее
окне
:
после
tabname char(64)
в
списке
параметров
добавим
; in change int default 1
Теперь
надо
модифицировать
запрос
в
строке
7
execute direct "update SEQUENCES set CUR_VALUE = CUR_VALUE
+ 1 where TAB_NAME = '"
пытаемся
заменить
на
execute direct "update SEQUENCES set CUR_VALUE = CUR_VALUE
+ “+change+” where TAB_NAME = '"
Теперь
для
сохранения
процедуры
просто
можно
выбрать
команду
обработки
в
меню
«
Файл
»
или
нажать
клавишу
<F2>. spman
автоматически
генерирует
запрос
alter
procedure.
Однако
трансляция
процедуры
на
этот
раз
проходит
неудачно
,
и
мы
получаем
окно
со
списком
ошибок
.
Нажав
<Enter>
на
тексте
сообщения
об
ошибке
,
можно
попасть
в
то
место
,
где
была
ошибка
.
В
нашем
примере
наблюдается
ошибка
,
распространенная
для
начинающих
:
мы
попытались
конкатенировать
числовое
значение
с
символьным
.
Этого
делать
не
разрешается
,
и
мы
должны
преобразовать
числовое
значение
в
строку
при
помощи
стандартной
функции
itoa: