|
Программирование >> Sql: полное руководство
Рассмотрим четыре встроенные инструкции update, представленные на рис. 17.18. В первой инструкции update столбец manager имеет тип integer, поэтому переменная hostvarl должна быть объявлена в языке С как целочисленная переменная. Во второй инструкции столбец name имеет тип varchar, поэтому переменная hostvar2 должна содержать строковые данные. Программа на языке С должна обьявлять переменную hostvar2 как массив символов, и для большинства СУБД необходимо, чтобы данные в массиве заканчивались нулевым символом (код 0). В третьей инструкции update столбец quota имеет тип money. Но соответствующего типа данных в языке С нет, так как в нем отсутствуют форматированные десятичные числа. Для большинства СУБД переменную hostvarS в языке С необходимо объявлять как переменную с плавающей запятой, а СУБД должна автоматически преобразовывать значение с плавающей запятой в формат money этой СУБД. Наконец, в четвертой инструкции update столбец hire date имеет тип данных date. Для большинства СУБД переменную hostvar4 в языке С необходимо объявлять как массив символов и заполнять этот массив датами в приемлемом для СУБД формате. Как видно из рис. 17.18, типы данных для переменных базового языка следует выбирать осторожно, с учетом их предполагаемого использования во встроенных инструкциях SQL. В табл. 17.2 приведены типы данных, определенные в стандарте SQL2, и соответствующие им типы данных в четырех из наиболее популярных языков программирования, упомянутых в стандарте (в нем описаны правила конвертирования типов данных и обработки встроенных инструкций SQL для языков Ada, С, COBOL, Fortran, MUMPS, Pascal и PL/I). Однако обратите внимание на то, что во многих случаях между типами данных нет однозначного соответствия. Кроме того, типы данных в разных СУБД имеют свои собственные отличительные черты, а для преобразования типов данных в случае использования переменных базового языка в разных СУБД существуют свои собственные правила. Поэтому, чтобы разобраться в вопросе преобразования типов данных, следует внимательно прочитать документацию на конкретную СУБД и описание используемого языка программирования. Таблица!7,:пы дачник в SQL и в базовых языках
Примечания- Базовый язык не поддерживает форматированные десятичные числа; приведение к типу данных с плавающей запятой и обратно может вызывать ошибки усечения и округления. В стандарте определено, что в языке С строки оканчиваются нулевым символом; в старых СУБД это правило не соблюдалось, а длина строки хранилась отдельно В данном случае длина строки символов (/) - это число битов (л), разделенное на количество битов в представлении одного символа (обычно 8), с округлением вверх. Базовый язык не поддерживает строки символов переменной длины; большинство СУБД преобразуют значения данного типа в строки постоянной длины Базовый язык не подцерживает типы данных, учитывающие региональные стандарты даты/времени; необходимо использовать текстовое представление соответствующих значений Даты/времени Базовые переменные и значения NULL В большинстве языков программирования, в отличие от SQL, нет неизвестных или отсутствующих значений. Например, в языках COBOL или FORTRAN переменная всегда имеет некоторое значение, а такое понятие, как неизвестное или отсутствующее значение (значение null), не используется. Поэтому, когда с помощью программного SQL необходимо или записать в СУБД значение null или извлечь его опуда, возникает проблема. Для ее решения во встроенном SQL вводится понятие *ременной-индикатора. Во встроенной инструкции SQL базовая переменная и переменная-индикатор :овместно определяют одно значение SQL: Значение индикатора, равное нулю, означает, что базовая переменная содержит действительное значение, которое можно использовать. Отрицательное значение индикатора означает, что базовая переменная содержит значение null; фактическое значение переменной должно в этом случае игнорироваться Положительное значение индикатора означает, что базовая переменная содержит действительное значение, которое, возможно, было округлено или усечено Такая ситуация может возникнуть только при извлечении информации из базы данных и рассматривается ниже в настоящей главе. Когда во встроенной инструкции SQL вы задаете базовую переменную, сразу за нею можете указать имя соответствующей переменной-индикатора. Перед именами обеих переменных ставится двоеточие. Ниже дана встроенная инструкция Update, в которой используется базовая переменная amount и сопутствующая ей переменная-индикатор amount ind: exec sql update salesreps set quota = :amount :amount ind, sales = :amount2 where quota < 20000.00; Если переменная amount ind при выполнении инструкции update имеет неотрицательное значение, то СУБД трактует эту инструкцию, как если бы у нее был следующий вид: exec sql update salesreps set quota = :amount, sales = :amount2 where quota < 20000.00; Если при вьшолнении инструкции update переменная-индикатор amount ind имеет отрицательное значение, то СУБД трактует эту инструкцию, как если бы у нее был такой вид: exec sql update salesreps set quota = NULL, sales = :amount2 where quota < 20000.00; Пара базовая переменная - переменная-индикатор может присутствовать в предложении set встроенной инструкции update (как в данном случае) или в предложении values встроенной инструкции insert. Переменную-индикатор нельзя использовать в условии отбора, поэтому следующая встроенная инструкция SQL является недопустимой: exec sql delete from salesreps where quota = :amount :amount ind; Данный запрет существует по той же причине, по которой в условии отбора не разрешается использовать ключевое слово null - нет смысла сравнивать значения quota и null, так как ответ всегда будет null (неизвестно). Вместо переменной-индикатора необходимо явно задать проверку is null. Ниже даны две встроенные инструкции SQL, выполняющие задачу предьщущей недопустимой инструкции: If (amount ind < 0) { exec sql delete from salesreps
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |