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

1 ... 158 159 160 [ 161 ] 162 163 164 ... 264


Фиксированная часть Описание

DATETIME INTERVAL CODE код формата предстамения даты/времени

DATETiME iNTERVAL PRECisiON код ТОЧНОСТИ Представления даты/времени

hullable указывает, может ли элемент принимать значение null

INDICATOR указывает, содержит ли элемент данных значение null

(индикатор)

DATA сам элемент данных

NAME имя элемента данных

UNNAMED указывает, отсутствует ли у элемента данных имя

Чтобы понять, как работают инструкции управления дескрипторами, рассмотрим еще раз программу обновления таблицы, изображенную на рис. 18.8. Эта программа иллюстрирует процедуру использования области sqlda в инструкции execute. Если вместо области sqlda применить дескриптор стандарта SQL2, то общий вид программы не изменится, но в нее будет внесено много мелких изменений.

Перед тем как использовать дескриптор, программа должна вьщелить под него память с помощью следующей инструкции:

ALLOCATE DESCRIPTOR parmdesc WITH MAX :parmcnt;

Эта инструкция заменяет операцию выделения памяти для структуры parmda, обозначенную на рис. 18.8 цифрой 1. Дескриптор (названный parmdesc) будет выполнять те же функвди, что и указанная структура. Обратите внимание на го, что профамма, представленная на рис 18,8, прежде чем выделять память для структуры parmda должна сначала подсчитать требуемый ее объем. При использовании дескриптора эти вычисления не требуются и базовая профамма просто сообщает СУБД, сколько элементов должна вмещать переменная часть дескриптора.

Далее профамма должна занести в дескриптор описания передаваемых параметров- их типы данных, длину и тому подобное Цикл программы, обозначенный цифрой 2, остаетсябез изменений, но детали передачи информации в дескриптор отличаются от аналогичной операции для области sqlda. Операции занесения типа данных и длины парамефа в область sqlda (обозначенные цифрами 3 и 4) заменяются операцией передачи этой информации в дескриптор с помощью инсфукций set descriptor, как показано ниже:

typpcode = columns[i].typecode; lenqth = colnrans[J].buflen;

SET DESCRlPrOR parmde-r VALUE (:i + 1) TYPE = :typecode ЗЕТ DESCRIPTOR parmdesc VALUE {:i + 1) LENGTH = :length;

Отличия or рис. 18.8 видны невооруженным глазом. Так как дескриптор находится в СУБД, тип данных и длина должны быть переданы в СУБД посредством инструкции set descriptor, использующей базовые переменные. Кроме того, в программе, представленной на рис. 18.8, используются коды типов данных, присущие только DB2. Различные коды типов данных, применяемые в разных СУБД, являются в динамическом SQL главной проблемой, препятствующей переносимости баз данных Стандарт SQL2 устраняет эту проблему, так как в нем установлены целочисленные коды для всех типов данных, включенных в стандарт (табл. 18.3). Поэтому, помимо всех прочих изменений, коды типов данных в структуре columns, представленной на рис 18.8, должны быть заменены кодами из стандарта SQL2.



Таблица 18.3. Коды типов данн1&в SQL2

Тип данных Код

Коды типа данных (поле type дескриптора)

integer 4

smallint 5

numeric 2

decimal 3

float 6

real 7

double precision 8

character 1

character varying 12

bit 14

bit varying 15

date/time/timestamp 9

interval 10

Дополнительные коды формата представления даты/времени (поле datetime interval C0de дескриптора)

date 1

time 2

time with time zone 4

timestamp 3

timestamp with time zone 5

Дополнительные коды точности представления даты/времени (поле datetime INTerval pre-CISION дескриптора)

year 1

month 2

day 3

hour 4

minute 5

second 6

year - month 7

Day - hour 8

day - minute 9

day - second Ю

hour - minute 11

hour - second 12

minute - second 13

Инструкции, обозначенные на рис. 18.8 цифрами 5 и 6, привязывают структуру данных sqlda к используемым программой буферам, в которых содержатся значения параметров и соответствующих переменных-индикаторов. Реально инструкции заносят в область sqlda указатели на эти буферы, чтобы ими мог- а пользоваться СУБД. В случае дескриптора такая привязка не требуется. Значения данных и индикаторов передаются позднее как базовые переменные.



Таким образом, при переходе на стандарт SQL2 инструкции, обозначенные цифрами 5 и 6, должны быть исключены из программы.

Инструкция, обозначенная на рис. 18 8 цифрой 7, записывает в область sqlda число параметров, передаваемых в СУБД. В дескриптор также должно быть занесено число передаваемых параметров Это осуществляется с помощью следующей инструкции set descriptor;

SET DESCRIPTOR parmdesc COUNT = :parmcnt;

Строго говоря, эта инструкция должна быть выполнена ранее, еще до цикла В стандарте SQL2 определен исчерпывающий набор правил, описывающих, как установка значений одних полей дескриптора влияет на сброс значений других его полей По сути, эти правила устанавливают иерархию записи информации в дескриптор Например, если для какого-то параметра вы записываете в дескриптор код типа данных, указывающий на целое число, то поле length дескриптора будет сброшено в некое начальное значение, зависящее от реализации. Обычно это не приводит к усложнению процесса программирования, но необходимо четко понимать, если ранее в программе вы записали какое-то значение в дескриптор, то это не означает, что данное значение будет находиться там постоянно. Дескриптор необходимо заполнять по иерархическому принципу, начиная с информации высокого уровня (например, число элементов и их типы данных) и заканчивая более низкоуровневыми сведениями (длина элемента, подтип, разрешены ли значения null и т.п.).

Далее инструкция prepare компилирует динамическую инструкцию update, здесь никакие изменения не требуются. Затем программа входит в цикл for, запрашивая у пользователя значения параметров. Принципиальные различия здесь отсутствуют, но дескриптор используется не так, как область sqlda.

Если пользователь указывает, что должно быть присвоено значение null (вводя звездочку в ответ на запрос), то программа на рис. 18.8 присваивает соответствующее значение буферу индикатора с помощью следующей инструкции:

*(parmvar -> sqlind) = -1;

Если же должно быть присвоено значение, отличное от null, то программа инициализирует буфер индикатора посредством такой инструкции:

*(parmvar -> sqlind) = 0;

В случае использования дескриптора эти инструкции заменяются парой инструкций set descriptor:

SET DESCRIPTOR parmdesc VALUE, (:] + 1) INDICATOR = -1; SET DESCRIPTOR parmdesc VALUE (:] + 1) INDICATOR = 0;

Здесь обратите внимание на то, как счетчик цикла указывает, какой элемент заносится в дескриптор, а также на то, что осуществляется прямая передача данных (в данном случае констант), в отличие от использования указателей на буферы в области sqlda.

Наконец, представленная на рис. 18.8 программа передает в СУБД через область sqlda значение параметра, введенное пользователем. Инструкции, обозначенные цифрой 8, выполняют эту задачу для данных разных типов, преобразуя введенные символы в двоичные последовательности и помещая их в буферы, указанные в области sqlda При переходе к стандарту SQL2 указатели на буферы, а также функции, осуществляющие прямые операции над областью sqlda, заменяются инструкцией set descriptor-



1 ... 158 159 160 [ 161 ] 162 163 164 ... 264

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