Мартин Грубер - Понимание SQL
EXEC SQL FETCH Salesperson
INTO (:snum, :sname, :city:i_cit, :comm:i_com);
{Выборка первой строки}
while SQLCODE=O do
{Пока эти строки в таблице Продавцов.}
begin
if i_com < O then commnull:=true;
if i_cit < O then citynull:=true;
{ Установить логические флаги которые могут показать NULLS.}
if citynull then
begin
write ('Нет текущего значения city для продавца ',
snum, ' Хотите предоставить хотя бы одно? (Y/N)');
{Подсказка покажет значение city состоящее из NULL значений.}
read (ответ);
{Ответ может быть сделан позже.}
end {если конечно - citynull}
else { не citynull }
begin
if not commnull then
{ Чтобы выполнять сравнение и операции только для не-NULL значений связи }
begin
if city='London' then comm:=comm * .02 * .02
else comm:=comm + .02;
end;
{Даже если значение и не - commnull, begin и end здесь для ясности.}
write ('Текущий city для продавца',
snum, 'есть', city,
* Хотите его изменить? (Y/N)');
Обратите Внимание: Продавец не назначеный в данное время в определенный город, не будет иметь изменений комиссионых при определении находятся ли он в Лондоне.
read (ответ);
{Ответ теперь имеет значение независимо от того что citynull - верен или неверен.}
end; {иначе не citynull}
if response='Y' then
begin
write ('Введите новое значение city:');
read (newcity);
if not commnull then
{Эта операция может быть выполнена только для не-NULL значений. }
case newcity of:
begin
'Barcelona':comm:=comm + .01,
'San Jose': comm:=comm *.01
end; {случно и если не commnull}
EXEC SQL UPDATE Salespeople
SET city=:newcity, comm=:comm:i_com
WHERE CURRENT OF Salesperson;
{Переменная индикатора может поместить NULL значение в поле comm если так назначено.}
end; { Если ответ='Y', или если ответ < > 'Y',
изменений не будет. }
EXEC SQL FETCH Salesperson
INTO (:snum, :sname, :city:i_clt,
:comm:l_com);
{выборка следующей строки}
end; {если SQLCODE=0}
EXEC SQL CLOSE CURSOR Salesperson;
* end; {основной программы}
Приложение B. ТИПЫ ДАННЫХ В SQL
ТИПЫ ДАННЫХ РАСПОЗНАВАЕМЫЕ С ПОМОЩЬЮ ANSI, состоят из символов и различных типов чисел, которые могут классифицироваться как точные числа и приблизительные числа. Точные числовые типы - это номера, с десятичной точкой или без десятичной точки. Приблизительные числовые типы - это номера в показательной (экспоненциальной по основанию - 10) записи.
Для все прочих типов, отличия слишком малы чтобы их как-то классифицировать.
Иногда типы данных используют аргумент, который я называю размером аргумента, чей точный формат и значение меняется в зависимости отконкретного типа. Значения по умолчанию обеспечены для всех типов, если размер аргумента отсутствует.
ТИПЫ ANSIНиже представлены типы данных ANSI (имена в круглых скобках - это синонимы ):
TEXT
ТЕКСТ
CHAR (или CHARACTER)
Строка текста в реализационно-определенном формате. Размер агрумента здесь это единственное неотрицательное целое число которое ссылается к максимальной длине строки. Значения этого типа, должны быть заключены в одиночные кавычки, например 'text'. Две рядом стоящие одиночные кавычки ('') внутри строки будет пониматься как одна одиночная кавычка (').
ПРИМЕЧАНИЕ:
Здесь и далее, фраза Реализационно-Определенный или Реализационно Зависимый, указывает, что этот аргумент или формат зависит от конкретной программы в которой реализуются данные.
EXACT NUMERIC
ТОЧНОЕ ЧИСЛО
DEC (или DECIMAL)
Десятичное число; то есть, число которое может иметь десятичную точку. Здесь аргумент размера имеет две части: точность и масштаб. Масштаб не может превышать точность. Сначала указывается точность, разделительная запятая и далее аргумент масштаба. Точность указывает сколько значащих цифр имеет число. Максимальное десятичное число составляющее номер - реализационно-определенное значение, равное или большее чем этот номер. Масштаб указывает максимальное число цифр справо от десятичной точки. Масштаб =нулю делает поле эквивалентом целого числа.
NUMERIC
Такое же как DECIMAL за исключением того, что максимальное десятичное не может превышать аргумента точности.
INT (или INTEGER)
Число без десятичной точки. Эквивалентно DECIMAL, но без цифр справа от десятичной точки, то-есть с масштабом равным 0. Аргумент размера не используется (он автоматически установливается в реализационно-зависимое значение).
SMALLINT
Такое же как INTEGER, за исключением того, что, в зависимости от реализации, размер по умолчанию может (или не может ) быть меньшее чем INTEGER.
APPROXIMATE NUMERIC
ПРИБЛИЗИТЕЛЬНОЕ ЧИСЛО
FLOAT
Число с плавающей запятой на основе 10 показа тельной функции. Аргумент размера состоит из одного числа определяющего минимальную точность.
REAL
Такое же как FLOAT, за исключением того, что никакого аргумента размера не используется. Точность становлена реализационно-зависимую по умолчанию.
DOUBLE
Такое же как REAL, за исключением того, что реаPRECISION лизационно-определяемая точность для DOUBLE PRE( или DOUBLE ) CISION должна превышать реализационно-определяемую точность REAL.
ЭКВИВАЛЕНТНЫЕ ТИПЫ ДАННЫХ В ДРУГИХ ЯЗЫКАХ
Когда используется вложение SQL в другие языки, значения используемые и произведенные командами SQL, обычно сохраняются в переменных главного языка( см. Главу 25). Эти переменные должны иметь тип данных совместимый со значениями SQL, которые они будут получать. В дополнениях, которые не являются частью официального SQL стандарта, ANSI обеспечивает поддержку при использовании вложения SQL в четыре языка: Паскаль, PL/I, КОБОЛ, и ФОРТРАН. Между прочим, он включает определение эквивалентов SQL, для данных типов переменных используемых в этих языках.
Эквиваленты типов данных четырех языков определенных ANSI:
ПЛ/I
SQL ТИП
ЭКВИВАЛЕНТ ПЛ/I
CHAR
CHAR
DECIMAL
FIXED DECIMAL
INTEGER
FIXED BINARY
FLOAT
FLOAT BINARY
КОБОЛ
SQL ТИП
ЭКВИВАЛЕНТ КОБОЛА
CHAR (<integer>)
PIC X (<integer>)
INTEGER
PIC S (<nines>) USAGE COMPUTTATIONAL
NUMERIC
PIC S (< nines with embedded V > )DISPLAY SING LEADING SEPERATE
ПАСКАЛЬ
SQL ТИП
ЭКВИВАЛЕНТ ПАСКАЛЯ
INTEGER
INTEGER
REAL
REAL
CHAR (<length>)
PACKED ARRAY [1..<length>] OF CHAR
ФОРТРАН
SQL ТИП
ЭКВИВАЛЕНТ ФОРТРАНА
CHAR
CHAR
INTEGER
INTEGER
REAL
REAL
DOUBLE PRECISION
DOUBLE PRECISION
Приложение C. НЕКОТОРЫЕ ОБЩИЕ НЕСТАНДАРТНЫЕ СРЕДСТВА SQL
ИМЕЕТСЯ РЯД ОСОБЕННОСТЕЙ ЯЗЫКА SQL которые пока не определены как часть стандарта ANSI или стандарта ISO (Международная Организация По Стандартизации), и являются общими для многочисленных реализаций, так как они были получены для практического использования. Это дополнительные элементы чисел этих особенностей. Конечно, эти особенности меняются от программы к программе, и их обсуждение предназначено только чтобы показать некоторые общие подходы к ним.
ТИПЫ ДАННЫХТипы данных поддерживаемые стандартом SQL, собраны в Приложении B. Это колличество для CHARACTER и разнообразие числовых типов. Реализация их может, фактически, быть значительно сложнее чем показано в терминах типов, которые они фактически могут использовать. Мы будем здесь обсуждать ряд таких нестандартных типов данных.
ТИПЫ DATE И TIMEКак упомянуто в Главе 2, тип данных DATE широко поддерживается, даже если он не часть стандарта. Мы использовали ранее в нашей таблице Порядков, этот тип использующий формат mm/dd/yyyy. Это стандартный формат IBM в США. Разумеется возможны и другие форматы, и программные реализации часто поддерживают ряд форматов, позволяя вам выбирать тот который лучше для вас подходит. Реализация которая предлагает эту особенность должна быть способна преобразовывать дату одного формата в другой - автоматически.
Имеются несколько основных форматов даты с которыми вы можете сталкнуться:
Стандарт
Формат
Пример
Международная Организация По Стандартизации (ISO)
yyyy-mm-dd
1990-10-31
Японский Индустриальный Стандарт (JIS)
yyyy-mm-dd