Программирование >>  Sql: полное руководство 

1 ... 165 166 167 [ 168 ] 169 170 171 ... 264


dbcmd(dbproc, select name, quota, sales from salesreps ); dbcmd(dbproc, where sales > quota order by name ); dbsqlexec(dbproc);

/* Узнать, как была выполнена первая инструкция пакета */-------

dbresults(dbproc) ;

/* Извлечь одну строку таблицы результатов запроса */

while (status = dbnextrow (dbproc) == SUCCEED) {---(g)

/* Получить адрес каждого элемента данных в этой строке */ патер = dbdata(dbproc, 1);

quotap = dbdata (dbproc, 2);--

salesp = dbdata (dbproc, 3; ---- ~

namelen = dbdatlen (dbproc, 1) ;--.@

/* Скопировать значение столбца NAME в собственный буфер и сделать

так, чтобы оно заканчивалось нулем */ strncpy(namebuf, namep, namelen);

*(namebuf + namelen) = (char) 0; -

/* Вывести на экран информацию об этом служащем*/ prmtf ( Имя: %s\n , namebuf);

if (quotap == 0)--.г:-ф

printf ( План не назначен .\п ) ;

else

printf( План: %f\n , *quotap), printf( Объем продаж: %f\n , *salesp),

/* Проверить, успешно ли завершился запрос */ if (status == FAIL)

printf( Ошибка SQL.\n ); dbexit(dbproc), exit(0);

Рис. 198. Выборка данных с использованием функции dbdata ()

Программа, представленная на рис. 19.8, более фомоздка по сравнению с программой, текст которой приведен на рис. 19.7. В целом можно сказать, что если в программе не требуется различать значения NULL или обрабатывать результаты запроса большого объема, то лучше использовать функцию dbbind (), а не функцию dbdataо .

Выборка строк в произвольном порядке

Обычно программа обрабатывает результаты запроса в SQL Server, последовательно извлекая строки с помошью функции dbnextrowO . Для приложений, связанных с просмотром баз данных, библиотека DB-Library обеспечивает также возможность произвольного доступа к строкам таблицы результатов запроса. Профамма должна явно разрешить произвольный доступ к сфокам, устанавливая соответствующий режим в библиотеке DB-Library. После этого можно использовать функцию dbgetrowO для извлечения строк по их номерам.

Чтобы обеспечить выборку строк в произвольном порядке, библиотека DB-Library хранит строки таблицы результатов запроса во внутреннем буфере. Если в буфере помещаются полностью все сфоки таблицы, функция dbgetrowO обеспечивает



произвольный доступ к любой строке Если размер таблицы превышает размер буфера, то в буфере запоминаются только первые строки. К этим строкам профамма имеет произвольный доступ, но функция dbnextrow о, которая попытается извлечь Сфоку, ле вошедшую в буфер, возвратит специальный код ошибки bi)f full. Тогда профамма должна удалить из буфера часть сфок посредством функции dbclrbuf (), чтобы освободить место для новых сфок. Функция dbgetrow () не может повторно извлечь сфоки, удаленные из буфера. Таким образом, как изображено на рис. 19.9, библиотека DB-Library обеспечивает произвольный доступ к таблице результатов запроса в пределах офзниченного окна , размер которого определяется размером буфера сфок. Вызывая функцию dbsetopt (), профамма может задать размер буфера сфок.

dbgetrowO

Таблица результатов запроса -IN

Буфер строк библиотеки DB-Library

dbnextrowO I dbnextrowO I->.

dbgetrowO

dbnextrowO

dbnextrowO

продвигается функцией dbnextrowO

Уже обработано

L В настоящее I время в буфере

>Еще не в буфере

Рис 19.9. Выборка строк в произвольном порядке в SQL Server

Произвольный доступ, обеспечиваемый функцией dbgetrowO , аналогичен наборам записей с произвольным доступом, имеюшимся в ряде СУБД и официально утвержденным в стандарте SQL2. В обоих случаях реализуется произвольная выборка строк по их номерам. Однако указатель набора записей с произвольным доступом является настоящим указателем на всю таблицу результатов запроса от первой до лоследней строки, даже если таблица результатов запроса содержит тысячи строк. В противоположность этому функция dbge trow () обеспечивает произвольный доступ только в пределах офаниченного окна . Для небольших приложений это вполне подходит, но реализация произвольного доступа для больших запросов является непростой задачей.

Позиционные обновления

в программе со встроенным SQL набор записей обеспечивает непосредственную и достаточно тесную связь между программой и СУБД, обрабатывающей запрос на выборку. Извлекая сфоку за сфокой с помошью инсфукции fetch, профамма Каждый раз обращается к СУБД. Если запрос однотабличный, то СУБД может



установить прямое соответствие между текущей строкой таблицы результатов запроса и соответствующей строкой в базе данных. В этом случае с помощью позиционных инструкций (update/where current of И DELETE/WHERE current of) программа может модифицировать или удалить текущую строку в таблице результатов запроса При обработке запроса в SQL Server связь между программой и СУБД является асинхронной и гораздо менее сильной. В ответ на получение пакета HHcrpyKUHti содержащего одну или несколько инструкций select, SQL Server посьшает результаты запроса обратно в библиотеку D В-Library, которая их обрабатывает. Построчная выборка результатов запроса осуществляется с помощью функций библиотеки DB-Library, а не посредством инструкций SQL. В результате этого в ранних версиях SQL Server нельзя было выполнять позиционные обновления, так как сама СУБД не знала, какая строка является текущей

В последних версиях SQL Server (и Sybase Adaptive Server) была реализована полная поддержка наборов записей и связанных с ними инструкций declare/open/ fetch/close. Управление наборами записей осуществляется внутри хранимых процедур, написанных на диалекте Transact-SQL. И действие инструкции fetch заключается в том, чтобы передавать полученные данные в хранимую процедуру, а не в приложение, вызывающее эту процедуру. Хранимые процедуры и операции с ними в различных СУБД рассматриваются в главе-20.

Динамические запросы на выборку

Во всех примерах профамм, рассмофенных ранее в настоящей главе, выполнялись запросы, Сфуктура которых была известна заранее. Столбцы в таблице результатов запроса можно было <;вязывать с профаммными переменными посредством вызова функции dbbmd (). Эту методику можно использовать для написания боль-щинства профамм, работающих с SQL Server. (Такая статическая привязка столбцов соответствует фиксированному списку базовых переменных, который применяется в статической инсфукции fetch, рассмофенной в главе 17.)

Если во время написания профаммы известна не вся информация, необходимая для выполнения запроса, то профамма не может содержать вызовы функции dbbmd О. Вместо этого профамма должна с помощью специальных API-функций запросить у библиотеки DB-Library описание всех столбцов в таблице результатов запроса. После этого профамма может на ходу связать столбцы с буферами, выделяемыми для этой цели профаммой на этапе выполнения. (Такая динамическая привязка столбцов соответствует использованию динамической инсфукции describe и области sqlda, как рассмафивалось в главе 18.)

На рис. 19.10 приведен текст интерактивной профаммЫ формирования запросов, иллюсфирующей методику вьтолнения динамических запросов с помощью библиотеки DB-Library. Профамма приггимает имя таблицы, введенное пользователем, и предлагает ему выбрать столбцы, которые будут извлекаться из таблицы. Когда он это сделает, профамма сформирует инсфукцию select, а затем описанным ниже способом выполнит эту инсфукцию и отобразит на- экране данные из выбранных столбцов:

1. Профамма, как обычно, передает в SQL Server сформированную инсфукиию select с помощью функции d5cmd (), запращиваег ее выполнение посредством функции dbsqlexec о и вызывает функцию dbresults (), чтобы узнать, как была выполнена инсфукция.

2. Профамма вызывает функцию dbnumcols (), чтобы узнать, сколько столбцов содержит таблица результатов запроса, извлеченная инсфукцией select.



1 ... 165 166 167 [ 168 ] 169 170 171 ... 264

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика