Главная страница

Проектирование. 380305БИ_Проектирование баз данных_лабораторные_ПоповВБ.docx. Лабораторная работа 1. Интерфейс субд mysql. Предоставление доступа и привилегий. Утилиты, входящие в состав субд цель работы


Скачать 1.15 Mb.
НазваниеЛабораторная работа 1. Интерфейс субд mysql. Предоставление доступа и привилегий. Утилиты, входящие в состав субд цель работы
АнкорПроектирование
Дата11.12.2022
Размер1.15 Mb.
Формат файлаdocx
Имя файла380305БИ_Проектирование баз данных_лабораторные_ПоповВБ.docx.docx
ТипЛабораторная работа
#839179
страница11 из 14
1   ...   6   7   8   9   10   11   12   13   14

Создание процедур и функций
CREATE

[DEFINER = { user | CURRENT_USER }]

PROCEDURE sp_name ([proc_parameter[,...]])

[characteristic ...] routine_body
CREATE

[DEFINER = { user | CURRENT_USER }]

FUNCTION sp_name ([func_parameter[,...]])

RETURNS type

[characteristic ...] routine_body

proc_parameter:

[ IN | OUT | INOUT ] param_name type

func_parameter:

param_name type
type:

Any valid MySQL data type
characteristic:

LANGUAGE SQL

| [NOT] DETERMINISTIC

| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

| SQL SECURITY { DEFINER | INVOKER }

| COMMENT 'string'
routine_body:
Внесение изменений
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
characteristic:

{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }

| SQL SECURITY { DEFINER | INVOKER }

| COMMENT 'string'


Удаление процедур и функций

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name


Вызов процедур и функций
CALL sp_name([parameter[,...]])

CALL sp_name[()]

Оператор CALL позволяет вызвать ранее определенную процедуру.

Пример1
CREATE PROCEDURE p1 (OUT ver_param VARCHAR(25), INOUT incr_param INT)

BEGIN

# Set value of OUT parameter

SELECT VERSION() INTO ver_param;

# Increment value of INOUT parameter

SET incr_param = incr_param + 1;

END;

Перед вызовом процедуры инициализируйте переменную указанные в параметрах INOUT . После вызова процедуры значения будут установлены или изменены.

mysql> SET @increment = 10;

mysql> CALL p(@version, @increment);

mysql> SELECT @version, @increment;

+-----------------+------------+

| @version | @increment |

+-----------------+------------+

| 5.1.12-beta-log | 11 |
Пример2
CREATE PROCEDURE `p2`(IN param1 CHAR(2) )

NOT DETERMINISTIC

SQL SECURITY DEFINER

COMMENT ''

BEGIN

select * from s where snum=param1;

END;
Вызов процедуры

call p2 ('S1')
Пример3
CREATE PROCEDURE `My_proc2`(IN param1 CHAR(2) )
BEGIN /* start of block */

DECLARE variable1 CHAR(10); /* variables */

IF param1 = 17 THEN /* start of IF */

SET variable1 = 'birds'; /* assignment */

ELSE

SET variable1 = 'beasts'; /* assignment */

END IF; /* end of IF */

select variable1; /* statement */

END

Вызов процедуры

call p3 (10)
Триггеры
Три́ггер (англ. trigger) — это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено наступлением определенного события (действием) — по сути добавлением INSERT или удалением DELETE строки в заданной таблице, или модификаци UPDATE данных в определенном столбце заданной таблицы реляционной базы данных. Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции. Момент запуска триггера определяется с помощью ключевых слов BEFORE (триггер запускается до выполнения связанного с ним события; например, до добавления записи) или AFTER (после события). В случае, если триггер вызывается до события, он может внести изменения в модифицируемую событием запись (конечно, при условии, что событие — не удаление записи). Некоторые СУБД накладывают ограничения на операторы, которые могут быть использованы в триггере (например, может быть запрещено вносить изменения в таблицу, на которой «висит» триггер, и т. п.)

Кроме того, триггеры могут быть привязаны не к таблице, а к представлению (VIEW). В этом случае с их помощью реализуется механизм «обновляемого представления». В этом случае ключевые слова BEFORE и AFTER влияют лишь на последовательность вызова триггеров, так как собственно событие (удаление, вставка или обновление) не происходит.

CREATE

[DEFINER = { user | CURRENT_USER }]

TRIGGER trigger_name trigger_time trigger_event

ON tbl_name FOR EACH ROW trigger_stmt
Пример создания и работы триггера:

CREATE TABLE t22 (s1 INTEGER)

 

CREATE TRIGGER t22_bi

BEFORE INSERT ON t22

FOR EACH ROW

BEGIN

SET @x = ‘Trigger was activated!’;

SETNEW.s1 = 55;

END;

После этого при выполнении запросов получим:

mysql> INSERT INTO t22 VALUES (1)

mysql> SELECT @x, t22.* FROM t22 // вызывается триггер

+------------------------+------+

