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

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


exec sql

begin declare section;

hostvarl = 106;

char

*hostvar2 = Joe Smith ;

float

hostvarS = 150000.00;

char

♦hostvar4 = Ol-JUN-1990 ;

exec sql

declare section;

exec sql

update salesreps

set manager = :hostvarl

where eirpl num = 102;

exec sql

update salesreps

set name = :hostvar2

where empl num = 102;

exec sql

update salesreps

set quota = :hostvar3

where empl num = 102;

exec sql

update salesreps

set hire date = :hostvar4

where empl num = 102;

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

Рассмотрим четыре встроенные инструкции 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 и в базовых языках

COBOL

FORTRAN

PL/I

SMALLINT

short

PIC S9 СОМР PIC S9 СОМР

INTEGER*2

FIXED BIN(15)

INTEGER

long

INTEGER*4

FIXED BIN(31)

REAL

float

СОМР-1

REAL*4

BIN FLOAT(21)

DOUBLE

double

СОМР-2

REAL*8

BIN FLOAT(53)

PRECISION

NUMERIC (p, DECIMAL(p,

s) s)

double

PIC S9 V9 (s)

ip-s)

:омр-з

REAL*8

FIXED DEC (p, S

CHAR(Л)

char x[n+l]

PIC X

CHARACTER*!!

CHAR(n)

VARCHAR(n)

char х[л+1]

CHAR(л) VAR

char x[l]

соответствия*

соответствия

BIT{n)

PIC X

CHARACTER*!

BIT(n)

BIT VARYING(n)

char x[l]

BIN(n) VAR

соответствия*

соответствия

DATE

соответствия

соответствия

соответствия

соответствия

TIME

соответствш

соответствия

соответствия

соответствия

TIMESTAMP

соответствия

соответствия

соответствия

соответствия

INTERVAL

соответствия

соответствия

соответствия

соответствия

Примечания-

Базовый язык не поддерживает форматированные десятичные числа; приведение к типу данных с плавающей запятой и обратно может вызывать ошибки усечения и округления.

В стандарте определено, что в языке С строки оканчиваются нулевым символом; в старых СУБД это правило не соблюдалось, а длина строки хранилась отдельно В данном случае длина строки символов (/) - это число битов (л), разделенное на количество битов в представлении одного символа (обычно 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



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

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