|
Программирование >> Реляционные базы данных
Препроцессор Главный язык + Вызовы функций Компилятор главного языка Библиотека SQL Програхлма главного языка Ри . 7.1. Выполнение прогрслом с оперотороми SQL Языки стандарта SQL2 Реализации SQL2 должны поддерживать по меньшей мере семь главных языков: ADA, С, CoboL Fortran, М (прежнее название - Mumps), Pascal и PLL Студенты, изучающие компьютерную науку, должны знать все эти языки, исключая, может быть, М, который ранее применялся медицинским сообществом. В наших примерах используется С. 7.1.1 Проблема несогласованности моделей Основная проблема связи операторов SQL с обычным языком программирования состоит в полной несогласованности моделей. Так называется слишком большая разница между моделями данных SQL и моделями других языков. Ядром SQL является реляционная модель данных, а С и другие обычные языки программирования используют модели данных с целыми и реальными числами, арифметическими выражениями, символами, структурами записей, наборами и т.д. В С или в других подобных языках невозможно прямо выразить множества, а в SQL прямо не используются указатели, наборы и другие обычные конструкции языка программирования. В результате переход между SQL и другими языками оказывается непростым и необходим специальный механизм разработки программ, сочетающих в себе эти языки. Может показаться, что лучше использовать один язык -либо выполнять все вычисления на SQL, либо забыть о нем и вообще выполнять все вычисления на обычном языке. Но полезность SQL становится очевидной, когда речь заходит об операциях на БД. Системы SQL существенно помогают программисту при написании операций БД, которые можно эффективно выполнять и в то же время выражать на очень высоком уровне. SQL освобождает программиста от необходимости разбираться в том, как организованы данные в памяти или как использовать структуру памяти для эффективной работы с БД. Главный язык + Встроенный SQL 1 В спстчах. ис реализующих стпнллрт S0L2, может применяться другая переменна)!, иипрлняюшая ту же роль. Однако множество важных пешем SQL вообще неспособен делать. Например, неиозлшжио записать заирос SQL о вычислении факториала числа по формуле п[п. = II у. (п - I) ... v 2 v 1. и это всего лишь простое упражнение в С илн в сход-нь!\ с ним языках. .SOL не может прм.мо фор.матировать cBoii вывод в уяобно.м 1!нле. в частности графически. Таким оЗрязо.м, в реальнол? программировании БД нужны н SOL. и ооычмьн ! >иик, часто назыиасмый г.твным. 7.1.2 Интерфейс SQL/главный язык Пере.аача иифор.манин между БД. которая .юстижима Ttai.KO с иомошыо оператором SQL. и программой главного языка выполняется через переменные главного языка, которые можно прочитать илн записать с помошью запросов SQL. Перед тaкииl раяк.темыми переменными а-авнтся д1юеточие. когда онн используются и SOL-предложсннях. В операторах главного языка они появляются без двоеточия. При необходимости использовать SQL-предложение в программе главного языка перед ним ставятся ключевые слова EXEC SQL. Обычная система обрабатывает и\ и заменяет подхоцящн.ми вызовами функции в главном языке, используя при этом связанную с SQL библиотеку функций. Дпя связи программы главного языка с системой выполнения SQL-предложе-HiHi применяется переменная, носящая в стандарте SQL2 название SQLSTATE. Тип SQLSTATE -это массн> из пяти символов. При каждом вызове функции и библиотеки SQL в переменную SQLSTATE помещается код, обозначающий любую проблему, обнаруженную во время этого вызова. Например, 00000 (пять нулей) означает, что не возникло никаких ошибок; 02000 означает, что кортеж, который яолжен бьггь частью ответа на запрос SQL. не обнаружен. Программа главного языка может прочесть значите SQLSTATE н ип его основе принять решение. 7.1.3 Раздел DECLARE Для объявления разделяемых переменных нх определения помеи1аются между двумя встроенными операторами SQL; EXEC SQL BEGIN DECLARE SECTION; EXEC SQL END DECLARE SECTION; Bee. что находится между ними, называется разделом объявлений. Фор.ма описания пере.менноГ в этом разделе должна соответствовать требованиям главного языка. Более того, разумно приписывать переменным типы, приемлемые и лля главного языка, и дпя SQL. например целые и действительные числа, строки символов илн наборы. Пример 7.1. Следующие операторы moijt входить в функшш языка С, изменяющую отношение Studio: EXEC SQL BEGIN DECLARE SECTION; ctiar studioName[15l. studioAddr[501: char SQLSTATE[6]; EXEC SQL END DECLARE SECTION; Первая и посяедняя строки - обязательные начало и конец раздела объявлений. Между ними находится оператор, описывающий переменные studioName и studюAddr. г Дтя 5-с11мпол1.ног0 значения SQLSTATE мы будем применять шесть ciimbwob. так как в дальнейших программах для проверки, имеет ли SQLSTATE определенное значение, будет использопана )ункиия strcmp языка С, Поскольку strcmp предполагает, что ст)х)к11 зинсршаютсм символом ЛО , для этой отметки KOiiua спрокн нужен шссгйН символ. Шестой симво. должен быть первоначально >становлсн в W, но п дальнейших программах мы не будем явно показывать эту установку. Обе они ЯВ.1ЯЮТСЯ массипакш символов и .М01 >т быть использованы iui хранения имени и адреса студии, из которых строится кортеж, осгав.чяемыГ в отношение Studio. Иа TpcTbeii сгроке SQLSTATE определяется как набор и шесть симнагюи. О 7.1.4 Применение разделяемых переменных Разделяемую переменную можно использовать в SQL прсдлолениях вместо конкретного значения. Напомнилг, что при этом перед пей должно стоять двоеточие. Приведем пример, где переменные из примера 7.1 используются и качестве компонентов коргела, который нужно вставить в отношение Studio. Пример 7.2. На рис. 7.2 приведена краткая запись функции getstudio языка С, каюрам запрашивает у пользователя название н адрес студии, читает ответы и нставпяст подкодяший кортеж в отношение Studio. void getStudio() { 1) EXEC SOL BEGIN DECLARE SECTION: 2) char studioName[15J. studioAddr(50J; 3) char SQLSTATE[6); 4) EXEC SQL END DECLARE SECTION; /* напечатать запрос о введении названия и адреса студии и прочитать ответ в переменных studюName и studюAddr*/ 5) EXEC SQL INSERT INTO Studю(name. address) 6) VALUES (:studioName, studioAddr); Рис. 7.2. Применение розделвеллых переменных дпв васеки новой аудии Строки (I) - (4) - это описание из примера 7.1. Часть программы, печатающая запросы и сканирующая текст д;1я заполнения наборов studioName и studioAddr, пропушена. Строки (5) и (6) содержат встроенное SQL-предложение - обычное предложение вставки INSERT. Ему предшествуют ключевые слова EXEC SQL, означвюшие, что это действительно встроенное SQL-прелложение, а не гра.мматически неправильная программа С. Препроцессор, изображенный на рис. 7.1, будет искать EXEC SQL вяу обнаружения предложений, которые необходимо предварительно обработать. Значения, введенные на строках (5) и (6),-это не явные константы, как в примере 5.27. Значения на сгроке (6) - разделяемые переменные, текушие знамс ния которых становятся компонентами встаапяемого кортежа. □ Kpo.vie INSERT, есть множество видов. SQL-преяложений, которые можно встраивать в главный язык, используя разделяемые переменные в качестве интерфейса. Каждому такому предложению в программе главного языка предшествуют ключевые слова EXEC SQL, и в нем вместо констант можно применять разаеляемые переменные В главный язык может быть встроено любое SQL-llpeдлoжeниc. не
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |