Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
baz_dan / Главы4-5.doc
Скачиваний:
52
Добавлен:
12.03.2015
Размер:
272.9 Кб
Скачать

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

Соседние файлы в папке baz_dan