|
Программирование >> Хронологические базы данных
2. Выполняемый SQL-оператор (далее до конца этого раздела уточнение внедренный обычно будет опускаться) может быть в программе везде, где могут быть выполняемые операторы базового языка. Обратите внимание на уточнение выполняемые : в отличие от интерактивного режима использования языка SQL, режим внедрения SQL-операторов подразумевает включение в программу отдельных SQL-операторов, которые являются чисто декларативными, а не выполняемыми. Например, оператор DECLARE CURSOR- это невыполняемый оператор (подробности приводятся в разделе Операции, использующие курсоры ); таковыми не являются и операторы BEGIN и END DECLARE SECTION (см. п. 5 этого списка), а также оператор WHENEVER (см. п. 9). 3. SQL-операторы могут включать ссылки на базовые переменные (т.е. переменные базового языка). Подобные ссылки должны включать префикс в виде двоеточия, предназначенный для отличия их от имен столбцов SQL-таблиц. Базовые переменные могут применяться во внедренных SQL-операторах везде, где в интерактивном языке SQL могут использоваться литералы. Они могут также находиться в предложении INTO операторов SELECT (см. п. 4) и FETCH (подробности - в разделе Операции, использующие курсоры ), определяющих результирующие переменные для размещения результатов выборки данных. 4. Обратите внимание на предложение INTO оператора SELECT, представленного на рис. 4.3. Назначение этого предложения (как только что отмечалось) - указать результирующие (целевые) переменные, в которые будут возвращены выбранные значения. Каждая /-я целевая переменная, указанная в предложении INTO, соответствует /-му извлекаемому значению, указанному в списке выборки предложения SELECT. 5. Все базовые переменные, на которые ссылаются внедренные SQL-операторы, должны быть определены (в PL/I это оператор DCL) в разделе объявлений внедренного языка SQL, который ограничивается операторами BEGIN DECLARE SECTION и END DECLARE SECTION. 6. Каждая программа, содержащая внедренные SQL-операторы, должна включать базовую переменную с именем SQLSTATE. После выполнения любого присутствующего в программе SQL-оператора в эту переменную возвращается код состояния. В частности, код состояния 00000 означает, что оператор был выполнен успешно, а код состояния 02000 - что оператор был выполнен, но никаких удовлетворяющих запросу данных найдено не было. Таким образом, выполнение в программе каждого SQL-оператора должно завершаться проверкой значения переменной SQLSTATE и, если это значение будет отличаться от ожидаемого, должны предприниматься соответствующие действия. На практике, однако, такая проверка обычно выполняется неявно (см. п. 9). 7. Базовые переменные должны иметь типы данных, соответствующие значениям, для размещения которых эти переменные используются. В частности, базовая переменная, используемая в качестве целевой (т.е. для размещения результатов операции SELECT), должна иметь тип данных, который совместим с типом выражения, представляющего значение, присваиваемое этой целевой переменной. Аналогично, если базовая переменная служит источником (например, для операции INSERT), она должна иметь тип данных, совместимый с SQL-типом того столбца, которому при- сваивается значение из этого источника. Подобные замечания касаются также базовых переменных, используемых в сравнениях или в любых других операциях. В официальном документе стандарта [4.22] подробно объясняется, что для двух типов значит быть совместимыми. 8. Базовые переменные для столбцов SQL-таблиц могут иметь те же имена, что и имена соответствующих столбцов. 9. Как уже упоминалось, выполнение каждого SQL-оператора, в принципе, должно сопровождаться проверкой значения, возвращаемого в переменной SQLSTATE. Для упрощения этого процесса предназначен оператор WHENEVER, который имеет следующий синтаксис. EXEC SQL WHENEVER <условие> <действие> ; Здесь параметр <условие> может принимать значение либо SQLERROR (ошибка SQL), либо NOT FOUND (не найдено), а параметр <действие> - это либо оператор CONTINUE (продолжить), либо оператор GO ТО (перейти к). Оператор WHENEVER не является выполняемым; это просто директива для SQL-компилятора. Наличие в программе выражения WHENEVER <условие> GO ТО <метка> приведет к тому, что компилятор поместит оператор IF <условие> GO ТО <метка> END IF после каждого встретившегося ему выполняемого SQL-оператора. Однако, встретив выражение WHENEVER <условие> CONTINUE , SQL-компилятор не вставляет в программу никаких операторов и, следовательно, программист должен будет вставить требуемые операторы вручную. Два фиксированных значения условия определяются так. NOT FOUND означает никаких данных не найдено - SQLSTATE = 02000 (обычно) SQLERROR означает возникла ошибка - см. описание стандарта [4.22] для переменной SQLSTATE Каждый оператор WHENEVER, который процессор SQL встречает при последовательном сканировании текста программы (для определенного условия), отменяет предыдущий (для этого условия). 10. Используя терминологию главы 2, отметим, что внедрение SQL-операторов устанавливает слабую связь между SQL-средой и базовым языком. Итак, для предварительного обсуждения этого достаточно. Далее мы сосредоточимся на операторах манипулирования данными. Как уже отмечалось, большинство из них можно использовать практически в неизменном виде (т.е. лишь с незначительными изменениями в синтаксисе). Однако операции выборки требуют особого рассмотрения. Проблема состоит в том, что такие операторы в общем случае выбирают не одну, а множество строк, в то время как процедурные базовые языки обычно не приспособлены для выборки более одной строки за одно обращение. Следовательно, необходимо обеспечить своего рода мост между уровнем выборки множество-за-один-раз в языке SQL и уровнем выборки строка-за-один-раз в базовом языке. В качестве подобного моста используются курсоры. Курсор - это специальный тип SQL-объекта, который применяется только во внедренном языке SQL (поскольку в интерактивном языке SQL в нем нет необходимости). Курсор представляет собой определенный тип логического указателя, который может использоваться для перемещения по набору строк, указывая поочередно на каждую из них и таким образом обеспечивая возможность адресации к этим строкам - к одной за один раз. Однако временно отложим подробное обсуждение курсоров и рассмотрим сначала такие операторы, для которых курсоры не требуются. Операции, не использующие курсоры Ниже перечислены операторы манипулирования данными, для которых не требуется использование курсоров. Однострочный оператор SELECT INSERT UPDATE (кроме формы CURRENT) DELETE (также кроме формы CURRENT) Рассмотрим примеры для каждого из этих операторов. Однострочный оператор SELECT. Получить статус и название города для поставщика, номер поставки которого задан в базовой переменной GIVENSi. EXEC SQL SELECT STATUS, CITY INTO .-RANK, :CITY FROM S WHERE S# = :GIVENSi ; Термин однострочный оператор SELECT используется для обозначения выражения SELECT, значением которого будет таблица, содержащая не более одной строки. В данном примере, если в таблице S существует ровно одна строка, удовлетворяющая заданному условию WHERE, значения столбцов STATUS и CITY из этой строки в соответствии с запросом будут присвоены базовым переменным RANK и CITY, а переменной SQLSTATE будет присвоено значение 00000. Если в таблице S нет ни одной строки, удовлетворяющей заданному условию WHERE, переменной SQLSTATE будет присвоено значение 02000 Если же таких строк окажется больше одной, будет зафиксирована ошибка и переменна; SQLSTATE будет содержать ее код. Оператор INSERT. Вставить в таблицу Р сведения о новой детали (номер детали, е название и вес задаются содержимым базовых переменных Р, PNAME, PWT соответственно; цвет детали и город неизвестны). EXEC SQL INSERT INTO P ( P#, PNAME, WEIGHT ) VALUES ( :P#, -.PNAME, :PWT ) ; Столбцам COLOR и CITY вновь добавляемой строки таблицы будут присвоены значения принимаемые по умолчанию. Подробнее об этом речь пойдет в разделе 5.5 главы 5. Оператор UPDATE. Увеличить статус всех поставщиков из Лондона на значение, по мешенное в базовую переменную RAISE. EXEC SQL UPDATE S SET STATUS = STATUS -H :RAISE WHERE CITY = London ;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |