Материал: Graber_Martin_-_SQL_dlya_prostykh_smertnykh_-_2014

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Итоги

• Если курсор является обновляемым, его можно применить для управления строками, которые используются командами встроенного SQL UPDATE и

DELETE из предложения WHERE CURRENT OF. DELETE или UPDATE долж­

ны принадлежать той таблице, доступ к которой осуществляется через курсор

запроса.

• SQLCODE может быть объявлен как переменная числового типа для каждой про­ граммы, использующей встроенный SQL. Значения этой переменной устанавли­ ваются автоматически после выполнения каждой SQL-команды.

•Если команда SQL выполняется нормально, но не формирует выходных данных либо не выполняет ожидаемых изменений в базе данных, SQLCODE принимает значение 100. Если команда выдает ошибку, то SQLCODE принимает некоторое отрицательное значение, описывающее причину ошибки, в зависимости от кон­ кретной SQL-системы. В противном случае SQLCODE равен нулю.

•Предложение WHENEVER можно использовать для определения действия, ко­

торое следует выполнить, если SQLCODE принимает значение 100 (NOT FOUND - не найдено) или отрицательное значение (SQLERROR - ошибка при выполнении SQL). Это действие заключается в переходе к некоторой опре­ деленной точке программы (GOTO <метка>) или к выполнению "пустого дейст­ вия" (CONTINUE, эквивалентно понятию "ничего не делать"). По умолчанию принято "пустое действие".

•В качестве индикаторов можно использовать только числовые переменные. Переменные-индикаторы следуют за другими именами переменных в команде

SQL без каких-либо разделяющих символов, за исключением слова INDICATOR.

•Обычно значение переменной-индикатора равно О. Если команда SQL пытается

разместить значение NULL в переменную языка высокого уровня, использую­

щую этот индикатор, то он принимает отрицательное значение. Это свойство можно использовать для защиты от ошибок и в качестве флага, помечающего в SQL NULL-значения, которые будут специально интерпретироваться в основ­ ной программе.

•Переменные-индикаторы можно использовать для вставки NULL-значений в команды SQL INSERT или UPDATE. Они принимают положительные значения

при возникновении ситуации усечения строк.

297

Глава 25. Использование SQL с другими языками программирования

Работаем на SQL

Замечание: Ответы на эти упражнения записаны на псевдокоде, сходном с англий­ ским языком и показывающем логику программы, для того, чтобы помочь читателям, не знакомым с языком программирования Pascal (либо с каким-либо другим языком, из числа тех, что можно использовать для иллюстрации). Обратите внимание на ис­ пользуемые концепции, а не на особенности применения того или иного языка. Для соблюдения последовательности в изложении примеров принят стиль псевдокода, сходный с Pascal. Из программ опущены все детали, выходящие за пределы представ­ ленного в данной главе материала (определение устройств ввода/вывода, связи с базой данных и так далее). Здесь мы представляем один из многих вариантов выполнения

этих упражнений.

1.Разработайте простую программу, которая выбирает все сочетания snum и cnum из таблиц Ordres и Custorners и позволяет увидеть все эти комби­

нации в форме, близкой к письму. Если для значения из таблицы Orders не найдено соответствующего значения из таблицы Customers, то значе­

ние поля snum для этой строки заменяется на соответствующее. Можно

предположить, что курсор с подзапросом является обновляемым (огра­ ничение ANSI, которое относится и к представлениям, но редко исполь­ зуется на практике) и поддерживается базовая целостность базы данных, отличная от тех ошибок, которые фиксируются (первичный ключ являет­ ся уникальным, все значения столбца cnums являются корректными, и т.д.). Следует предусмотреть секцию объявлений (DECLARE) и удосто­ вериться, что все используемые курсоры объявлены.

2. Предположим, данная программа соответствует ограничению ANSI, ка­ сающемуся запрета на использование для курсов или представлений ха­ рактеристики "обновляемый". Как нужно модифицировать программу в этом случае?

3.Разработайте программу, которая дает возможность пользователю изме­ нить значения поля city для продавцов, автоматически увеличивая на .01 комиссионные для продавцов, перемещенных для обслуживания в

Barcelona, и уменьшая их на .О1 для продавцов, перемещенных для обслу­ живания в San Jose. Кроме того, продавцы, расположенные в данный мо­ мент в London, теряют .02 своих комиссионных независимо от смены го­

рода, тогда как для продавцов, не расположенных в настоящее время в

298

London, их следует увеличить до .02. Изменения комиссионных базируются на факте перемещения продавцов. Это не относится к продавцам, распо

ложенным в London. Что касается возможности содержания в полях city и comm NULL-значений, следует придерживаться трактовки, принятой в

SQL. Замечание: это несколько более сложная программа.

(Ответы даны в приложении А.)

299

А

Ответы

к упра31Снениям

Приложение А. Ответы купражнениям

ГЛАВА 1

1.cnum

2.rating

3.Запись - альтернативное название строки.

Поле - альтернативное название столбца.

4.Потому что, по определению, порядок строк не имеет значения.

ГЛАВА2

1.Символ (или текст) и число.

2.Нет.

3.Язык манипулирования данными (DML, Data Manipulation Language).

4.Слово, которое распознается SQL, как специальная инструкция.

ГЛАВАЗ

1.SELECT onum, amt, odate FROM Orders;

2.SELECT •

FROM Customers

WHERE snum =1001;

3.SELECT city, sname, snum, comm FROM Salespeople;

4.SELECT rating, cname

FROM Customers

WHERE city ='San Jose';

5.SELECT DISTINCT snum FROM Orders;

ГЛАВА4

1.SELECT • FROM Orders WHERE amt >1000;

2.SELECT sname, city

FROM Salespeople WHERE city ='London' AND comm >. 10;

3. SELECT •

FROM Customers WHERE rating >100

OR city ='Rome·;

301

Источник: https://studfile.net/preview/16418473/