Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - SQLJ - Синтаксис05 июня 2011Оглавление: 1. SQLJ 2. Пример кода 3. SQLJ и JDBC 4. Синтаксис 5. Взаимодействие с JDBC 6. Особенности SQLJ 7. Недостатки SQLJ Для того, чтобы эффективно использовать синтаксические новшества, вносимые стандартом SQLJ, необходимо предварительно разобраться в их особенностях, связанных с процессом разбора SQLJ-конструкций. Любые SQLJ-конструкции начинаются с директивы Внешние переменныеВ терминологии SQLJ внешней переменной называется переменная SQLJ-конструкции, используемая для получения значений или передачи их во внешнюю относительно конструкции программную среду. К примеру: int i, j; i = 1; #sql { SELECT field INTO :OUT j FROM table WHERE id = :IN i }; System.out.println; Внешние переменные для избежания неоднозначностей должны задаваться в определённом виде, а именно:
Модификаторы Внешние выраженияВместо просто переменных в SQLJ-конструкциях можно использовать выражения, содержащие внешние переменные, чаще называемые просто внешними выражениями. Они имеют определённый синтаксис:
Основной нюанс при использовании внешних выражений заключается в том, что их использование может повлечь за собой определённые последствия, связанные с тем, что разбор SQLJ-конструкции препроцессором при наличии нескольких внешних выражений идёт в определённом порядке, а при использовании в выражениях присваиваний результат присваивания может быть передан в программную среду. Для иллюстрации данных двух моментов разберем простой пример использования внешних выражений: int i = 1; #sql { SELECT result FROM table1 WHERE field1 = : AND field2 = : AND field3 = : }; System.out.println; Исходя из опыта программирования, можно попытаться предположить, что
SELECT RESULT FROM table1 WHERE field1 = : AND field2 = : AND field3 = : Однако и первое, и второе утверждения неверны. Для проверки этого составим простую схему, проясняющую порядок разбора данной конструкции SQLJ-препроцессором:
Следовательно:
SELECT RESULT FROM table1 WHERE field1 = : AND field2 = : AND field3 = : КонтекстыВ терминологии SQLJ и JDBC контекстом подключения называется совокупность из трёх параметров, однозначно ими определяемая:
Для любой SQLJ-конструкции контекст, в котором она будет исполняться, можно определить явно: В рамках директивы ИтераторыИтератором в терминологии стандарта SQLJ называется объект для хранения результата запроса, возвращающего более одной записи. По своей сути и реализации он представляет собой не просто множество записей, а множество с некоторым упорядочением на нем, позволяющим использовать полученные записи последовательно. В этом плане итератор имеет много общего с курсором. Стандартом предусмотрены два типа итераторов разница между ними достаточно интересна: итераторы с привязкой по позиции в использовании требуют более SQL-подобного синтаксиса, в отличие от итераторов с привязкой по столбцам, которые очень близки по использованию к объектам. Итераторы с привязкой по позицииПервым типом итератора является итератор с привязкой по позициям. Он объявляется следующим образом: Создадим простую таблицу: CREATE TABLE people ( fullname VARCHAR, birthyear NUMERIC) Теперь с помощью итератора первого типа и конструкции ByPos positer; String name = null; int year = 0; #sql positer = {SELECT fullname, birthyear FROM people}; for { #sql {FETCH :positer INTO :name, :year}; if ) break; System.out.println; } Первой директивой осуществляется привязка результата запроса к итератору; второй с помощью конструкции Итераторы с именованием столбцовВторым типом итератора, более приближенного по использованию к обычным объектам, является итератор с именованием столбцов. Для указанной таблицы создание итератора второго типа будет выглядеть следующим образом: #sql public iterator ByName ( String fullNAME, int birthYEAR); Используется он как обычный объект, а именно, доступ к полям осуществляется через соответствующие акцессорные методы: ByName namiter; #sql namiter = {SELECT fullname, birthyear FROM people}; String s; int i; while ) { i = namiter.birthYEAR; s = namiter.fullNAME; System.out.println; } Однако существует правило, которое должно быть соблюдено имена полей итератора должны совпадать с именами полей в запросе. Это связано с процессом разбора SQLJ-конструкции препроцессором. В случае, если имя столбца в БД имеет название, несовместимое с правилами именования переменных в Java, необходимо использовать в запросе, формирующем итератор, псевдонимы. Вызовы процедур и функцийВызовы процедур очень просто записываются с использованием внешних переменных #sql {CALL proc }; Функции, в свою очередь, вызываются с использованием конструкции int i; #sql i = {VALUES)}; Просмотров: 5744
|