Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМК по СРОД-10-12.doc
Скачиваний:
10
Добавлен:
13.11.2018
Размер:
2.55 Mб
Скачать

3.7. Блокировки в Visual FoxPro

В Visual FoxPro можно устанавливать блокировки на всю таблицу или на отдельные записи таблицы.

Существуют: 1. Полная блокировка 2. Блокировка изменений

Для установки полной блокировки используется команда

SET EXCLUSIVE ON/OFF

Для установки блокировки изменений таблицы используется функция FLOCK – блокировка таблицы

Разрешается чтение посторонним клиентам LOCK (RLOCK) – блокировка записи

Пример 3.8:         SET EXCLUSIVE ON         SELECT 0         USE SORT         DO WHILE .T.             If FLOCK (“SOTR”)                 * вызов процедуры                 DO PROC                 * снимаем блокировку             UNLOCK IN SOTR                 EXIT             ELSE                 @ 10,10, SAY “Устанавливается блокировка, подождите”             ENDIF         ENDDO

Вопросы

  1. Транзакция, это - ?

  2. Какие действия совершает транзакция по отношению к БД?

  3. Что происходит с системой в случае аварийного завершения транзакции?

  4. Какие операторы сигнализируют об успешном и неудачном завершении транзакции?

  5. Назовите основные свойства транзакции.

  6. Что означает термин параллелизм в среде СУБД?

  7. Какие существуют проблемы параллельных процессов?

  8. Причина потери результатов обновления элементов БД?

  9. Из-за чего возникают “грязные данные”?

  10. Какие конфликты возникают при параллельной работе транзакций?

  11. Назовите графики запуска транзакций.

  12. Какой график транзакций называется сериализуемым?

  13. Назовите способы разрешения конкуренций между транзакциями.

  14. Проблемы блокировок транзакций?

  15. Назовите способы предотвращения «тупиков».

  16. Какова формальная модель транзакций?

  17. Как осуществляется проверка сериализуемости транзакций?

  18. Протокол, гарантирующий сериализуемость?

  19. Представьте матрицу совместимости транзакций при использовании блокировок для чтения и записи.

4. Структурированный язык запросов sql

(Structure Query Language)

Первый международный стандарт языка SQL был принят в 1989г. Его назвали SQL/89 или SQL1, стандарт ANSI/ISO. В 1992г. был принят новый международный стандарт SQL/92 или SQL2. В 1999г. появился новый стандарт SQL3. Если SQL1 и SQL2 отличались количественно, то SQL3 отличается качественно. В __ введены новые типы данных, появилась возможность задания сложных структурированных типов данных и т.д. Язык SQL представляет собой наиболее распространенный язык управления базами данных типа клиент/сервер. SQL является языком реляционных баз данных, а не языком системного программирования. SQL - это язык, ориентированный на работу с массивами данных. Надо иметь в виду, что SQL является непроцедурным языком. Таким образом, SQL не включает ни средств управления выполнением программ (ветвлений и циклов), ни средств, для создания форм или отчетов. Однако в некоторые версии SQL, например, в Transact-SQL, используемый в Microsoft SQL Server, добавлены два оператора (IF ELSE и WHILE).

4.1. Основные операторы

Операторы определения данных:

CREATE TABLE – создать таблицу DROP TABLE – удалить таблицу ALTER TABLE изменить таблицу CREATE VIEW – создать представление DROP VIEW– удалить представление

CREATE INDEX– создать индех

DROP INDEX – удалить индех

Операторы манипулирования данными: INSERT – вставить запись DELETE – удалить запись UPDATE – изменить запись SELECT – выбрать запись Язык запросов:

SELECT

Управление транзакцией: COMMIT – удачное завершение транзакции ROLLBACK – откат транзакции SAVE POINT – сохранить контрольную точку

Программный SQL: DECLARE – объявить курсор OPEN – открыть курсор FETCH – передать поля записи в переменные CLOSE – закрыть курсор PREPARE - подготовить EXECUTE - выполнить

4.2. Синтаксис оператора SELECT

SELECT [ALL | DISTINCT]     [Alias.] Select_Item [AS Column_Name]     [, [Alias.] Select_Item [AS Column_Name] ...] FROM [DatabaseName!]Table [Local_Alias]     [, [DatabaseName!]Table [Local_Alias] ...] [[INTO Destination]     | [TO FILE FileName [ADDITIVE] | TO PRINTER [PROMPT] | TO SCREEN]] [PREFERENCE PreferenceName] [NOCONSOLE] [PLAIN] [NOWAIT] [WHERE JoinCondition [AND JoinCondition ...]     [AND | OR FilterCondition [AND | OR FilterCondition ...]]] [GROUP BY GroupColumn [, GroupColumn ...]] [HAVING FilterCondition] [UNION [ALL] SELECTCommand] [ORDER BY Order_Item [ASC | DESC] [, Order_Item [ASC | DESC] ...]] Проще

