|
Программирование >> Реляционные базы данных
возвращающее результата (т.е. не являющееся запросом). Примерами таких предложений служат стандартные операторы вставки, удаления и изменения, а также операторы создания, изменения или удаления элементов схемы типа таблиц или представлений. Запросы типа seleci-from-where нeroэюжнo встроить в главный язык по причине несогласованности моделей. В качестве результата запросы порождают множества кортежей, в то время как ни ояин нз главных языков непосредственно не под;1ерживает .множественный тип данных. Поэтому встроенный SQL должен использовать один из двух механизмов связи результата запроса с программой глав1юго языка. 1. Запрос, порождающий единственный кортеж, может .К1мнить его в разделяемых переменных, используя по одной такой переменной для каждого компонента кортежа. Для этого применяется .модифицированная форма seleci-from-where, назьпиемая оператором выбора единственной стржи (single-row select). 2. Запросы, порождающие бапее одного кортежа, можно выполнять, определив курсор запроса. Курсор пробегает по всем кортежам результирующего отношения, и при это.м каждый кортеж .может быть считан в разделяемые переменные и обработан программой главного языка 7.1.5 Операторы выбора единственной строки Оператор выбора единственной строки отличается от select-from-wliere только тем, что в нем за пунктом SELECT следует ключевое слово INTO и список разделяемых переменных. Этим переменным, как и всем разделяемым переменным в операторе SQL, префиксируются столбцы. Если результатом запроса является единственный кортеж, его компоненты ста1юоятся значениями этих переменных. Если же в результате отсутствует кортеж или имеется несколько кортежей, разде-ляемы.м переменным не приписывается никаких значений и в переменную SQLSTATE записывается подходящий код. Пример 7.3. Запишем функцию С для чтения названия студии и печати чистого дохода ее президента Краткая запись такой функции приведена на рис. 7.3. void printNetWorthO { 1) EXEC SQL BEGIN DECLARE SECTION; 2) charstudioNanne[15]; 3) int presNetWorth; 4) ctiar SQLSTATE[61; 5) EXEC SQL END DECLARE SECTION; / напечатать запрос о введении названия студии и прочитать ответ е переменной studioName V 6) EXEC SQL SELECT neftVorth 7) INTO presNetWorth 8) FROM Studio, MovieExec 9) WHERE presC# = cert# AND Studio name = studioName; /* проверить, содержит ли SQLSTATE одни нули, и еспи это так, напечатать значение presNelWcrth*/ Рнс. 7.3, Выбор единственной строки, есгроенный в функцию С Строки (.1) - (5) - это раздел описания необходимых разделяемых переменных. . 1алее следуют не показанные явно операторы С, извлекающие название студии из стандартного ввода. Строки (6) - (9) - оператор выбора единстпенной строки, отличающий от стандартного запроса SQL по двум параметрам. В условии WHERE вместо консганты используется значение переменной studioName, а о строке (7) введен пункт INTO, указывающий, куда помещать результат запроса. В данном случае предполагается, что в результате получается единственный кортеж и что кортежи имеют только один компонент для атрибута netWorlti. Значение этого компонента хранится в разделяемой переменной presNetWorth типа натуральное число . □ 7.1-6 Курсоры Наиболее гибким методом связи SQL с главным языком являются курсоры, пробегающие по кортежам отношения. Это отношение может быть хранимой таблицей или генерироваться запросом. Для создания и применения курсора необходимо следующее: 1. Описание курсора. Наиболее простая форма описания курсора включает в себя: a) вводные ключевые слова EXEC SQL, как и во всех встроенных операторах SQL; b) ключевое слово DECLARE; c) имя курсора; d) ключевые слова CURSOR FOR; e) выражение типа имени отношения или выражение select-from-where, значением которого является отношение. Курсор пробегает по кортежам отношения, т.е. при его вызове относется к каждому кортежу данного отношения. Форма описания курсора: EXEC SQL DECLARE <курсор> CURSOR FOR <запрос> 2. Оператор EXEC SQL OPEN, за которым следует имя курсора. Этот оператор ннининрует курсор в позиции, откуда он готов извлечь первый кортеж отношения, по которому пробегает курсор. 3. Одно или несколько применений предложения FETCH, предназначенного для получения следующего кортежа отношения, по которому пробегает курсор. Если перебор кортежей закончен, никакой кортеж не возвращается и значение SQLSTATE устанавливается в 02000 - это означает, что ни один кортеж не найден. В пред.пожснне FETCH входят сче.аующие компоненты: (il) ключевые слова EXEC SQL FETCH FROM; (b) имя курсора: (c) ключевое слово INTO; (d) список переменных, разделенных запятыми. При наличии кортежа, который нужно выбрать, его компоненты размещаются в этих переменных по порядку. Форма предложения FETCH: EXEC SQL FETCH FROM <курсор> INTO <список псременных> 4. Оператор EXEC SQL CLOSE, за которым следует имя курсора. Этот oneriaTOp закрыплет курсор, который больше пе пробегает по кортежам отношения. Однако его можно снова ввести в демствве другим оператором OPEN и он виопь будет пробегать кортежи атого же отношения. Пример 1Я. Требуется определить число ;Л-\!ииистраторС1! фильмов, чьи чистые доходы нь[Стра1Н)акугся в послеловательность экспоненциально возрастающих дпапизонон. кяалый из которых соогветстлует количеству цифр, выражающих доход а.амннистратора. Сформулируем запрос, извлекающий поле netWorth из всех к01)тежей отношения MovieExec в разделяемую переменную worth. Курсор с 1меием execCursor будет пробегать по всем этим однокомпонеитным кортежам. При каждом выборе кортежа подсчитывается количество цифр в натуральном числе worth м увеличивается нолхо-аяишй элемент набора counts. 1) void worthRangesO { 2) int i. digits, counts[15]; 3) EXEC SQL BEGIN DECLARE SECTION; 4) int worth; 5) char SQLSTATE[6i; 6) EXEC SQL END DECLARE SECTION; 7) EXEC SQL DECLARE execCursor CURSOR FOR 8) SELET netWorth FROM MovieExec; 9) EXEC SQL OPEN execCursor; 10) for(i=0; i< 15; i++) counts[i] = 0; 11) while(1){ 12) EXEC SQL FETCH FROM execCursor INTO :worth; 13) if(NO MORE TUFLES) break; 14) digits =1; 15) v/hile((woith /= 10) > 0) digits++; 16) if(digits == 14> counts[digits]++; ) 17) EXEC SQL CLOSE execCursor; 18) for(i=0; i<15; i++) 19) printf ( dig its = %d: number of execs = %d\n . i, counts[i]); Pvtc. 7.4. Сведение доходов одмикнстроторое g экспоненциальные днопоэоны Описание функции worthRanges начинается на строке (1) рнс. 7.4. Строка (2) описывает пере%:ениые, используемые топько функцией С, но не встроенным SQL. Набор counts содержит счета администраторов в различных диапазонах, digits пересчитывает количество цифр в чисгом доходе, а i -индекс, пробегающий по элементам набора counts. Строки (3 -(6) -это раздел описания SQL, в котором заданы разделяемая переменная vvonh и обычная SQLSTATE. Строки (7) и (8) означают, что курсор execCursor пробегает по значениям. пою>1и1аемым запросом строки (8) Запрос относигся к компонентам netWorth всех кортежей отношения MoviExec. Курсор открывается на строке (9). Строка (10) завершает инициализацию, превращая п нули элементы набора counts.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |