
- •5. Реляционные языки запросов
- •5.1. Язык sql (Structured Query Language)
- •5.2. Операторы манипулирования данными
- •5.3 Выборки
- •Результат: номер поставщика состояние
- •Результат: номер_детали вес
- •Р6 Шайба Красный 19 Липецк
- •5.4 3Апросы, использующие соединения
- •5.5. Подзапросы
- •Подзапросы с несколькими уровнями вложения Пример 5.16. Выдать имена поставщиков, поставляющих красные детали:
- •5.7. Коррелированный подзапрос.
- •5.8. Квантор существования. Запрос, использующий exists
- •5.9. Стандартные функции
- •5.10. Использование группировок (group by)
- •5.11. Объединение с использованием union
- •5.12. Операции обновления
- •5.13. Встроенный язык sql
- •Динамический sql
- •Вопросы
- •Для чего используется язык sql.
5.13. Встроенный язык sql
При включении операторов SQL в базовый язык программирования необходимо чтобы операторы SQL включались непосредственно в текст программы исходного языка программирования.
Во встроенном SQL, запросы делятся на два типа:
Однострочные запросы,
Многострочные запросы
Однострочный запрос во встроенном SQL вызвал необходимость модификации оператора SQL – SELECT. Здесь появляется дополнительный атрибут INTO. С помощью INTO, найденные значения полей базы данных передаются в переменные базового языка.
SELECT [ALL | DISTINCT] <список полей>
INTO <список переменных базового языка>
FROM <список исходных таблиц>
[WHERE <предикат>]
Пример. Пусть имеется отношение: STUD (NS, FIO, GR, SPEC)
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 <курсор> - оператор открытия курсора.
По команде OPEN происходит выполнение запроса. FETCH <курсор> INTO <список переменных>, используется для выборки записей и передачи значений в список переменных. CLOSE <курсор> - оператор закрытия курсора
Пример:
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
Пример. Пусть имеется БД, связанная с поставками изделий.
Поставщики 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 CS 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