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

1 ... 137 138 139 [ 140 ] 141 142 143 ... 264


Инструкция whenever значительно упрощает обработку ошибок встроенного SQL, и в прикладных программах обычно используют эту инструкцию, а не проверяют переменную sqlcode непосредственно. Помните, однако, что после того как в программе появляется инструкция whenever/goto, препроцессор будет осуществлять переход к заданной метке для каждой встроенной инструкции SQL, следующей за инструкцией whenever/goto. Вы должны построить свою программу так, чтобы заданная метка была действительным адресом перехода для всех этих инструкций SQL, иначе необходимо вставить в программу другую инструкцию whenever с иной меткой или вовремя отменить действие инструкции whenever/goto.

Использование базовых переменных

в программах со встроенным SQL, представленных на предыдущих рисунках, отсутствовало какое-либо реальное взаимодействие между инструкциями встроенного SQL и программными инструкциями. Однако во многих приложениях требуется использовать во встроенных инструкциях SQL программные переменные. Предположим, например, что необходимо написать программу, которая увеличивает или уменьшает все личные планы продаж на некоторую сумму, выраженную в долларах. Программа должна запросить у пользователя эту сумму и с помощью встроенной инструкции update обновить столбец quota в таблице salesreps.

Для выполнения этой задачи во встроенном SQL вводится концепция базовых переменных. Базовая переменная - это программная переменная, которая объявляется на базовом языке (например, COBOL или С) и на которую ссылается встроенная инструкция SQL. Для идентификации базовой переменной во встроенной инструкции SQL перед именем переменной ставится двоеточие. Двоеточие позволяет препроцессору легко различать базовые переменные и объекты базы данных (например, таблицы или столбцы), имена которых могут совпадать.

На рис. 17.17 представлена написанная на С программа, которая модифицирует столбец quota, используя базовую переменную. Программа запрашивает у пользователя сумму и запоминает введенное значение в переменной amount. Встроенная инструкция update имеет ссылку на эту базовую переменную. Перед выполнением инструкции update значенис переменной amount вводится в программу и подставляется в инструкцию SQL. Например, если в ответ на запрос вы введете значение 500, то СУБД фактически выполнит такую инструкцию update:

exec sql update salesreps

set quota = quota + 500;

Базовая переменная может появиться во встроенной инструкции SQL на месте любой константы. В частности, базовую переменную можно использовать в выражении присваивания:

exec sql update salesreps

set quota = quota + :amount;

Базовая переменная может присутствовать в условии отбора:

exec sql delete from salesreps

where quota < :amount;

Базовую переменную можно применять в предложении values инструкции insert:

exec sql insert into salesreps !empl num, name, quota) values (116, Bill Roberts, :amount);



mam () (

exec sql include sqlca;

exec sql begin declare section;

float amount; /* величина изменения (вводит пользователь) */ exec sql end declare section;

/* Запросить у пользователя величину, на которую повышается/понижается план */ printf( Повысить/понизить планы на: ); scanf( %f , samount);

/* Обновить столбец QUOTA в таблице SALESREPS */ exec sql update salesreps

set quota = quota + :amount;

/* Проверить результаты выполнения инструкции */ if (sqlqa.sqlcode = 0)

printf ( Bo время обновления произошла ошибка.\n ) else

printf( Обновление прошло успешно.\n ); exit (0),

Рис. 17.17. Использование базовых переменных

Обратите внимание: в каждом случае базовая переменная является частью информации, вводимой программой в базу данных; она входит в состав инструкции SQL, передаваемой в СУБД для выполнения. Ниже в настоящей главе вы увидите, что базовые переменные используются также для хранения информации, извлекаемой из базы данных; они принимают результаты запроса, возвращаемые из СУБД в программу.

Следует также отметить, что базовая переменная не может использоваться в качестве идентификатора SQL. Приведенный ниже пример использования переменной colname является недопустимым:

ctiar *colname = quota ;

exec sql insert into salesreps (empl num, name, :colname) values (116, Bill Roberts, 0.00);

Объявление базовых переменных

Прежде чем применять базовую переменную во встроенной инструкции SQL, ее необходимо объявить, используя обычные правила объявления переменных в базовом языке программирования. Например, нарис. 17.17 базовая переменная amount объявлена в соответствии с правилами языка С (float amount;). Когда препроцессор обрабатывает исходный текст программы, он запоминает имена всех встречающихся ему переменных вместе с типом данных и размером. Эта информация необходима препроцессору для того, чтобы, встретив в инструкции SQL базовую переменную, он мог сгенерировать правильный код.

Как показано на рис. 17.17, объявления базовых переменных должны находиться между двумя встроенными инструкциями SQL BEGIN DECLARE SECTION и END DECLARE SECTION. Эти две Инструкции имеются только во встроенном SQL и являются не исполняемыми инструкциями, а директивами препроцессора. Они сигнализируют препроцессору, когда он должен уделять внимание объявлениям переменных и когда он может их игнорировать.



в простой программе можно собрать все объявления базовых переменных в одной секции объявлений. Однако обычно базовые переменные приходится объявлять в различных точках программы, особенно в таких структурированньгх языках, как С, Pascal и PL/I В этом случае каждое объявление базовых переменных должно

охватываться парой инструкций begin declare section/end declare section.

Инструкции begin declare section и end declare section ЯВЛЯЮТСЯ относительно новыми во встроенном SQL. Они определены в стандарте ANSI/ISO и требуются в DB2 при использовании встроенного SQL в программах на языке С (подобная возможность появилась в DB2 версии 2). Однако исторически сложилось так, что DB2 и многие другие СУБД не требуют наличия секций объявления переменных, и поэтому в некоторых препроцессорах SQL эти инструкции отсутствуют. В таком случае препроцессор сканирует и обрабатывает все объявления переменных в базовой программе.

Когда используется базовая переменная, препроцессор может накладывать ограничения на объявление этой переменной в базовом языке программирования. Рассмотрим, например, следующий исходный текст на языке С:

#define BIGBUFSIZE 256

exec sql begin declare section;

char bigbuffer[BIGBUFSIZE+1]; exec sql end declare section;

Это правильное объявление переменной bigbuffer в языке С. Однако если вы попытаетесь использовать переменную bigbuffer как базовую переменную в инструкции встроенного SQL, например такой:

exec sql update salesreps

set quota = 300000 where name = -.bigbuffer;

TO многие препроцессоры вьщадут сообщение об ошибке (недопустимое объявление переменной bigbuffer). Проблема заключается в том, что эти препроцессоры не распознают символические константы наподобие bigbufsize. Это всего лишь один пример тех особых ситуаций, которые могут возникнуть при использовании встроенного SQL и препроцессора. К счастью, поставщики СУБД постоянно совершенствуют предлагаемые препроцессоры, и число подобных проблем уменьшается.

Базовые переменные и типы данных

Типы данных, используемые в реляционных СУБД и языках программирования (например, С или FORTRAN), очень часто не совпадают. Эти различия оказывают влияние на базовые переменные (тип базовой переменной при ее объявлении следует выбирать с учетом соответствия типов между базовым языком и SQL), т.к. последние играют две роли. С одной стороны, базовая переменная является программной переменной, объявляемой в соответствии с типами данных языка программирования и обрабатываемой программой на этом языке. С другой стороны, базовая переменная используется во встроенных инструкциях SQL и содержит информацию из базы Данных.



1 ... 137 138 139 [ 140 ] 141 142 143 ... 264

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