Мартин Грубер - Понимание SQL (991940), страница 51
Текст из файла (страница 51)
}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) Десятичное число; то есть, число которое может иметь десятичную точку. Здесь аргумент размера имеет две части: точность имасштаб.
Масштаб не может превышать точность. Сначала указывается точность, разделительная запятая и далее аргументмасштаба. Точность указывает сколько значащих цифр имеетчисло. Максимальное десятичное число составляющее номер —реализационно-определенное значение, равное или большеечем этот номер. Масштаб указывает максимальное число цифрсправо от десятичной точки. Масштаб = 0 делает поле эквивалентом целого числа.NUMERICТакое же как DECIMAL за исключением того, что максимальноедесятичное не может превышать аргумента точности.INT (или INTEGER) Число без десятичной точки.
Эквивалентно DECIMAL, но безцифр справа от десятичной точки, то есть с масштабом равнымSMALLINT0. Аргумент размера не используется (он автоматически установливается в реализационно-зависимое значение).Такое же как INTEGER, за исключением того, что, в зависимостиот реализации, размер по умолчанию может (или не может)быть меньшее чем INTEGER.APPROXIMATE NUMERICПРИБЛИЗИТЕЛЬНОЕ ЧИСЛОFLOATREALDOUBLE PRECISIONЧисло с плавающей запятой на основе 10 показательнойфункции. Аргумент размера состоит из одного числа определяющего минимальную точность.Такое же как FLOAT, за исключением того, что никакого аргумента размера не используется. Точность установлена реализационно-зависимую по умолчанию.Такое же как REAL, за исключением того, что (или DOUBLE)реализационно-определяемаяточностьдляDOUBLEPRECISIONдолжнапревышатьреализационноопределяемую точность REAL.ЭКВИВАЛЕНТНЫЕ ТИПЫ ДАННЫХ В ДРУГИХ ЯЗЫКАХКогда используется вложение SQL в другие языки, значения, используемые ипроизведенные командами SQL, обычно сохраняются в переменных главного языка(см.
Главу 25). Эти переменные должны иметь тип данных, совместимый со значениями SQL, которые они будут получать. В дополнениях, которые не являются частьюофициального SQL стандарта, ANSI обеспечивает поддержку при использованиивложения SQL в четыре языка: Паскаль, PL/I, КОБОЛ, и ФОРТРАН. Между прочим, онвключает определение эквивалентов SQL для данных типов переменных, используемых в этих языках.Эквиваленты типов данных четырех языков определенных ANSI:ПЛ/ISQL ТИПЭКВИВАЛЕНТ ПЛ/ICHARDECIMALINTEGERFLOATCHARFIXED DECIMALFIXED BINARYFLOAT BINARYКОБОЛSQL ТИПЭКВИВАЛЕНТ КОБОЛАCHAR(<integer>)INTEGERNUMERICPIC X (<integer>)PIC S (<nines>) USAGE COMPUTTATIONALPIC S (<nines with embedded V>) DISPLAY SING LEADING SEPERATEПАСКАЛЬSQL ТИПЭКВИВАЛЕНТ ПАСКАЛЯINTEGERREALCHAR (<length>)INTEGERREALPACKED ARRAY [1..<length>] OF CHARФОРТРАНSQL ТИПЭКВИВАЛЕНТ ФОРТРАНАCHARINTEGERREALDOUBLE PRECISIONCHARINTEGERREALDOUBLE PRECISIONПриложениеCНЕКОТОРЫЕ ОБЩИЕНЕСТАНДАРТНЫЕСРЕДСТВА SQLИМЕЕТСЯ РЯД ОСОБЕННОСТЕЙ ЯЗЫКА SQL, которые пока не определены какчасть стандарта ANSI или стандарта ISO (Международная Организация По Стандартизации), и являются общими для многочисленных реализаций, так как они были получены для практического использования.Это дополнительные элементы чисел этих особенностей.
Конечно, эти особенности меняются от программы к программе, и их обсуждение предназначено толькочтобы показать некоторые общие подходы к ним.ТИПЫ ДАННЫХТипы данных, поддерживаемые стандартом SQL, собраны в Приложении B. Этоколличество для CHARACTER и разнообразие числовых типов. Реализация их может, фактически, быть значительно сложнее, чем показано в терминах типов, которыеони фактически могут использовать. Мы будем здесь обсуждать ряд таких нестандартных типов данных.ТИПЫ DATE И TIMEКак упомянуто в Главе 2, тип данных DATE широко поддерживается, даже еслион не часть стандарта.
Мы использовали ранее в нашей таблице Порядков этот тип,использующий формат mm/dd/yyyy. Это стандартный формат IBM в США. Разумеется,возможны и другие форматы, и программные реализации часто поддерживают рядформатов, позволяя вам выбирать тот, который лучше для вас подходит. Реализация,которая предлагает эту особенность, должна быть способна преобразовывать датуодного формата в другой — автоматически.Имеются несколько основных форматов даты, с которыми вы можете столкнуться:СтандартМеждународная Организация По Стандартизации (ISO)Японский Индустриальный Стандарт (JIS)IBM Европейский Стандарт (EUR)Форматyyyy-mm-ddyyyy-mm-dddd.mm.yyyyПример1990-10-311990-10-3110.31.1990Наличие специального типа, определяемого для даты, дает возможность выполнять арифметические операция с датами. Например, вы можете добавлять числодней к дате и получать другую дату в программе, самостоятельно следящей за числом дней в месяцах, високосными годами и так далее.
Даты могут также сравниваться; например фраза, дата A < дата B означает, что дата A предшествует дате B повремени.Кроме даты, большое количество программ определяют специальный тип длявремени, который может также быть представлен в ряде форматов, включая следующие:СтандартМеждународная Организация По Стандартизации (ISO)Японский Индустриальный Стандарт (JIS)IBM Европейский СтандартIBM USA Стандарт (USA)Форматhh-mm-sshh-mm-sshh-mm-sshh.mm AM/PMПример21.04.3721.04.3721.04.379.04 PMВремя может добавляться или сравниваться точно также как дата, с коррекциейчисла секунд в минутах или часах автоматически.
Кроме того, специально встроенныеконстанты, указывающие текущую дату или время (CURDATE или CURTIME) являютсяобщими. Они похожи на константу USER (Пользователь), в которой их значение будетнепрерывно меняться.Можете ли вы включать время и дату в одно поле? Некоторые реализации определяют тип DATE достаточно точно, чтобы включать туда еще и TIME.В качестве альтернативы, третий обобщающий тип, TIMESTAMP, может бытьопределен как комбинация этих двух.ТИПЫ ТЕКСТОВОЙ СТРОКИANSI поддерживает только один тип чтобы представлять текст.
Это — тип CHAR.Любое поле такого типа должно иметь определенную длину. Если строка, вставляемая в поле, меньше, чем длина поля, она дополняется пробелами; строка не можетбыть длиннее, чем длина поля.Хотя и достаточно удобное, это определение все же имеет некоторые ограничения для пользователя. Например, символьные поля должны иметь одинаковую длину,чтобы можно было выполнить команду UNION. Большинство реализаций поддерживают строки переменной длины для типов данных VARCHAR и LONG VARCHAR (илипросто LONG). В то время как поле типа CHAR всегда может распределить памятьдля максимального числа символов, которое может сохраняться в поле, полеVARCHAR при любом количестве символов может распределить только определенное количество памяти, чтобы сохранить фактическое содержание поля, хотя SQLможет установить снаружи некоторое дополнительное пространство памяти, чтобыследить за текущей длиной поля.Поле VARCHAR может быть любой длины, включая реализационноопределяемый максимум.
Этот максимум может меняться от 254 до 2048 символовдля VARCHAR, и до 16000 символов для LONG. LONG обычно используется для текста пояснительного характера или для данных, которые не могут легко сжиматься впростые значения полей; VARCHAR может использоваться для любой текстовой строки чья длина может меняться.Между прочим, не всегда хорошо использовать VARCHAR вместо CHAR. Извлечение и модифицирование полей VARCHAR — более сложный и, следовательно, более медленный процесс, чем извлечение и модифицирование полей CHAR. Крометого, некоторое количество памяти VARCHAR остается всегда неиспользованной (врезерве) для гарантии вмещения всей длины строки.Вы должны просчитывать, насколько значения полей могут меняться по длине, атакже, способны ли они к объединению с другими полями, перед тем как решить, использовать CHAR или VARCHAR.
Часто, тип LONG используется для сохранения двоичных данных. Естественно, что использование размера такого "неуклюжего" полябудет ограничивать оперативность SQL.Проконсультируйтесь с вашим руководством.КОМАНДА FORMATКак мы подчеркивали в Главе 7, процесс вывода, выполняемого в стандартеSQL — ограничен.
Хотя большинство реализаций включают SQL в пакеты, имеющиедругие средства для управления этой функцией, некоторые реализации также используют команду типа FORMAT внутри SQL, чтобы навязывать выводу запроса определенные формы, структуры или ограничения. Среди возможных функций командыFORMAT существуют такие:* определение ширины столбцов (при печати).* определение представления NULL значений.* обеспечение (новых) заголовков для столбцов.* обеспечение заголовков внизу или вверху страниц выводимых на печать.* навязывает присвоение или изменение форматам полей содержащих значения даты, времени или денежной суммы.* вычисляет общие и промежуточные суммы, не исключая возможности обобщения поля, как это делает например SUM. (Альтернативным подходом к этой проблеме в некоторых программах является предложение COMPUTE.)Команда FORMAT может вводиться сразу перед или сразу после запроса, к которому она применяется, в зависимости от реализации.