DB2 – система управления реляционными базами данных. Заданное число упорядоченных столбцов и неупорядоченные строки, страница 19


Самоссылающиеся соединения (2)

SELECT p1.fname, p1.lname, p2.fname, p2.lname,

p1.town

FROM sales_person p1, sales_person p2

WHERE p1.town = p2.town

  • Каждый человек будет “соединяться” сам с обой. Как мы можем бороться с этим?

Чтобы использовать таблицу в самоссылающемся соединении, необходимо использовать корреляционные имена.

В этом примере мы запрашиваем служащих-продавцов, которые живет в одном и том же городе. Таблица sales_person используется дважды; однажды как P1 и однажды как P2. Предложение WHERE подбирает строки, у которых один и тот же город.

В этом примере есть один недостаток – служащие-продавцы будут “соединяться”сами с собой. Чтобы этого не происходило, необходимо добавить предикат в предложение WHERE.


Использование host-переменных (1)

  • Host-переменные могут использоваться для передачи значений во встроенный SQL
  • Во встроенном SQLhost-переменные отмечаются добавлением двоеточия, например:

EXEC SQL

INSERT INTO CRIMES

(CRIME_CODE, CRIME)

VALUES

( :ccode, :the_crime );

После декларирования host-переменных, их можно использовать в SQL предложениях.


Объявление host-переменных

  • Host-переменные – это переменные, определенные на языке программирования; в этом примере выбран язык программирования C
  • До того, как вы сможете использовать host -переменные во встроенном SQL, вы должны продекларировать их, чтобы SQL знал об их существовании

EXEC SQL BEGIN DECLARE SECTION;

short ccode;

char the_crime[79];

EXEC SQL END DECLARE SECTION;

Для того, чтобы сделать программы более гибкими, мы можем использовать переменные в SQL. Эти переменные, называемые хост-переменными, будут распознаваться и SQL и host-языком.

Все host-переменные должны быть объявлены в разделе

BEGIN DECLARE SECTION;

END DECLARE SECTION;


Host-переменные и индикаторные переменные

  • Вы можете проинициализировать host-переменную допустимым значением перед выполнением запроса и, если после выполнения запроса она будет содержать то же значение, то значение столбца пусто (NULL)
  • Корректный способ обращения к столбцам с NULL-атрибутом -  использование индикаторных переменных
  • Индикаторные переменные должны объявляться как shortint

EXEC SQL BEGIN DECLARE SECTION;

short ccode;

char the_crime [79];

short indicator;

EXEC SQL END DECLARE SECTION;

Поля, которые могут содержать NULL значения, требуют специальной обработки.

DB2 не обновляет host-переменную, если связанный с ней столбец содержит NULL-значение.


Использование индикаторных переменных

·  Индикаторная переменная, если она требуется, должна следовать за host-переменной, например:

EXEC SQL

                     SELECT CRIME

                     INTO :the_crime :indicator

                     FROM CRIMES

                     WHERE CRIME_CODE = :ccode;

·  Приложение должно протестировать значение индикаторной переменной.  Если значение индикаторной переменной:

>=0 ,  в host-переменную принято не пустое значение (не NULL)

<  0 ,   значение столба – NULL (значение отсутствует)

Индикаторная переменная должна следовать сразу же за host-переменной без запятой.


Использование курсоров

·  DB2 включает механизм, называемый курсором, позволяющий приложению извлекать множество строк.

·  Вы можете использовать курсор чтобы извлечь строки из результирующего множества.

·  Курсор идентифицирует текущую строку результирующей таблицы, полученной в результате выполнения SELECT.

·  Приложение может извлечь последовательно каждую строку результирующей таблицы.

  • Когда считана последняя строка результирующей таблицы и больше строк не найдено, приложение принимает SQLCODE = 100 (‘notfound’)

Работа с курсорами


       Декларирование курсора


                                  Открытие курсора