Единичное 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;


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: