Смекни!
smekni.com

Методические указания рассмотрены и рекомендованы к изданию методическим семинаром кафедры автоматики и компьютерных систем «29» (стр. 12 из 16)

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

Курсор может быть объявлен в секциях объявлений любого блока 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. Создать текстовый файл, содержащий информацию о поставщике, поставившего за последний месяц деталей на большую сумму и меньшего веса.

Курсоры

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

Таблица 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

ПРИЛОЖЕНИЕ

Синтаксис оператора CREATE TABLE

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)][table_options] [select_statement] create_definition: col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT] [PRIMARY KEY] [reference_definition] или PRIMARY KEY (index_col_name,...) или KEY [index_name] (index_col_name,...) или INDEX [index_name] (index_col_name,...) или UNIQUE [INDEX] [index_name] (index_col_name,...) или FULLTEXT [INDEX] [index_name] (index_col_name,...) или [CONSTRAINT symbol] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] или CHECK (expr)type: TINYINT[(length)] [UNSIGNED] [ZEROFILL] или SMALLINT[(length)] [UNSIGNED] [ZEROFILL] или MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] или INT[(length)] [UNSIGNED] [ZEROFILL] или INTEGER[(length)] [UNSIGNED] [ZEROFILL] или BIGINT[(length)] [UNSIGNED] [ZEROFILL] или REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] или DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] или FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] или DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] или NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] или CHAR(length) [BINARY] или VARCHAR(length) [BINARY] или DATE или TIME или TIMESTAMP или DATETIME или TINYBLOB или BLOB или MEDIUMBLOB или LONGBLOB или TINYTEXT или TEXT или MEDIUMTEXT или LONGTEXT или ENUM(value1,value2,value3,...) или SET(value1,value2,value3,...)index_col_name: col_name [(length)] reference_definition: REFERENCES tbl_name [(index_col_name,...)] [MATCH FULL | MATCH PARTIAL] [ON DELETE reference_option] [ON UPDATE reference_option]reference_option: RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULTtable_options: TYPE = {BDB | HEAP | ISAM | InnoDB | MERGE | MRG_MYISAM | MYISAM }

Оператор CREATE TABLE создает таблицу с заданным именем в текущей базе данных.

Для всех имен баз данных, таблиц, столбцов, индексов и псевдонимов в MySQL приняты одни и те же правила.

Следует отметить, что эти правила были изменены, начиная с версии MySQL 3.23.6, когда было разрешено брать в одиночные скобки (') идентификаторы (имена баз данных, таблиц и столбцов). Двойные скобки (") тоже допустимы - при работе в режиме ANSI SQL.

Идентификатор Макс. длина строки Допускаемые символы
База данных 64 Любой символ, допустимый в имени каталога, за исключением (/) или (.)
Таблица 64 Любой символ, допустимый в имени файла, за исключением (/) или (.)
Столбец 64 Все символы
Псевдоним 255 Все символы

Если нет активной текущей базы данных или указанная таблица уже существует, то возникает ошибка выполнения команды.

В версии MySQL 3.22 и более поздних имя таблицы может быть указано как db_name.tbl_name. Эта форма записи работает независимо от того, является ли указанная база данных текущей.

В версии MySQL 3.23 при создании таблицы можно использовать ключевое слово TEMPORARY. Временная таблица автоматически удаляется по завершении соединения, а ее имя действительно только в течение данного соединения. Это означает, что в двух разных соединениях могут использоваться временные таблицы с одинаковыми именами без конфликта друг с другом или с существующей таблицей с тем же именем (существующая таблица скрыта, пока не удалена временная таблица). В версии MySQL 4.0.2 для создания временных таблиц необходимо иметь привилегии CREATE TEMPORARY TABLES.

В версии MySQL 3.23 и более поздних можно использовать ключевые слова IF NOT EXISTS для того, чтобы не возникала ошибка, если указанная таблица уже существует. Следует учитывать, что при этом не проверяется идентичность структур этих таблиц.

Каждая таблица tbl_name представлена определенными файлами в директории базы данных. В случае таблиц типа MyISAM - это следующие файлы:

Файл Назначение
tbl_name.frm Файл определения таблицы
tbl_name.MYD Файл данных
tbl_name.MYI Файл индексов

Чтобы получить более полную информацию о свойствах различных типов столбцов, см. документацию к СУБД.

Если не указывается ни NULL, ни NOT NULL, то столбец интерпретируется так, как будто указано NULL.

Целочисленный столбец может иметь дополнительный атрибут AUTO_INCREMENT. При записи величины NULL (рекомендуется) или 0 в столбец AUTO_INCREMENT данный столбец устанавливается в значение value+1, где value представляет собой наибольшее для этого столбца значение в таблице на момент записи. Последовательность AUTO_INCREMENT начинается с 1. Если удалить строку, содержащую максимальную величину для столбца AUTO_INCREMENT, то в таблицах типа ISAM или BDB эта величина будет восстановлена, а в таблицах типа MyISAM или InnoDB - нет. Если удалить все строки в таблице командой DELETE FROM table_name (без выражения WHERE) в режиме AUTOCOMMIT, то для таблиц всех типов последовательность начнется заново.

Примечание: в таблице может быть только один столбец AUTO_INCREMENT, и он должен быть индексирован. Кроме того, версия MySQL 3.23 будет правильно работать только с положительными величинами столбца AUTO_INCREMENT. В случае внесения отрицательного числа оно интерпретируется как очень большое положительное число. Это делается, чтобы избежать проблем с точностью, когда числа ''заворачиваются'' от положительного к отрицательному и, кроме того, для гарантии, что по ошибке не будет получен столбец AUTO_INCREMENT со значением 0.

Величины NULL для столбца типа TIMESTAMP обрабатываются иначе, чем для столбцов других типов. В столбце TIMESTAMP нельзя хранить литерал NULL; при установке данного столбца в NULL он будет установлен в текущее значение даты и времени. Поскольку столбцы TIMESTAMP ведут себя подобным образом, то атрибуты NULL и NOT NULL неприменимы в обычном режиме и игнорируются при их задании. С другой стороны, чтобы облегчить клиентам MySQL использование столбцов TIMESTAMP, сервер сообщает, что таким столбцам могут быть назначены величины NULL (что соответствует действительности), хотя реально TIMESTAMP никогда не будет содержать величины NULL. Это можно увидеть, применив DESCRIBE tbl_name для получения описания данной таблицы. Следует учитывать, что установка столбца TIMESTAMP в 0 не равнозначна установке его в NULL, поскольку 0 для TIMESTAMP является допустимой величиной.