
- •Cтатический и динамический sql
- •Статический sql
- •Основная программа
- •Переменные во встроенном sql
- •Применение into-переменных
- •Переменные связи
- •Курсоры
- •Обработка null-значений
- •Позиционированные операторы
- •Обработка ошибок
- •Создание операторов динамического sql
- •Одношаговый интерфейс
- •Многошаговый интерфейс
- •Динамические параметры
- •Динамические курсоры
Применение into-переменных
INTO-переменные служат для извлечения данных из результирующего набора в переменные основного языка программирования. Какая бы технология доступа к БД ни использовалась в приложении, после формирования результирующего набора данные для дальнейшей обработки (изменения, отображения, печати и т.п.) всегда должны быть извлечены в переменные, с которыми может работать основной язык программирования. Во встроенном SQL оператор SELECT сразу может указать имена переменных, в которые будут занесены результаты запроса. Такие переменные называются INTO-переменными.
Для использования INTO-переменных существуют следующие ограничения:
-
результирующий набор гарантированно должен возвращать только одну строку;
-
тип каждой INTO-переменной должен соответствовать типу столбца, значение которого записывается в эту переменную.
Результирующий набор будет гарантированно возвращать только одну строку в следующих случаях:
-
при использовании в предикате значения поля, являющегося уникальным в силу объявления его как PRIMARY KEY или UNIQUE;
-
при агрегировании данных всей таблицы, когда в списке полей указывается агрегирующая функция, а фраза GROUP BY отсутствует;
-
если структура используемых таблиц и синтаксис оператора SELECT однозначно определяют возвращаемую строку.
Например:
EXEC SQL SELECT f1,f2,f3 FROM tbl1
INTO :var1, var2, var3 WHERE f1=1;
Имена INTO-переменных могут совпадать с именами полей, так как это разные идентификаторы, отличающиеся наличием у INTO-переменных символа двоеточие.
Переменные связи
Переменные связи (bind-переменные) служат для передачи значений в СУБД. Эти переменные могут использоваться во фразе WHERE для вычисления условия, в операторах INSERT и DELETE для определения устанавливаемых значений.
Переменные связи, также как и INTO-переменные, перед применением должны быть предварительно объявлены. Переменные связи при указании их в SQL-операторе предваряются символом двоеточие.
Например:
EXEC SQL INSERT INTO tbl2 (f1,f2,f3)
VALUES (:f1,:f2,:f3);
Курсоры
Под курсором, как правило, понимают получаемый при выполнении запроса результирующий набор и связанный с ним указатель текущей записи. Курсор - это объект, связанный с определенной областью памяти. Существуют явные и неявные курсоры.
Явный курсор имеет имя и перед использованием должен быть объявлен. Неявный курсор создается автоматически и его нельзя повторно открыть без перекомпиляции оператора запроса.
Объявление курсора выполняется оператором DECLARE CURSOR, в котором фраза FOR определяет запрос, ассоциируемый с данным курсором.
Например, оператор
EXEC SQL DECLARE c1 CURSOR FOR
SELECT f1,f2,f3 FROM tbl1 WHERE f2>100;
создает курсор c1 на базе таблицы tbl1 . При объявлении курсора выполнения запроса не происходит. Выполнение запроса и создание курсора инициируется оператором OPEN CURSOR.
Например, оператор
EXEC SQL OPEN CURSOR с1;
создаст курсор, выполнив определенный в нем оператор SELECT.
Приложение получает доступ к данным курсора при последовательном извлечении строк результирующего набора в переменные приложения.
Для извлечения данных из курсора используется оператор FETCH
Например, оператор
EXEC SQL FETCH c1 INTO :f1,:f2,:f3;
извлекает значения текущей строки курсора в INTO-переменные.
Для освобождения памяти, выделенной под курсор, его следует закрыть, выполнив оператор CLOSE CURSOR.
Например:
EXEC SQL CLOSE CURSOR с1;