SELECT [ALL/DISTINCT](<Список полей>/*)

From <Список таблиц>

[WHERE <Предикат>]

[GROUP BY <Список полей результата>]

[HAVING <Предикат-условие для группы>]

[ORDER BY <Список полей, по которым упорядочивают вывод>]

4.3. Примеры запросов на языке SQL

Даны три отношения: Студенты, Дисциплины и Успеваемость с атрибутами NS-номер студента, FIO-ФИО, GR-группа, SPEC-специальность, ND-номер дисциплины, NAMED-наименование дисциплины, OC-оценка

STUD(NS, FIO, GR, SPEC)

DISC(ND, NAMED, GR)

SD(NS, ND, OC)

Простые запросы.

  1. SELECT *

FROM STUD

ORDER BY FIO

  1. SELECT NS, FIO

FROM STUD

WHERE GR=4305

  1. Выборка с использованием оператора AND

SELECT NS, FIO

FROM STUD

WHERE GR=4305 AND FIO=”Иванов”

  1. Выборка учебных групп без повторений SELECT DISTINCT GR

FROM DISCP

5. SELECT *

FROM STUD

WHERE FIO LIKE “%ОВ%”

6. Объединение таблиц

SELECT STUD.FIO, STUD.GR, DISC.NAMED

FROM STUD, DISC

WHERE STUD.GR=DISC.GR

7. Выдать дисциплины, которые изучаются в указанных группах

SELECT NAMED

FROM DISC

WHERE GR IN(“4301”,”4506”)

8. Использование оператора BETWEEN

Выдать список студентов с номерами от 101 до 140

SELECT NS, FIO

FROM STUD

WHERE NS BETWEEN 101 AND 140

9. Вложенные запросы

Выдать список студентов имеющих двойки

SELECT DISTINCT FIO, GR

FROM STUD

WHERE NS IN

(SELECT NS

FROM SD

WHERE OC=2)

10. Выдать список студентов, не явившихся на экзамен

SELECT DISTINCT FIO, GR

FROM STUD

WHERE NS IN

(SELECT NS

FROM SD

WHERE OC IS NULL)

11. Выдать список студентов, получивших 5 по Базам данных

SELECT FIO

FROM STUD

WHERE NS IN

(SELECT NS

FROM SD

WHERE OC=5.AND.ND IN

(SELECT ND

FROM DISC

WHERE NAMED=”Базы данных”))

Агрегатные функции

COUNT, SUM, AVG, MIN, MAX

12. Подсчитать количество различных дисциплин

SELECT NAMED, COUNT(*)

FROM DISC

GROUP BY DISC.ND

13. Подсчитать количество студентов, сдавших экзамены по дисциплинам

SELECT NAMED, COUNT(*)

FROM DISC

WHERE ND IN

(SELECT ND

FROM SD

WHERE SD.OC IS NOT NULL

GROUP BY SD.ND)

14. Получить суммарное значение стипендий по группам

SELECT GR, SUM(STIP)

FROM STUD

GROUP BY GR

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

INSERT-вставить, UPDATE-изменить, DELETE-удалить

INSERT

INTO имя_табл.[<список полей>]

VALUES (<список значений>)

15. INSERT

INTO STUD(NS, FIO, GR)

VALUES(201, “Котов”, 4405)

DELETE

FROM имя_табл.

[WHERE <условие>]

16. DELETE FROM STUD

WHERE FIO=”Котов”

17. Исключить неуспевающих студентов, имеющих по 2 и более двоек

DELETE FROM STUD

WHERE NS IN

(SELECT NS

FROM SD

WHERE OC=2.OR.IS NULL

GROUP BY NS

HAVING COUNT(*)>=2)

UPDATE имя_табл.

SET имя_поля=новое значение

[WHERE условие отбора]

18. UPDATE STUD

SET GR=4407

WHERE GR=4307

Объединение результатов запроса с помощью предложения UNION

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

SELECT поле_1, … , поле_n

FROM таблица_1, …, таблица_n

WHERE предикат

[GROOP BY …]

[HAVING …]

UNION

SELECT поле_1, … , поле_n

FROM таблица_1, …, таблица_n

WHERE предикат

[GROOP BY …]

[HAVING …]

[ORDER BY …]

Пусть имеются два отношения

Книги(ИдКн, Название, Стр, Цена, КолИзд, Серия, ИдАв)

Авторы(ИдАв, Имя)

Где ИдКн, ИдАв – идентификаторы книги и автора, Стр – количество страниц, КолИзд – количество изданий

Произведем запрос на слияние

SELECT ИдАв

FROM Авторы

UNION

SELECT ИдАв

FROM Книги

ORDER BY ИдАв

Строковые функции

Строковые функции предназначены для выполнения различных операций с двоичными данными, символьными строками и арифметическими выражениями. Ниже перечислены некоторые строковые функции, используемые в Transact-SQL.

ASCII (символ) возвращает значение кода ASCII

CHAR (целое_выражение) преобразует код ASCII в символ

LOWER (символьное_выражение) переводит заглавные буквы символьной строки в строчные

UPPER (символьное_выражение) преобразует строчные буквы символьной строки в заглавные

LTRIM удаляет пробелы в начале строки

RTRIM удаляет пробелы в конце строки

CHARINDEX (символьное_выражение, выражение) - возвращает начальную позицию указанного символьного выражения внутри указанной строки. Выражение – это обычно имя столбца.

PATINDEX (‘%подстрока%’, имя_столбца) возвращает начальную позицию первого вхождения подстроки в строке, например, значения в столбце таблицы.

REPLICATE возвращает несколько наборов символов, заданных в первом аргументе функции.

Пример 4.1. SELECT REPLICATE (‘a’,7)

-----------

Результат: Aaaaaaa

REVERS (символьная строка) возвращает символы строки в обратном порядке.

SPACE (n) возвращает строку пробелов из n символов

STUFF(строка_символов_1, начальная_позиция, длина, строка_символов_2) вставляет вторую строку в первую

Пример 4.2. SELECT STUFF(‘123456’, 2, 4, ‘abcdef’)

-----------------

1abcdef6

SUBSTRING(строка_символов, начальная_позиция, длина) используется для возвращения подстроки из исходной строки.

Арифметические функции

Арифметические функции работают с числовыми типами данных. В Transact-SQL существует большое количество математических функций, некоторые из них приведены ниже

COS(), COT(), SIN(), TAN() – тригонометрические функции,

CELLING(числовое_выражение) Наименьшее целое, большее либо равное значению выражения,

FLOOR(числовое_выражение) Наибольшее целое, меньшее либо равное значению выражения,

EXP(), LOG(), LOG10(),

PI() – 3.14159….,

POWER(числовое_выражение, y) Значение выражения в степени y,

ABS(), RAND(), ROUND(), SIGN(), SQRT().

Основы Transact-SQL

(MS SQL Server)

Корпорация Microsoft, как и многие другие производители, разработала свою версию языка SQL, назвав его Transact-SQL. Данный язык удовлетворяет требованиям ANSI SQL-92, но предлагает и еще ряд дополнительных возможностей. В SQL Server появилось новое условное средство – CASE, которое может использоваться в условиях поиска.

CASE

WHEN условие1 THEN результат1

WHEN условие2 THEN результат2

. . .

WHEN условиеn THEN результатn

END

Пример 4.3. Пищевой рацион.

UPDATE Пища (Продукты питания)

SET Норма = CASE

WHEN жир<1

THEN ‘очень мало жиров’

WHEN жир<5

THEN ‘мало жиров’

WHEN жир<20

THEN ‘среднее количество жиров’

WHEN жир<50

THEN ‘высокое количество жиров’

ELSE ‘сплошные жиры’

END

В цифрах указано количество жиров в граммах на 100 грамм.

Оператор CASE проверяет по порядку условие WHEN, пока не встретится первое истинное значение, после чего он игнорирует оставшиеся условия.

Пример 4.4. Запрос о погоде в городе, куда Вы собираетесь ехать, и, соответственно, какую одежду надо взять.

Пусть имеются два отношения:

Г.Города(NГ, Город)

С.Сводка_погоды(NС, NГ, Дата, Температура)

SELECT Г.NГ, Г.Город, Дата, Температура)

«Взять одежду»=

CASE

WHEN С.Температура<0

THEN “Зимняя одежда”

WHEN С.Температура

BETWEEN 0 AND 10

THEN “Весенняя одежда”

WHEN С.Температура<0

BETWEEN 11 AND 30

THEN “Летняя одежда”

ELSE

THEN “Погода неопределенная”

END

FROM Г, С

WHERE Г.NГ=С.NГ

4.4. Встроенный язык SQL.

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

Во встроенном SQL запросы делятся на два типа:

  • Однострочные запросы,

  • Многострочные запросы

Однострочный запрос во встроенном SQL, вызвал необходимость модификации оператора SQL – SELECT:

SELECT [ALL | DISTINCT] <список полей>

INTO <список переменных базового языка>

FROM <список исходных таблиц>

[WHERE <предикат>]

Пример 4.5. Пусть имеется отношение: STUD (NS, FIO, GR, SPEC)

Для описания локальных переменных в языке Transact SQL (СУБД Ms SQL Server) используется символ @

DECLARE @p1 int,

DECLARE @p2 char(20), @p3 char(4), @p4 char(30)

SET @p1=205

SELECT *

INTO @p2, @p3, @p4

FROM STUD

WHERE NS=@p1 Для реализации многострочных запросов, вводится новое понятие – понятие курсора. Для работы с курсором добавляется несколько новых операторов SQL.

DECLARE <имя курсора> CURSOR – объявление некоторого курсора, с помощью которого можно проводить обработку записей. FOR <подзапрос> OPEN <курсор> - оператор открытия курсора, дает команду СУБД выполнить запрос FETCH <курсор> INTO <список переменных> используется для выборки записей CLOSE <курсор> - оператор закрытия курсора

Пример 4.6.         DECLARE q CURSOR         FOR SELECT *             FROM STUD             WHERE SPEC=”230102”         OPEN q         WHILE .T.         FETCH q INTO A, B, C, D,         DO PROC         END WHILE         CLOSE q

Пример 4.7. Пусть имеется БД, связанная с поставками изделий.

Поставщики S(NП, ФИО, Состояние)

Детали P(NД, НазваниеД, Цвет, Вес, Город)

Изделия J(NИ, НазваниеИз, Город)

Поставки SPJ(NП, NД, NИ, Количество)

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

MAIN

DEFINE PS.* LIKE S.*

DEFINE PJ.* LIKE J.*

DECLARE CS CURSOR FOR

SELECT NП, ФИО, Состояние, Город

FROM S

ORDER BY NП

DECLARE CJ CURSOR FOR

SELECT NИ, НазваниеИз, Город

FROM J

WHERE NИ IN

(SELECT NИ

FROM SPJ

WHERE NП=S.NП)

ORDER BY NИ

OPEN CS

LET V=”1”B

LET R=”1”B

WHILE V

IF STATUS=NOTFOUND

THEN MESSAGE “NO ROW FOUND”

EXIT WHILE

END IF

FETCH CS INTO PS.NP, PS.ФИО, PS.Состояние, PS.Город

DISPLAY PS.NP, PS.ФИО, PS.Состояние, PS.Город

OPEN CJ

WHILE R

FETCH CJ INTO PJ.NИ, PJ.НазваниеИз, PJ.Город

DISPLAY PJ.NИ, PJ.НазваниеИз, PJ.Город

END WHILE

CLOSE CJ

END WHILE

CLOSE CS

END MAIN

Динамический SQL

Если множество команд, которые может принимать программа, сравнительно невелико (например, бронирование мест на авиалиниях), то и множество возможных предложений SQL, выдаваемых программой, также будет небольшим и может быть зашито в программу.

Если же количество вариантов входных данных будет большим, то зашить их в программу не удается. В этом случае удобно динамически формировать предложения SQL.

Для динамического формирования SQL используются два основных предложения:

PREPARE – подготовить

EXECUTE – выполнить

Схема их использования состоит в следующем:

DEFINE Исходный-SQL CHAR

DECLARE Объектный-SQL оператор

Исходный-SQL=”DELETE FROM SP

WHERE количество<100”

PREPARE Объектный-SQL FROM Исходный-SQL

EXECUTE Объектный-SQL

Вопросы

  1. Назовите основные версии языка SQL

  2. Операторы манипулирования данными

  3. Упрощенный синтаксис оператора SELECT

  4. Каков синтаксис оператора INSERT?

  5. С какой целью используется оператор UPDATE?

  6. Назовите основные агрегатные функции языка SQL

  7. Когда возникает необходимость использования курсора.

  8. Основные операторы встроенного языка SQL

  9. Для чего применяют оператор FETCH – INTO?

  10. Когда возникает необходимость динамического SQL?