Интернет магазин китайских планшетных компьютеров |
|
Компьютеры - 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)};
Просмотров: 6526
|