| @x                     | s1   |

+------------------------+------+

| Trigger was activated! | 55   |

+------------------------+------+

1 row in set (0.00 sec)

Словарь данных

Иметь доступ к значениям метаданных – совершенно необходимое требование к современной СУБД. Ранее такая возможность в MySQL достигалась различными SHOW-командами, но такой подход имеет очевидные недостатки. Эти команды нельзя использовать в простых запросах с соединениями, и, что существенно, они не соответствовали стандартам, будучи специфичными для MySQL.

В новой версии СУБД появилась новая служебная база данных – INFORMATION_SCHEMA. Её наличие продиктовано тем же стандартом SQL:2003, и именно она решает задачу реализации словаря данных (data dictionary). INFORMATION_SCHEMA содержит таблицы, описывающие состояние и параметры сервера, в том числе определения и сущности таблиц. Это виртуальная база данных – физически (в виде файлов на диске) она не существует, вся информация динамически предоставляется сервером. Пример использования этой таблицы:

mysql> SELECT table_name, table_type, engine

    -> FROM INFORMATION_SCHEMA.tables

    -> WHERE table_schema = ‘tp’

    -> ORDER BY table_type ASC, table_name DESC;

+------------+------------+--------+

| table_name | table_type | engine |

+------------+------------+--------+

| t2         | BASE TABLE | MyISAM |

| t1         | BASE TABLE | InnoDB |

| v1         | VIEW       | NULL   |

+------------+------------+--------+

Другой пример работы со словарём данных – просмотр привелегий:

mysql> SELECT * FROM

    -> INFORMATION_SCHEMA.COLUMN_PRIVILEGES\G

************************ 1. row ************************

GRANTEE: 'peter'@'%'

TABLE_CATALOG: NULL

TABLE_SCHEMA: tp

TABLE_NAME: t1

COLUMN_NAME: col1

PRIVILEGE_TYPE: UPDATE

IS_GRANTABLE: NO

************************ 2. row ************************

GRANTEE: 'trudy'@'%'

TABLE_CATALOG: NULL

TABLE_SCHEMA: tp

TABLE_NAME: t2

COLUMN_NAME: col1

PRIVILEGE_TYPE: SELECT

IS_GRANTABLE: YES


Объявление переменных
Объявление. DECLARE Local Variables
Следующая команда позволяет объявлять локальные переменные, содержит возможность задания значения по умолчанию. Переменная может быть объявлена как выражения, не обязательна константа. Если значение по умолчанию не определено то равно NULL.

DECLARE var_name[,...] type [DEFAULT value]


Присваивание Variable SET Statement
SET var_name = expr [, var_name = expr] ...


SELECT ... INTO Statement

Оператор SELECT может перенаправить результат в переменные. Таким образом может быть преобразована только одна строка.

ПРИМЕР
SELECT col_name[,...] INTO var_name[,...] table_expr

SELECT id,data INTO x,y FROM test.t1 LIMIT 1;

Условия и ограничения


Объявление условий


DECLARE condition_name CONDITION FOR condition_value
condition_value:

SQLSTATE [VALUE] sqlstate_value

| mysql_error_code


Объявление ограничений


DECLARE handler_type HANDLER FOR condition_value[,...] statement
handler_type:

CONTINUE

| EXIT

| UNDO
condition_value:

SQLSTATE [VALUE] sqlstate_value

| condition_name

| SQLWARNING

| NOT FOUND

| SQLEXCEPTION

| mysql_error_code


Пример
mysql> CREATE TABLE test.t (s1 int,primary key (s1));

Query OK, 0 rows affected (0.00 sec)
mysql> delimiter //
mysql> CREATE PROCEDURE handlerdemo ()

-> BEGIN

-> DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET @x2 = 1;

-> SET @x = 1;

-> INSERT INTO test.t VALUES (1);

-> SET @x = 2;

-> INSERT INTO test.t VALUES (1);

-> SET @x = 3;

-> END;

-> //

Query OK, 0 rows affected (0.00 sec)
mysql> CALL handlerdemo()//

Query OK, 0 rows affected (0.00 sec)
mysql> SELECT @x//

+------+

| @x |

+------+

| 3 |

+------+

1 row in set (0.00 sec)

Если вы хотите игнорировать условие вы должны сгенерировать ограничение и ассоциировать его с пустым блоком .

DECLARE CONTINUE HANDLER FOR SQLWARNING BEGIN END;
Пример
CREATE PROCEDURE p ()

BEGIN

DECLARE i INT DEFAULT 3;

retry:

REPEAT

BEGIN

DECLARE CONTINUE HANDLER FOR SQLWARNING

BEGIN

ITERATE retry; # illegal

END;

END;

IF i < 0 THEN

LEAVE retry; # legal

END IF;

SET i = i - 1;

UNTIL FALSE END REPEAT;

END;

Курсоры

Курсор — в некоторых реализациях языка программирования SQL (Oracle, Microsoft SQL Server) — получаемый при выполнении запроса результирующий набор и связанный с ним указатель текущей записи.

