РУКОВОДСТВО ПО РЕЛЯЦИОННОЙ СУБД DB2

         

ЕДИНИЧНОЕ SELECT


Выдать состояние и город для поставщика, номер которого задается переменной включающего языка ЗАДАННЫИ_НОМЕР.

ЕХЕС       SQL     SELECT           СОСТОЯНИЕ, ГОРОД

INTO                           :РАНГ, :ГОРОД

FROM              S

WHERE           НОМЕР_ПОСТАВЩИКА = :ЗАДАННЫЙ_НОМЕР;

Термин «единичное

SELECT» используется здесь для обозначения предложения SELECT, которое продуцирует таблицу, содержащую не более одной строки. В данном примере, если существует в точности одна запись в таблице S, удовлетворяющая условию WHERE, то значения СОСТОЯНИЕ и ГОРОД из этой записи будут присвоены, как требовалось в запросе, переменным включающего языка РАНГ и ГОРОД, a SQLCODE будет установлено в нуль. Если же никакая запись в S не удовлетворяет условию WHERE, поле SQLCODE примет значение +100. Если, наконец, существует более одной такой записи, возникает ошибка, и значение SQLCODE будет отрицательным. В последних двух случаях значения переменных включающего языка РАНГ и ГОРОД останутся неизменными.

В связи с приведенным примером возникает другой вопрос. Что произойдет, если предложение SELECT в действительности выберет в точности одну запись, но значение поля СОСТОЯНИЕ (или поля ГОРОД) в ней окажется неопределенным? Как показано выше, в таком случае будет иметь место ошибка, и полю SQLCODE будет присвоено некоторое отрицательное значение. Если существует шанс, что выбираемое значение поля может быть неопределенным, пользователь должен предусмотреть индикаторную переменную для этого поля во фразе INTO, а также обычную целевую переменную, как показано в следующем примере:

ЕХЕС       SQL     SELECT           СОСТОЯНИЕ, ГОРОД

INTO               :РАНГ: ИНД_РАНГА, :ГОРОД: ИНД_ГОРОДА

FROM              S

WHERE           НОМЕР_ПОСТАВЩИКА = :ЗАДАННЫЙ_НОМЕР;

IF ИНД_РАНГА < 0 THEN / » значение поля состояние было неопределенным */. . .;



IF ИНД_ГОРОДА < 0 THEN / * значение поля ГОРОД было неопределенным */. . .;

Если поле, выборка которого осуществляется, имеет неопределенное значение, и была специфицирована индикаторная переменная, то этой индикаторной переменной будет присвоено соответствующее отрицательное значение, а обычная целевая переменная останется неизменной. Индикаторная переменная специфицируется, как показано в приведенном примере, т. е. она следует за соответствующей обычной целевой переменной и отделяется от этой целевой переменной двоеточием. Индикаторные переменные следует объявлять как 15-битовые двоичные целые со знаком.

Примечание.

Индикаторные переменные не могут использоваться во фразе WHERE. Например, следующий фрагмент программы некорректен:

ИНД_РАНГА = -1;

ЕХЕС       SQL     SELECT           ГОРОД

INTO                           :ГОРОД

FROM              S

WHERE           СОСТОЯНИЕ = :РАНГ : ИНД_РАНГА;

Правильный способ выборки городов при неопределенном значении поля СОСТОЯНИЕ иллюстрируется ниже:

ЕХЕС       SQL     SELECT           ГОРОД

INTO               :ГОРОД

FROM              S

WHERE           СОСТОЯНИЕ IS NULL;



Содержание раздела