Кроме помещения значений переменных в таблицы используя команды SQL, вы можете использовать SQL чтобы получать значения для этих перемен- ных. Один из способов делать это - с помощью разновидности команды SE- LECT которая содержит предложение 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 должно использоваться только при следующих условиях: * когда вы используете предикат проверяющий значения, которое как вы знаете, могут быть уникальным, как в этом примере. Значения кото- рые, как вы знаете, могут быть уникальными - это те значения кото- рые имеют принудительное ограничение уникальности или уникальный индекс, как это говорилось в Главах 17 и 18. * когда вы используете одну или более агрегатных функций и не исполь- зуете 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 - это соот- ветственно, уникальный и первичный ключи этой таблицы, а Custo- mers.snum - это внешний ключ ссылающийся на Salespeople.snum, и вы предполагали что этот запрос произведет единственную строку. Имеются другие случаи, когда вы можете знаете, что запрос должен произвести единственную строку вывода, но они мало известны и, в большинстве слу- чаев, вы основываетесь на том что ваши данные имеют целостность, кото- рая не может быть предписана с помощью ограничений. Не полагайтесь на это! Вы создаете программу которая, вероятно, будет использоваться в течение некоторого времени, и лучше всего проиграть ее чтобы быть га- рантированным в будущем от возможных отказов. Во всяком случае, нет необходимости группировать запросы которые производут одиночные стро- ки, поскольку SELECT INTO - используется только для удобства. Как вы увидите, вы можете использовать запросы выводящие многочис- ленные строки, используя курсор.