Другое использование переменной INDICATOR
Переменная indicator также может использоваться для назначения значения NULL. Просто добавьте ее к имени главной переменной в команде UPDATE или INSERT тем же способом что и в команде SELECT. Если переменная indicator имеет отрицательное значение, значение NULL будет помещено в поле. Например, следующая команда помещает значения NULL в поля city и comm, таблицы Продавцов, всякий раз, когда переменные indicator — i_a или i_b будут отрицательными; в противном случае она помещает туда значения главных переменных: EXEC SQL INSERT INTO Salespeople Переменная indicator используется также, чтобы показывать отбрасываемую строку. Это произойдет если вы вставляете значения символов SQL в главную переменную, которая не достаточно длинна чтобы вместить все символы. Это особая проблема с нестандартным типами данных — VARCHAR и LONG (смотри Приложение C). В этом случае, переменная будет заполнена первыми символами строки, а последние символы будут потеряны. Если используется переменная indicator, она будет установлена в положительное значение, указывающее на длину отбрасываемой части строки, позволяя, таким образом, узнать, сколько символов было потеряно. В этом случае, Вы можете проверить с помощью просмотра — значение переменной indicator > 0, или < 0. Резюме Команды SQL вкладываются в процедурные языки, чтобы объединить силы двух подходов. Некоторые дополнительные средства SQL необходимы, чтобы выполнить эту работу. Вложенные команды SQL транслируемые программой, называемой прекомпилятором, в форму пригодную для использования транслятором главного языка, и используемые в этом главном языке, как вызовы процедуры к подпрограммам, которые создает прекомпилятор, называются — м одулями доступа. ANSI поддерживает вложение SQL в языки: ПАСКАЛЬ, ФОРТРАН, КОБОЛ, и PL/I. Другие языки также используются, особенно Си. В попытке кратко описать встроенный SQL, имеются наиболее важные места в этой главе:
· Все вложенные команды SQL начинаются словами EXEC SQL и заканчиваются способом, который зависит от используемого главного языка. · Все главные переменные, доступные в командах SQL, должны быть объявлены в разделе объявлений SQL прежде, чем они будут использованы. · Всем главным переменным должно предшествовать двоеточие, когда они используются в команде SQL. · Запросы могут сохранять свой вывод непосредственно в главных переменных, используя предложение INTO, если и только если, они выбирают единственную строку. · Курсоры могут использоваться для сохранения вывода запроса, и доступа к одной строке в каждый момент времени. Курсоры бывают объявленными (если определяют запрос в котором будут содержаться), открытыми (если выполняют запрос), и закрытыми (если удаляют вывод запроса из курсора). Если курсор открыт, команда FETCH используется, чтобы перемещать его по очереди к каждой строке вывода запроса. · Курсоры являются модифицируемыми или только для чтения. Чтобы стать модифицируемым, курсор должен удовлетворять всем критериям, которым удовлетворяет просмотр(VIEW); кроме того, он не должен использовать предложений ORDER BY или UNION, которые в любом случае не могут использоваться просмотрами. Не модифицируемый курсор является курсором только для чтения. · Если курсор модифицируемый, он может использоваться для определения, какие строки задействованы вложенными командами UPDATE и DELETE через предложение WHERE CURRENT OF. DELETE или UPDATE должны быть вне той таблицы, к которой курсор обращается в запросе. · SQLCODE должен быть объявлен как переменная числового типа для каждой программы, которая будет использовать встроенный SQL. Его значение устанавливается автоматически после выполнения каждой команды SQL.
· Если команда SQL выполнена как обычно, но не произвела вывода или ожидаемого изменения в базе данных, SQLCODE = 100. Если команда произвела ошибку, SQLCODE будет равняться некоторому отрицательному числу, которое описывает ошибку. В противном случае, SQLCODE = 0. · Предложение WHENEVER может использоваться для определения действия, которое нужно предпринять, когда SQLCODE = 100 (не найдено) или когда SQLCODE равен отрицательному числу (SQLERROR). Действием может быть или переход к некоторой определенной метке в программе (GOTO <label>) или отсутствие какого-либо действия вообще (продолжить). Последнее установлено по умолчанию. · Числовые переменные могут также использоваться как переменные indicator. Переменные indicator следуют за другими именами переменных в команде SQL, без каких бы то ни было посторонних символов кроме (необязательного) слова INDICATOR. · Обычно значение переменной indicator = 0. Если команда SQL пытается поместить NULL значение в главную переменную, которая использует indicator, indicator будет установлен в отрицательное значение. Этот факт можно использовать, чтобы предотвращать ошибки и для обнаружения NULL значений SQL для специальной обработки их в главной программе. · Переменная indicator может использоваться для вставки NULL значений в команды SQL — INSERT или UPDATE. Она также может принимать положительное значение, указывающее на длину отбрасываемой части строки, не поместившейся в предельные границы какой-нибудь переменной, куда эта строка помещалась. Работа с SQL Обратите внимание: Ответы для этих упражнений написаны в псевдокодах, являющихся английским языком описания логики, которой должна следовать программа. Это сделано для того, чтобы помочь читателям, которые могут быть незнакомы с Паскалем (или любым другим языком). Кроме того, это лучше сфокусирует ваше внимание на включаемых понятиях, опуская частности того или другого языка. Чтобы не противоречить нашим примерам, стиль псевдокода будет напоминать Паскаль. Мы опустим из программ все, что не относится напрямую к рассматриваемым вопросам, например, определение устройств ввода-вывода, подключение к базе данных, и так далее. Конечно, имеется много способов, чтобы выполнять такие упражнения; и совсем не обязательно, что представленные варианты решений являются самыми удачными.
1. Разработайте простую программу, которая выберет все комбинации полей snum и cnum из таблиц Заказов и Заказчиков и выясните, всегда ли предыдущая комбинация такая же, как последующая. Если комбинация из таблицы Заказов не найдена в таблице Заказчиков, значение поля snum для этой строки будет изменено на удовлетворяющее условию совпадения. Вы должны помнить, что курсор с подзапросом — модифицируем (ANSI ограничение, также применимо к просмотрам, и что базисная целостность базы данных это не тоже самое, что проверка на ошибку (т.е. первичные ключи уникальны, все поля cnums в таблице Заказов правильны, и так далее). Проверьте раздел объявлений, и убедитесь, что там объявлены все используемые курсоры. 2. Предположим, что ваша программа предписывает ANSI запрещение курсоры или просмотры, использующие модифицируемые подзапросы. Как вы должны изменить вышеупомянутую программу? 3. Разработайте программу, которая подсказывает пользователям изменить значения поля city продавца, автоматически увеличивает комиссионные на.01 для продавца, переводимого в Барселону и уменьшает их на.01 для продавца, переводимого в Сан-Хосе. Кроме того, продавец, находящийся в Лондоне, должен потерять.02 из своих комиссионных, независимо от того, меняет он город или нет, в то время как продавец, не находящийся в Лондоне, должен иметь увеличение комиссионных на.02. Изменение в комиссионных, основывающееся на нахождении продавца в Лондоне, может применяться независимо от того, куда тот переводится. Выясните, могут ли поле city или поле comm содержать NULL значения, и обработайте их, как это делается в SQL. Предупреждение: эта программа имеет некоторые сокращения. (См. Приложение A для ответов.) Приложение A Ответы для упражнений Глава 1 cnum rating Другим словом для строки является запись. Другим словом для столбца является поле. Потому что строки, по определению, находятся без какого либо определенного упорядочения.
Глава 2 Символ (или текст) и номер Нет Язык Манипулирования Данными (ЯЗЫК DML) Это слово в SQL имеет специальное учебное значение Глава 3 SELECT onum, amt, odate SELECT * SELECT city, sname, snum, comm SELECT rating, cname SELECT DISTINCT snum Глава 4 SELECT * SELECT sname, city SELECT * или SELECT * или SELECT * Могут быть еще другие решения. onumamtodatecnumsnum onumamtodatecnumsnum SELECT * Глава 5 SELECT * и SELECT * SELECT * SELECT * ПРИМЕЧАНИЕ: В ASCII базовой системе Hoffman не будет выведен из-за конечных пробелов после H. По той же самой причине вторая граница не может быть G, поскольку она не выведет имена Giovanni и Grass. G может использоваться в сопровождении с Z, так чтобы следовать за другими символами в алфавитном Заказе, а не предшествовать им, как это делают пробелы. SELECT * SELECT * или SELECT * Глава 6 SELECT COUNT(*) SELECT COUNT (DISTINCT city) SELECT cnum, MIN (amt) SELECT MIN (cname) SELECT city, MAX (rating) SELECT odate, count (DISTINCT snum) Глава 7 SELECT onum, snum, amt *.12 SELECT 'For the city ', city, ', the highest rating is ', MAX (rating) SELECT rating, cname, cnum SELECT odate, SUM (amt) Глава 8 SELECT onum, cname SELECT onum, cname, sname SELECT cname, sname, comm SELECT onum, comm * amt Глава 9 SELECT first.sname, second.sname Псевдонимам нет необходимости иметь именно такие имена. SELECT cname, first.onum, second.onum Ваш вывод может иметь некоторые отличия, но в вашем ответе все логические компоненты должны быть такими же. SELECT a.cname, a.city Глава 10 SELECT *
или SELECT * SELECT DISTINCT cname, rating SELECT snum, SUM (amt) Глава 11 SELECT cnum, cname Решение с помощью соотнесенного подзапроса: SELECT snum, sname Решение с помощью объединения: SELECT DISTINCT first.snum, sname Соотнесенный подзапрос находит всех заказчиков, не обслуживаемых данным продавцом, и выясняет: живет ли кто-нибудь из них в его городе. Решение с помощью объединения является более простым и более интуитивным. Оно находит случаи, где поля city совпадают, а поля snums нет. Следовательно, объединение является более изящным решением для этой проблемы, чем то, которое мы исследовали до этого. Имеется еще более изящное решение с помощью подзапроса, с которым Вы столкнетесь позже. Глава 12 SELECT * SELECT a.snum, sname, a.city, comm SELECT * SELECT * Глава 13 SELECT * cnumcnamecityratingsnum SELECT * или SELECT * SELECT * SELECT * Глава 14 SELECT cname, city, rating, 'High Rating' UNION SELECT cname, city, rating, ' Low Ratlng' или SELECT cname, city, rating, 'High Rating' UNION SELECT cname, city, rating, ' Low Rating' Различие между этими двумя предложениями — в форме второго предиката. Обратите внимание,что в обоих случаях строка "Low Rating" имеет в начале дополнительный пробел для того, чтобы совпадать со строкой "High Rating" по длине. SELECT cnum, cname UNION SELECT snum, sname ORDER BY 2; SELECT snum UNION (SELECT cnum UNION ALL SELECT onum Глава 15 INSERT INTO Salespeople (city, cname, comm, cnum) DELETE FROM Orders WHERE cnum = 2006; UPDATE Customers UPDATE Customers Глава 16 INSERT INTO Multicust DELETE FROM Customers UPDATE Salespeople В более сложный вариант этой команды можно было бы вставить проверку, чтобы убедиться, что значения комиссионных не превышают 1.0 (100%): UPDATE Salespeople Эти проблемы могут иметь другие, такие же хорошие решения. Глава 17 CREATE TABLE Customers CREATE INDEX Datesearch ON Orders(odate); (Все индексные имена, используемые в этих ответах — произвольные.) CREATE UNIQUE INDEX Onumkey ON Orders(onum); CREATE INDEX Mydate ON Orders(snum, odate); CREATE UNIQUE INDEX Combination ON Customers(snum, rating); Глава 18 CREATE TABLE Orders или CREATE TABLE Orders Первое решение предпочтительнее. CREATE TABLE Salespeople CREATE TABLE Orders Глава 19 CREATE TABLE Cityorders CREATE TABLE Orders Глава 20 CREATE VIEW Highratings CREATE VIEW Citynumber CREATE VIEW Nameorders CREATE VIEW Multcustomers Глава 21 #1 — не модифицируемый, потому что он использует DISTINCT. #2 — не модифицируемый, потому что он использует объединение, агрегатную функцию и GROUP BY. #3 — не модифицируемый, потому что он основывается на #1, который сам по себе не модифицируемый. CREATE VIEW Commissions CREATE TABLE Orders CREATE VIEW Entryorders Глава 22 GRANT UPDATE (rating) ON Customers TO Janet; GRANT SELECT ON Orders TO Stephen WITH GRANT OPTION; REVOKE INSERT ON Salespeople FROM Claire; Шаг 1: CREATE VIEW Jerrysview Шаг 2: GRANT INSERT, UPDATE ON Jerrysview TO Jerry; Шаг 1: CREATE VIEW Janetsview Шаг 2: GRANT SELECT ON Janetsview TO Janet; Глава 23 CREATE DBSPACE Myspace CREATE SYNONYM Orders FOR Diane.Orders; Они должны быть откатаны обратно назад Блокировка взаимоисключающего доступа Только чтение Глава 24 SELECT a.tname, a.owner, b.cname, b.datatype Обратите Внимание: из-за того, что большинство имен столбца объединяемых таблиц — различны, не все из используемых псевдонимов a и b в вышеупомянутой команде — строго обязательны. Они представлены просто для понимания. SELECT tname, synowner, COUNT (ALL synonym) SELECT COUNT (*) Глава 25 EXEC SQL BEGIN DECLARE SECTION; EXEC SQL DECLARE Wrong_Orders AS CURSOR FOR EXEC SQL DECLARE Cust_assigns AS CURSOR FOR begin { основная программа } EXEC SQL CLOSE CURSOR Cust_assigns; EXEC SQL UPDATE Orders Для данной программы, которую я использовал, решение будет состоять в том, чтобы просто включить поле onum первичным ключом таблицы Заказов, в курсор Wrong_Orders. В команде UPDATE вы будете затем использовать предикат WHERE onum =:ordernum (считая целую переменную ordernum объявленной), вместо WHERE CURRENT Of Wrong_Orders. Результатом будет программа наподобие этой (большинство комментариев из предыдущей программы здесь исключены): EXEC SQL BEGIN DECLARE SECTION; EXEC SQL DECLARE Wrong_Orders AS CURSOR FOR EXEC SQL DECLARE Cust_assigns AS CURSOR FOR begin { основная программа } EXEC SQL DECLARE CURSOR Salesperson AS begln { main program } Приложение B Типы данных в SQL Типы данных, распознаваемые стандартом SQL ANSI, состоят из символов и различных типов чисел, которые могут классифицироваться как точные числа и приблизительные числа. Точные числовые типы — это номера, с десятичной точкой или без десятичной точки. Приблизительные числовые типы — это номера в показательной (экспоненциальной по основанию 10) записи. Для все прочих типов, отличия слишком малы чтобы их как-то классифицировать. Иногда типы данных используют аргумент, который я называю размером аргумента, чей точный формат и значение меняется в зависимости от конкретного типа. Значения по умолчанию обеспечены для всех типов, если размер аргумента отсутствует. Типы ANSI Ниже представлены типы данных ANSI (имена в круглых скобках — это синонимы): TEXT —ТЕКСТ. CHAR (CHARACTER) — Строка текста в формате, определенном реализацией. Размер аргумента здесь это единственное неотрицательное целое число, которое ссылается к максимальной длине строки. Значения этого типа, должны быть заключены в одиночные кавычки, например 'text'. Две рядом стоящие одиночные кавычки ('') внутри строки будет пониматься как одна одиночная кавычка ('). ПРИМЕЧАНИЕ: Здесь и далее, фраза определенный реализацией или зависящий от реализации, указывает, что этот аргумент или формат зависит от конкретной программы, в которой реализуются данные. EXACT NUMERIC ТОЧНОЕ ЧИСЛО DEC (DECIMAL) — Десятичное число; то есть, число которое может иметь десятичную точку. Здесь аргумент размера имеет две части: точность и масштаб. Масштаб не может превышать точность. Сначала указывается точность, разделительная запятая и далее аргумент масштаба. Точность указывает сколько значащих цифр имеет число. Максимальное десятичное число составляющее номер —значение, определенное реализацией, равное или большее чем этот номер. Масштаб указывает максимальное число цифр справо от десятичной точки. Масштаб = 0 делает поле эквивалентом целого числа. NUMERIC — Такое же как DECIMAL за исключением того, что максимальное десятичное не может превышать аргумента точности. INT (INTEGER) — Число без десятичной точки. Эквивалентно DECIMAL, но без цифр справа от десятичной точки, то есть с масштабом, равным 0. Аргумент размера не используется (он автоматически устанавливается в значение, зависящее от реализации). SMALLINT — Такое же как INTEGER, за исключением того, что, в зависимости от реализации, размер по умолчанию может (или не может) быть меньше, чем INTEGER. APPROXIMATE NUMERIC — ПРИБЛИЗИТЕЛЬНОЕ ЧИСЛО FLOAT — Число с плавающей запятой на основе 10 показательной функции. Аргумент размера состоит из одного числа, определяющего минимальную точность. REAL — Такое же, как FLOAT, за исключением того, что никакого аргумента размера не используется. Точность установлена зависящей от реализации по умолчанию. DOUBLE PRECISION (DOUBLE) — Такое же, как REAL, за исключением того, что точность, определяемая реализацией для DOUBLE PRECISION должна превышать определяемую реализацией точность REAL.
Читайте также: II. Использование галереи фильтров Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|