Курсор может возвращать одну строку, несколько строк или ни одной строки. Для запросов, возвращающих более одной строки, можно использовать только явный курсор. Для повторного создания результирующего набора для других значений параметров курсор следует закрыть, а затем повторно открыть.

Курсор может быть объявлен в секциях объявлений любого блока PL/SQL, подпрограммы или пакета.

Операторы управления явным курсором

  • Оператор CURSOR выполняет объявление явного курсора.

  • Оператор OPEN открывает курсор, создавая новый результирующий набор на базе указанного запроса.

  • Оператор FETCH выполняет последовательное извлечение строк из результирующего набора от начала до конца.

  • Оператор CLOSE закрывает курсор и освобождает занимаемые им ресурсы

Курсоры поддерживают хранимые процедуры и функции. Сейчас курсоры имеют три свойства:

  • Asensitive: The server may or may not make a copy of its result table

  • Read only: Not updatable

  • Non-scrollable: Can be traversed only in one direction and cannot skip rows

Курсоры должны быть объявлены перед объявлением ограничений. Переменные и условия должны быть объявлены перед курсором.

Объявление курсоров

Оператор объявления курсора. М программе можно объявлять несколько курсоров, каждый курсор в блоке должен иметь уникальное имя.
DECLARE cursor_name CURSOR FOR select_statement


Условие открытия  Cursor OPEN Statement

Оператор открывает ранее объявленный курсор.
OPEN cursor_name
Выполнение курсора  Cursor FETCH Statement

FETCH cursor_name INTO var_name [, var_name] ...


Условия закрытия  Cursor CLOSE Statement
CLOSE cursor_name
Пример
CREATE PROCEDURE curdemo()

BEGIN

DECLARE done INT DEFAULT 0;

DECLARE a CHAR(16);

DECLARE b,c INT;

DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;

DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;

OPEN cur2;
REPEAT

FETCH cur1 INTO a, b;

FETCH cur2 INTO c;

IF NOT done THEN

IF b < c THEN

INSERT INTO test.t3 VALUES (a,b);

ELSE

INSERT INTO test.t3 VALUES (a,c);

END IF;

END IF;

UNTIL done END REPEAT;
CLOSE cur1;

CLOSE cur2;

END

Задание

Представления

  1. Составить представление, возвращающее объем поставок деталей для изделий за заданный календарный месяц

  2. Добавить столбец стоимость детали в таблицу SPJ. Создать соответствующее представление (наименование поставщика, наименование детали, наименование изделия, стоимость детали, количество, стоимость поставки.

  3. Добавить столбец стоимость детали в таблицу P. Создать представление отражающее стоимость поставки.

Процедуры

  1. Составить процедуру, отражающую состав изделия (детали изделия).

  2. Составить процедуру, возвращающую расчетную стоимость изделия, учитывая, что для изделия требуется K деталей каждого требуемого наименования (см. табл 1).

  3. Составить процедуру, отражающую вес изделия (п4) учитывая что для изделия требуется K деталей каждого требуемого наименования (см. табл 1).

  4. С помощью условных операторов разделить всех поставщиков на три категории по количеству поставляемых деталей (ABC анализ) 20 40 60 %

  5. Тоже, но по стоимости поставки

  6. Определить оптимального поставщика для изделия (см табл 1) для производства максимального количества изделий за период

  7. Определить оптимального поставщика для изделия (см табл 1) для производства максимального количества изделий по минимальной стоимости

  8. При условии, что поставщик может поставлять не более одной поставки в неделю, а максимальное количество деталей в поставке не выше среднего за период

Функции

  1. С помощью функций получить таблицу, отражающую информацию о перечне изделий, для которого выполняется поставка

    S1

    J1 J2 J4

    S2

    J5

  2. Тоже, но с наименованиями изделий.

  3. С помощью функций получить таблицу, отражающую информацию о перечне деталей из которых состоит дневная поставка

  4. Тоже, но с наименованиями деталей

  5. Получить наименование поставщика поставляемого самое большое количество деталей

  6. Получить наименование поставщика поставляемого самое большое количество деталей, для какого либо изделия

Работа с текстовым файлом


  1. Создать текстовый файл, содержащий информацию о поставщике, поставившего за последний месяц деталей на большую сумму и меньшего веса.

Курсоры

  1. При заполнении поставки поле дата всегда заполнять текущей датой.


Таблица 11 -Варианты

задание

Вар 1

Вар 2

Вар 3

Вар 4

Вар 5

1,9,10

J1

J2

J3

J4

J5

ЯНВАРЬ

ФЕФРАЛЬ

МАРТ

АПРЕЛЬ

МАЙ

5,6

15

20

25

30

35

18

Max;Min

>AVG;Min

MIN;>AVG

>AVG;>AVG

Max;Max

1   ...   6   7   8   9   10   11   12   13   14


написать администратору сайта