ИЗВЛЕЧЕНИЕ ЗНАЧЕНИЙ ПЕРЕМЕННЫХ
Кроме помещения значений переменных в
таблицы используя команды SQL, вы можете использовать SQL чтобы получать значения для этих
переменных. Один из
способов делать это - с помощью разновидности команды SELECT которая содержит предложение
INTO. Давайте вернемся
к нашему предыдущему примеру и переместим строку Peel из таблицы Продавцов в наши переменные
главного языка.
EXEC SQL SELECT snum, sname, city, comm INTO :id_num, :salesperson, :loc, :comm FROM Salespeople WHERE snum = 1001;
Выбранные значения помещаются в переменные с упорядоченными именами указанными в предложении
INTO.
Разумееется, переменные с именами указанными в предложении INTO должны иметь соответствующий
тип чтобы принять эти значения, и должна быть своя переменная для каждого выбранного столбца.
Если не учитывать присутствие
предложения INTO, то этот запрос - похож на любой другой. Однако, предложение INTO добавляет
значительное
ограничение к запросу. Запрос должен извлекать не более одной строки. Если он извлекает много
строк, все они не могут
быть вставлены одновременно в одну и ту же переменную. Команда естественно потерпит неудачу.
По этой причине,
SELECT INTO должно использоваться только при следующих условиях:
* когда вы используете предикат проверяющий
значения, которое как вы знаете, могут быть уникальным, как в этом примере. Значения которые,
как вы знаете, могут быть
уникальными - это те значения которые имеют принудительное ограничение уникальности или
уникальный индекс
* когда вы используете одну или более агрегатных функций и не используете GROUP BY.
*
когда вы используете SELECT DISTINCT во внешнем ключе с предикатом ссылающимся на
единственное значение
родительского ключа (обеспечивая вашей системе предписание справочной целостность), как в
следующем примере:
EXEC SQL SELECT DISTINCT snum INTO :salesnum FROM Customers WHERE snum =
(SELECT snum FROM Salespeople WHERE
sname = 'Motika');
Предпологалось что Salespeople.sname и Salespeople.snum - это соответственно, уникальный и
первичный
ключи этой таблицы, а Customers.snum - это внешний ключ ссылающийся на Salespeople.snum, и вы
предполагали что этот
запрос произведет единственную строку. Имеются другие случаи, когда вы можете знаете, что
запрос должен произвести
единственную строку вывода, но они мало известны и, в большинстве случаев, вы основываетесь
на том что ваши данные
имеют целостность, которая не может быть предписана с помощью ограничений. Не полагайтесь на
это! Вы создаете
программу которая, вероятно, будет использоваться в течение некоторого времени, и лучше всего
проиграть ее чтобы быть
гарантированным в будущем от возможных отказов. Во всяком случае, нет необходимости
группировать запросы которые
производут одиночные строки, поскольку SELECT INTO - используется только для удобства. Как вы
увидите, вы можете
использовать запросы выводящие многочисленные строки, используя курсор.