Слайд 1Встраиваемый SQL
БАЗЫ ДАННЫХ И СИСТЕМЫ УПРАВЛЕНИЯ БАЗАМИ ДАННЫХ
Слайд 2Вложенный SQL
Нужно использовать пакет программ который бы обеспечивал поддержку вложения
SQL в основной язык
Команды SQL помещаются в исходный текст
программы.
Командам SQL предшествует фраза EXEC SQL (EXECute SQL)
Слайд 3Переменные
Объявляются в SQL DECLARE SESSION (раздел объявлений)
Должны иметь совместимый тип
В
SQL команде переменной предшествует двоеточие
Слайд 4Переменные
EXEC SQL BEGIN DECLARE SECTION;
Var
id_num: integer;
name: array [1 . .40]
of char;
EXEC SQL END DECLARE SECTION;
Слайд 5Переменные
SQL и части базового языка обмениваются значениями через переменные
EXEC SQL
INSERT INTO Departaments
VALUES ( :id_num, :name)
Слайд 6Переменные
while not eof (f) do
begin
readln(f,
name);
EXEC SOL INSERT INTO Departaments
VALUES
( seq_depart.NEXTVAL, :name) ;
end;
Слайд 7Переменные
EXEC SQL
SELECT name, surname
INTO
:Sname, :Ssurname
FROM Students
WHERE id_num =
123456;
Запрос должен извлекать только ОДНУ строчку
Слайд 8Курсоры
Курсор – переменная, связанная с запросом.
Значением курсора может быть каждая
строка, которая выводится при запросе.
Строки курсора упорядочены.
Курсоры управляются следующими командами:
DECLARE
– объявить
OPEN - открыть
FETCH – выбрать строку
CLOSE - закрыть
Слайд 9Курсоры
EXEC SQL DECLARE CURSOR Students3k FOR
SELECT id_num, name, surname
FROM Students
WHERE Course = 3;
EXEC SQL OPEN CURSOR Students3k;
FETCH Students3k INTO :id_num, :name, :surname;
EXEC SQL CLOSE CURSOR Students3k;
Слайд 10Обработка ошибок
SQLCODE – числовой код
SQLSTATE – строка из 5 символов
(2-класс, 3-подкласс)
Варианты значений
Успешное завершение без ошибок и предупреждений
Успешное завершение с
предупреждением
Ошибка
Слайд 11SQLCODE
Значения:
0 - успешное завершение без ошибок и предупреждений
100 - успешное
завершение с предупреждением (NOT FOUND, NO DATE)
Число < 0 -
ошибка
Слайд 12NOT FOUND, NO DATE
SELECT: запрос не выбрал ни одной строки
FETCH:
последняя строка уже была выбрана, или ни одной строки не
выбрано запросом в курсоре
INSERT: ни одной строки не было вставлено
UPDATE или DELETE: ни одна строка не ответила условию предиката
Слайд 13SQLSTATE
Значения:
‘00000’ - успешное завершение без ошибок и предупреждений
Класс ’01’ -
успешное завершение с предупреждением
Класс ’02’ - NOT FOUND
Класс >
’02’ - ошибка
Слайд 14Курсоры
EXEC SQL OPEN CURSOR Students3k;
EXEC SQL FETCH Students3k
INTO
:id_num, :name, :surname;
while SQLSTATE = ‘00000’ do
begin
writeln (id_num,
name, surname);
EXEC SQL FETCH Students3k
INTO :id_num, :name, :surname;
end;
EXEC SQL CLOSE CURSOR Students3k;
Слайд 15Курсоры
EXEC SQL OPEN CURSOR Students5k;
while not SQLCODE = 100
do
begin
EXEC SQL FETCH Students5k
INTO :id_num,:name, :surname;
EXEC SQL
DELETE FROM Students WHERE CURRENT OF Students5k;
end;
EXEC SQL CLOSE CURSOR Students5k;
Слайд 16Курсоры
EXEC SQL OPEN CURSOR Students3k;
while not SQLCODE = 100
do
begin
EXEC SQL FETCH Students3k
INTO :id_num,:name, :surname;
EXEC SQL
UPDATE Students
SET Course = Course+1
WHERE CURRENT OF Students3k;
end;
EXEC SQL CLOSE CURSOR Students3k;
Слайд 17Индикаторные переменные
Объявляются в разделе объявлений SQL
Имеют тип главного языка,
соответствующий числовому типу в SQL
Значения:
изначально 0
отрицательное число, если производится значение
NULL
Слайд 18Индикаторные переменные
EXEC SQL OPEN CURSOR Students3k;
while SQLCODE = 0
do
begin
EXEC SQL FETCH Students3k
INTO :id_num, :name:i_n, :surnameINDlCATOR:i_sn;
If
(i_n > = 0) and (i_sn > = 0) {not NULL}
then
…………………
else {NULL}
begin
If i_n < 0 then writeln (‘Студент ', id_num, ' не имеет имени');
If i_sn < 0 then writeln (' Студент ', id_num, ' не имеет фамилии');
end; {else}
end; {while}
EXEC SQL CLOSE CURSOR Students3k;