ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.04.2021

Просмотров: 1856

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

!

!

Пр

акт

ич

еск

ое

зан

ят
ие

3. 

Заг

руз

ка

и

вы

гру

зка

дан

ны

х

!

21

 
 

E-

mail

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_

файла


background image

!

22

Пр

акт

ич

еск

ое

зан

ят
ие

3. 

Заг

руз

ка

и

вы

гру

зка

дан

ны

х

!

!

 
 

E-

mail

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.


background image

Практическое

занятие

 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


background image

!

24

Пр

акт

ич

еск

ое

зан

ят
ие

4

Со

зда

ни

е

ис

по

лне

ни

е

и

отл

адк

а

хра

ни

мы

х

пр

оце

дур

и

тр

игг
еро

в

!

!

 
 

E-

mail

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; 

отличается

она

тем

что

в

ней

нет

возможности

создавать

и

модифицировать

процедуры

). 

По

команде

  «

Открыть

процедуру…

» 

в

меню

  «

Файл

» 

выбираем

нужную

процедуру

Ее

код

показывается

в

отдельном

окне

Теперь

можно

запустить

ее

из

-

под

отладчика


background image

!

!

Пр

акт

ич

еск

ое

зан

ят
ие

4

Со

зда

ни

е

ис

по

лне

ни

е

и

отл

адк

а

хра

ни

мы

х

пр

оце

дур

и

тр

игг
еро

в

!

25

 
 

E-

mail

mar

ket

@re

lex.r

u

ЗАО

(

команда

  «

Отладчик

/

Пуск

» 

или

клавиша

  F9). 

На

запрос

входных

параметров

укажем

значение

  ‘TEST’  (

апострофы

обязательны

для

символьных

констант

). 

В

результате

процедура

запускается

и

останавливается

для

отладки

на

первой

строке

  (

она

подсвечивается

). 

Можно

наблюдать

значения

локальных

переменных

.  

В

меню

  «

Отладчик

» 

перечислены

команды

для

отладки

процедур

и

соответствующие

горячие

клавиши

Так

можно

пройти

процедуру

по

шагам

исполнять

процедуру

до

точек

останова

до

конца

или

принудительно

завершить

процедуру

если

на

не

устраивает

текущих

ход

ее

работы

Кроме

локальных

переменных

можно

просматривать

значения

любых

приложений

и

стека

вызова

  (

если

процедура

вызвана

из

другой

процедуры

).

Выполняем

команды

проходим

процедуру

по

шагам

до

конца

  (

в

окне

  «

Сообщения

» 

отображаются

результаты

работы

); 

заново

запускаем

процедуру

но

в

качестве

параметра

передаем

  ‘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: