1. История развития СУБД Oracle. Основные редакции продукта. Корпорация Oracle была основана в 1977 году (в то время она носила название Software Development Laboratories, а в 1978 году она была переименована в Relational Software, Inc.) как компания, специализирующаяся на создании реляционных СУБД, и предсказать, как она будет развиваться в течение последующих трех десятилетий, было в то время непросто. Нынче Oracle поставляет на мировой рынок огромное количество продуктов, услуг и решений. На сегодняшний день это вторая по величине доходов компания, специализирующаяся на производстве программного обеспечения. 1979 - выпущена первая официальная версия СУБД Oracle - V2. 1982 - Oracle – V3(обработка транзакций, есть несколько платформ). 1983 - Oracle Corporation. 1984 - Oracle – 4. 1986 - Oracle – 5(поддержка архитектуры «клиент - сервер»). 1988 - Oracle – 6(хор. организация работы с внутренней памятью). Microsoft SQL Server 1989 – поддержка OLTP – систем. 1992 - Oracle – 7 под UNIX. 1994 - Oracle – 7 под IBM PC. 1997 - Oracle – 8(более высокая надежность, поддержка большего числа пользователей, больший объем памяти, появились средства разработки приложений). Oracle8i (в маркетинге они позиционируются как СУБД для Internet). 2001 - анонсирована Oracle9i. Эта СУБД отличается новыми средствами для обеспечения масштабируемости (Oracle9i Real Application Clusters), упрощения администрирования (в частности, для автоматизации конфигурирования серверов, управления ресурсами используемых компьютеров, мониторинга загрузки и производительности), обеспечения безопасности данных, восстановления данных после сбоев (в том числе из-за ошибок персонала), новыми средствами интеграции приложений. Кроме того, в составе СУБД имеется OLAP-сервер (ранее серверные OLAP-средства Oracle, такие как Oracle Express, поставлялись в виде отдельных продуктов, но, похоже, теперь в этом отношении Oracle последовала примеру Microsoft). 2004, 2005 - Oracle – 10g (поддержка распределенных вычислений). 2007, 2009 — выпущена версия Oracle 11g. СУБД этой фирмы существуют для огромного количества платформ. Хотя поддержка большого количества платформ (а не нескольких наиболее прибыльных, как это характерно для других производителей СУБД) требует немалых вложений, переход к широкому применению Java, который сейчас происходит в Oracle, позволяет существенно сократить затраты на разработку и поддержку продуктов. 1 2. Общие сведения о SQL и его стандартах. SQL (Structured Query Language язык структурированных запросов) язык 4 уровня, для работы с реляционными базами данных. В начале 1970-х в лаборатории IBM была разработана экспериментальная реляционная СУБД System R (англ.), для которой затем был создан специальный язык SEQUEL, позволявший относительно просто управлять данными в этой СУБД. SEQUEL – Structured English QUEry Language структурированный английский язык запросов. Позже по юридическим соображениям язык SEQUEL был переименован в SQL и официальным произношением стало [,es kju:' el] эс-кью-эл. Первыми СУБД, поддерживающими новый язык, стали в 1979 году OracleV2 для машин VAX от компании Relational Software Inc. и System/38 от IBM, основанная на System/R. Первый официальный стандарт языка SQL был принят ANSI в 1986 году и ISO в 1987 году (так называемый SQL-86) и несколько уточнён в 1989 году. Дальнейшее развитие языка поставщиками СУБД потребовало принятия в 1992 году нового расширенного стандарта (ANSI SQL-92 или просто SQL2). Следующим стандартом стал SQL:1999 (SQL3). В настоящее время действует стандарт, принятый в 2003 году (SQL:2003) с небольшими модификациями, внесёнными позже. История версий стандарта представлена в таблице: Год Название Иное название 1986 SQL-86 SQL-87 1989 SQL-89 1992 SQL-92 1999 SQL:1999 2003 SQL:2003 2006 SQL:2006 2008 SQL:2008 Изменения Первый вариант стандарта, принятый институтом ANSI и одобренный ISO в 1987-ом году FIPS 127-1 Немного доработанный вариант предыдущего стандарта. SQL2, Значительные изменения (ISO 9075); уровень FIPS 127-2 Entry Level стандарта SQL-92 был принят как стандарт FIPS 127-2 SQL3 Добавлена поддержка регулярных выражений, рекурсивных запросов, поддержка триггеров, базовые процедурные расширения, нескалярные типы данных и некоторые объектно-ориентированные возможности Введены расширения для работы с XMLданными, оконные функции (применяемые для работы с OLAP-базами данных), генераторы последовательностей и основанные на них типы данных Функциональность работы с XML-данными значительно расширена. Появилась возможность совместно использовать в запросах SQL и XQuery Улучшены возможности оконных функций, устранены некоторые неоднозначности стандарта SQL:2003 2 3. Основные правила написания инструкций SQL. В SQL существует приблизительно сорок инструкций (так наз-ся операторы SQL – набор ключевых слов, связанных друг с другом). Каждая из них "просит" СУБД выполнить опр. действие, например, извлечь данные, создать таблицу или добавить в таблицу новые данные. Каждая инструкция SQL начинается с команды, т.е. ключевого слова, описывающего действие, выполняемое инструкцией. Типичными командами являются: CREATE, INSERT, DELETE и COMMIT. После команды идет одно или несколько предложений. Предложение описывает данные, с которыми работает инструкция, или содержит уточняющую информацию о действии, выполняемом инструкцией. Каждое предложение также начинается с ключевого слова, такого как WHERE, FROM, INTO и HAVING. Одни предложения в инструкции являются обязательными, другие — нет. Конкретная структура и содержимое предложения могут изменяться. Многие предложения содержат имена таблиц или столбцов; некоторые из них могут содержать дополнительные ключевые слова, константы и выражения. В соответствии со стандартом ANSI/ISO имена в SQL должны содержать от 1 до 128 символов, начинаться с буквы и не содержать пробелов или специальных символов пунктуации. Правила написания инструкций: 1) Инструкции не чувствительны к регистрам, за исключением символьных данных в полях таблицы 2) Запись инструкций имеет свободный формат 3) Рекомендации А) ключевые слова пишутся прописными буквами Б) слова, определенные пользователем – строчными В) ключевые слова в пределах одного оператора пишутся с новой строки и выравниваются в одной позиции, при использовании вложенных операторов их сдвигают на позицию второго слова предыд. строки Г) если длина оператора длиннее строки, то ее также смещают относительно начала след. Д) Исп-ся символы: | - необходимость выбора из нескольких значений (a|b|c) {} – обязательность используемых аргументов, рассм-ся как единое целое [] – заключенный в них элемент необязательный … - указ-ет на необязательную возможность повторений указанной перед ним конструкции 0 – неск. раз ({a|b},[c…]) * - все, что удовлетворяет определению ; - окончание SQL-инструкции Пробел – для повышения наглядности между любыми конструкциями , - для разделения эл-тов списка _ - для связки слов пользовательских обозначениях (названия таблиц, переменных, …) 3 3.1. Правила именования таблиц и столбцов. Имена таблиц Большинство СУБД позволяют различным пользователям создавать таблицы с одинаковыми именами. Имея соответствующее разрешение, можно обращаться к таблицам, владельцами которых являются другие пользователи, с помощью полного имени таблицы, записанным посредством уточняющей записи через точку. Например, полное имя таблицы BIRTHDAYS, владельцем которой является пользователь по имени USER, имеет следующий вид: USER. BIRTHDAYS Полное имя таблицы можно использовать вместо короткого имени во всех инструкциях SQL. Имена столбцов Если в инструкции задается имя столбца, СУБД сама определяет, в какой из указанных в этой же инструкции таблиц содержится данный столбец. Однако если в инструкцию требуется включить два столбца из различных таблиц, но с одинаковыми именами, необходимо указать полные имена столбцов, которые однозначно определяют их местонахождение. Полное имя столбца состоит из имени таблицы, содержащей столбец, и имени столбца (короткого имени), разделенных точкой. 4 4. Понятие инструкции, основные части языка SQL. Общие сведения о DML. СУБД позволяет определять базу данных, что обычно осуществляется с помощью языка определения данных (DDL Data Definition Language), который предоставляет пользователям средства указания типов данных, а также средства задания ограничений для информации, хранимой в базе данных. Также СУБД позволяет вставлять, обновлять, удалять и извлекать информацию из базы данных, что обычно осуществляется с помощью языка управления данными (DML Data Manipulation Language). Наличие централизованного хранилища данных позволяет использовать язык DML как общий инструмент организации запросов, который иногда называют языком запросов (query language). Существует две разновидности языков DML процедурные и непроцедурные, которые отличаются между собой способом извлечения данных. Основное отличие между ними заключается в том, что процедурные языки обрабатывают информацию в базе данных последовательно, запись за записью, а непроцедурные оперируют сразу целыми наборами записей Инструкции SELECT, INSERT, DELETE, UPDATE, рассмотренные ранее, предназначены для обработки данных. В совокупности эти инструкции называются языком обработки данных, или DML (Data Manipulation Language). Инструкции DML могут модифицировать информацию, хранимую в базе данных, но не могут изменять ее структуру. Например, ни одна из этих инструкций не позволяет создавать и удалять таблицы или столбцы. Хотя DDL и DML являются двумя отдельными частями SQL, в большинстве реляционных СУБД такое разделение существует лишь на абстрактном уровне. Обычно инструкции DDL и DML в СУБД абсолютно равноправны, и их можно произвольно чередовать как в интерактивном, так и в программном SQL indexx 5 5. Общий синтаксис и возможности использования инструкции SELECT Инструкция SELECT извлекает информацию из базы данных и возвращает её в виде таблицы результатов запроса. Исп-ся как самост. команда для вывода строк, как вложенный запрос в предложениях where и having, как фраза выбора в insert, при присвоении глобальной переменной значения из строк таблицы into. SELECT (DISTINCT) ВОЗВРАЩАЕМЫЙ СТОЛБЕЦ FROM ИМЯ ТАБЛИЦЫ(ИЦ) WHERE УСЛОВИЕ ОТБОРА (GROUP BY ИМЯ СТОЛБЦА) (HAVING УСЛОВИЕ ОТБОРА) (ORDER BY СОРТИРОВКА) В предложении SELECT указывается список столбцов, которые должны быть возвращены инструкцией SELECT. Возвращаемые столбцы могут содержать значения, извлекаемые из столбцов таблиц базы данных, или значения, вычисляемые во время выполнения запроса. DISTINCT удаляет повторяющиеся строки. В предложении FROM указывается список таблиц, которые содержат элементы данных, извлекаемые запросом. Предложение WHERE показывает, что в результаты запроса следует включать только некоторые строки Предложение GROUP BY позволяет создать итоговый запрос. Обычный запрос включает в результаты запроса по одной записи для каждой строки из таблицы Предложение HAVING показывает, что в результаты запроса следует включать только некоторые из групп, созданных с помощью предложения GROUP BY. Предложение ORDER BY сортирует результаты запроса на основании данных, содержащихся в одном или нескольких столбцах. Если это предложение не указано, результаты запроса не будут отсортированы 6 6. Предложения SELECT и FROM. Предикаты и вычисляемые столбцы (примеры). В предложении SELECT, с которого начинаются все инструкции SELECT, необходимо указать элементы данных, которые будут возвращены в результате запроса (в виде списка возвращаемых столбцов, разделенных запятыми). Для каждого элемента в таблице результатов запроса будет создан один столбец. Столбцы будут расположены в том же порядке, что и элементы списка возвращаемых столбцов. Возвращаемый столбец может представлять собой: имя столбца, идентифицирующее один из столбцов, содержащихся в таблицах, которые перечислены в предложении FROM; константу, показывающую, что в каждой строке результатов запроса должно содержаться одно и то же значение; выражение, показывающее, что СУБД должна вычислять значение, помещаемое в таблицу результатов запроса, по формуле, определенной в выражении. Такие столбцы вычисляемые. Предложение FROM состоит из ключевого слова FROM, за которым следует список спецификаторов таблиц, разделенных запятыми. Каждый спецификатор таблицы идентифицирует таблицу, содержащую данные, которые извлекает запрос. Такие таблицы называются исходными таблицами запроса. Предикаты и вычисляемые столбцы: В SQL обычно исп-ся пять осн. условий отбора (предикатов) - сравнение (=, != (не равно), <, >, <=, >=.) - проверка на принадлежность диапазону (BETWEEN … AND) select fname, lname from staff where DOB between ’01-Oct-63’ and ’31Dec-71’; - проверка на членство в множестве(in) select address, tel_no from branch where city in (‘Минск’, ‘Витебск’, ‘Брест’); - проверка на соответствие шаблону (like) select lname, address, tel_no from staff where lname like ‘K%’ Символ ‘%’ - замещает произвольную последовательность символов, а ‘_’ – замещает одиночный символ - проверка на равенство значению NULL. Ключвое слово As исп-ся для создания псевдонимов с целью сокращения полных имен столбцов и для присвоения нового имени столбцу. (Выдать строки сотрудников с указанием зарплаты с 10 % надбавкой): select fname, lname, position, (salary + 0.1*salary) as percent from staff; 7 7. Предложение WHERE и классификация условий отбора (привести примеры). Предложение WHERE состоит из ключевого слова WHERE, за которым следует условие отбора, определяющее, какие именно строки требуется извлечь. Если условие отбора имеет значение TRUE, строка будет включена в результаты запроса. Если же оно имеет значение FALSE или NULL, то строка исключается из результатов запроса. В SQL обычно используются пять основных условий отбора (предикатов) - сравнение (=, != (не равно), <, >, <=, >=.); есть составные условия отбора, объединяющие простые сравнения логическими предикатами (AND, OR, AND NOT, OR NOT) Найти служащих с зарплатой меньше 300 select fname, lname from staff where salary< 300; - проверка на принадлежность диапазону (BETWEEN … AND) select fname, lname from staff where DOB between ’01-Oct-63’ and ’31-Dec-71’; - проверка на членство в множестве(in) select address, tel_no from branch where city in (‘Минск’, ‘Витебск’, ‘Брест’); - проверка на соответствие шаблону(like) select lname, address, tel_no from staff where lname like ‘K%’ Символ ‘%’ - замещает произвольную последовательность символов, а ‘_’ – замещает одиночный символ - проверка на равенство значению NULL. 8 8. Многотабличные запросы и их особенности (привести пример). SQL позволяет получить ответы на эти запросы посредством многотабличных запросов, которые объединяют данные из нескольких таблиц. Составить список всех сотрудников, работающих в Минском отделении. select fname, lname, position, S.tel_no from Branch B, Staff S where B.bno=S.bno and city = ‘Минск’; Вначале просматривается таблица Branch и фильтруются строки, где city = ‘Минск’ Внешний ключ табл. Staff и первичный ключ табл. Branch должны совпадать 2 вида запросов: 1) Простое объединение таблиц (объединение по равенству) – объединение на основе точного равенства между 2-мя столбцами; 2) Многотабличные запросы с исп-ем отношений предок-потомок. Хотя ограничений на количество объединяемых таблиц нет, на практике высокие затраты на обработку многотабличных запросов во многих приложениях накладывают серьёзные ограничения на использование многотабличных запросов. В приложениях, предназначенных для оперативной обработки транзакций (OLTP), запрос обычно ссылается только на одну или две таблицы. В приложениях, предназначенных для поддержки, принятия решений, запрос, как правило, обращается ко многим таблицам и использует сложные отношения, существующие в базе данных. Особенности: 1) Требуется исп-ать полные имена столбцов 2) Часто исп-ся псевдонимы таблиц (в предложении from через пробел указывается в имени таблицы) 3) Оператор выбора всех столбцов SELECT * будет иметь особый смысл select Staff.*, city, area from Branch B, Staff S where B.bno=S.bno 9. Внутренние объединения. Объединение 2-х таблиц по умолчанию считается внутренним 1) SELECT * FROM Girls INNER JOIN Boys ON Girls.city=Boys.city 2) SELECT * FROM Girls INNER JOIN Boys USING (city, Age) Такая форма записи позволяет в предл. USING указать через запятую имена идентичных столбцов 3) Girls NATURAL INNER JOIN Boys Сравниваем все столбцы с идентичными именами в обеих таблицах. 9 10. Внешние объединения. SELECT * FROM Girls FULL[OUTER] JOIN Boys ON Girls.city=Boys.city 2) NATURAL FULL[OUTER] JOIN FULL[OUTER] JOIN … USING 3) SELECT * FROM Girls LEFT[OUTER] JOIN Boys USING (city) 4) SELECT * FROM Girls RIGHT[OUTER] JOIN Boys USING (city) 1) 11. Предложение GROUP BY. Статистические (агрегативные) функции в SQL (примеры). Статистические (агрегативные) функции: Исп-ся в SELECT, HAVING, но не в WHERE. Причем если они есть в SELECT, но их нет в GROUP BY, то никакие другие столбцы в списке SELECT быть не могут, за исключением случаев, когда имя столбца исп-ся в статистич. ф-ции. NULL-значения игнорируются статистическими функциями, а в GROUP BY они равны между собой. DISTINCT в запросе д.б. только 1 раз. Ограничения: 1) статистич. ф-ции нельзя вкладывать одну в другую 2) в списке возвращ. столбцов нельзя одновременно использовать статистич. ф-ции и обычные имена столбцов - SUM() – для вычисления суммы всех значений столбца-аргумента - AVG() – для вычисления среднего значения столбца - MIN() – определяет минимальное значение столбца - MAX() – определяет максимальное значение столбца - COUNT() – подсчитывает число всех определенных значений столбца - COUNT(*) – подсчитывает число строк таблицы. Определить среднемесячную и среднегодовую зарплату сотрудников предприятия 1) select avg(salary) as per_month, avg(12*salary) as per_year from staff; 2) select count (sno) from staff where position = ‘менеджер’; 10 11.1. GROUP BY: Запрос, включающий в себя предложение GROUP BY, называется запросом с группировкой, поскольку он объединяет строки исходных таблиц в группы и для каждой группы строк генерирует одну строку в таблице результатов запроса. Столбцы, указанные в предложении GROUP BY, называются столбцами группировки, поскольку именно они определяют, по какому признаку строки делятся на группы Ограничения: 1) столбцы, указ. в GROUP BY д.б. реальными столбцами (нельзя исп-ть выражения) 2) возвращенным столбцом запроса м.б. константа, статистич. ф-ция, столбец группировки Определить сколько в среднем получают сотрудники в зависимости от занимаемой ими должности. select position, avg(salary) from staff group by position; HAVING: Точно так же, как предложение WHERE используется для отбора отдельных строк, участвующих в запросе, предложение HAVING можно применить для отбора групп строк. Его формат соответствует формату предложения WHERE. Предложение HAVING состоит из ключевого слова HAVING, за которым следует условие отбора. Таким образом, данное предложение определяет условие отбора для групп строк. Следующий пример иллюстрирует роль предложения HAVING: Подсчитать количество сотрудников работающих в каждом из офисов, исключив офисы, в которых работает менее 2 человек. select bno, count(sno) from staff group by bno; having count(sno)>2; ORDER BY: Предложение ORDER BY сортирует результаты запроса на основании данных, содержащихся в одном или нескольких столбцах. Если это предложение не указано, результаты запроса не будут отсортированы. В подчиненный запрос не может входить предложение ORDER BY. Результаты подчиненного запроса используются только внутри главного запроса и для пользователя остаются невидимыми, поэтому нет смысла их сортировать. ASC- по возрастанию (по умолчанию) DESC-по убыванию 11 12. Причины использования подчиненных запросов, их типы, правила и ограничения. Подчиненным называется запрос, содержащийся в предложении WHERE или HAVING другой инструкции SQL. Причины использования: 1) Самый естественный способ получения информации 2) Облегчают написание больших запросов путем разбиения на части 3) Некоторые запросы иначе нельзя реализовать Подзапросы исп-ся: 1) В предложениях WHERE, HAVING 2) В операторах INSERT, UPDATE, DELETE Типы: 1) Скалярный 2) Строковый 3) Табличный Вывести список сотрудников, работающих в Минских отделениях предприятия select fname, lname, position from staff where bno in (select bno from branch where city = ‘Минск’); Правила: таблица результатов подчиненного запроса должна состоять только из одного столбца. в операциях сравнения подзапрос всегда стоит в правой части в подчиненный запрос не может входить предложение ORDER BY. Результаты подчиненного запроса используются только внутри главного запроса и для пользователя остаются невидимыми имена столбцов в подчиненном запросе могут являться ссылками (носят название внешних ссылок) на столбцы таблиц главного запроса и как правило запис-ся полным именем. Значение в столбце внешней ссылки всегда берется из строки, проверенной в данный момент главным запросом. подчиненный запрос всегда заключается в круглые скобки и сохраняет знакомую структуру инструкции SELECT, содержащей предложение FROM и необязательные предложения. 12 13. Условия отбора в подчиненном запросе: виды условий и предикаты ANY, ALL, EXIST, NOT EXIST Условия отбора: 1) Сравнение с результатом подчиненного запроса 2) Проверка на принадлежность результатам подчиненного запроса (исп-е предиката IN) 3) Проверка на существование (предикат EXIST/not exist) 4) Многократное сравнение (предикат ANY/ALL) Первые две проверки идентичны обычным проверкам. ANY (SOME) – хотя бы один В проверке ANY, для того чтобы сравнить проверяемое значение со столбцом данных, отобранных подчиненным запросом, используется один из шести операторов сравнения (=, !=, <, <=, >, >=). Проверяемое значение поочередно сравнивается с каждым элементом, содержащимся в столбце. Если любое из этих сравнений дает результат TRUE, то проверка ANY возвращает значение TRUE. Результат в виде пустого столбца – false Для всех false – false Нет ни одного true, но есть несколько null – null Иногда возникают трудно диагностируемые ошибки при использовании != Определить имя и номер телефона потенциальных арендаторов, чьи требования по арендной стоимости соответствуют предварительной арендной стоимости хотя бы одной из предлагаемых в аренду двухкомнатных квартир. select fname, lname, tel_no from renter where max_rent >= any (select rent from property_for_rent where type = ‘f’ and rooms=2); ALL В проверке ALL, как и в проверке ANY, используется один из шести операторов сравнения проверяемого значения со столбцом данных, отобранных подчиненным запросом. Проверяемое значение поочередно сравнивается с каждым элементом, содержащимся в столбце. Если все сравнения дают результат TRUE, то проверка ALL возвращает значение TRUE. Если пустой столбец – true Если хотя бы один false – false Нет ни одного false, но есть несколько null – null Определить имя и номер телефона потенциальных арендаторов, чьи требования по арендной стоимости соответствуют предварительной арендной стоимости любого из предлагаемых в аренду объектов недвижимости типа двухкомнатная квартира. select fname, lname, tel_no from renter where max_rent >= all (select rent from property_for_rent where type = ‘f’ and rooms=2); предикаты EXIST, NOT EXIST. В результате проверки на существование (предикат EXISTS) можно выяснить, содержится ли в таблице результатов подчиненного запроса хотя бы одна строка. Аналогичной простой проверки не существует. Проверка на существование допустима только в подчиненных запросах. 13 Если подчиненный запрос не возвращает ни одной строки, проверка EXISTS возвращает значение FALSE. Эта проверка не может возвращать NULL. Можно изменить логику проверки EXISTS и использовать форму NOT EXISTS. 14. Добавление данных (инструкции INSERT, MERGE). INSERT 2 формы: 1. Вставка единой строки в таблицу (Insert into имя таблицы [(имя столбца)] values (константы) Список значений должен соответствовать списку столбцов по следующим параметрам: 1) количество элементов в обоих списках одинаково 2) прямое соответствие между позициями элементов в списке 3) совместимые типы данных 2. Копирование одной строки в другую (Insert into имя таблицы [(имя столбцов)] select …) insert into staff (sno, fname, lname, address, tel_no, position, sex, salary, DOB, bno) values (‘s122’, ‘Иван’, ‘Иванов’, ‘…’, ‘…’, null, ‘m’, null, ‘3-Mar-82’, 2); insert into staff values (‘s122’, ‘Иван’, ‘Иванов’, ‘…’, ‘…’, null, ‘m’, null, ‘3-Mar-82’, 2); 15. Модификация и удаление данных (инструкции UPDATE, MERGE и DELETE). UPDATE обновляет значения одного или нескольких столбцов в выбранных строках одной таблицы. UPDATE имя таблицы SET имя столбца = выражение , . WHERE условие отбора Увеличить заработную плату сотрудника до 300 update staff set salary = 300 where lname = ‘…’; Перевести всех служащих из отделения № 2 в отделение № 1 update staff set bno = 1 where bno = 2;. update staff set salary = 1.05 * salary //// без запроса Всем служащим Минского отделения увеличить зарплату на 10% update staff ///// с подчиненным запросом set salary = 1.1 * salary where bno in (select bno from branch where city = ‘Минск’); DELETE удаляет выбранные строки из одной таблицы DELETE FROM . имя таблицы WHERE условие отбора delete from staff where lname = ‘Иванов’;. delete from staff///////удаление всех строк Хотя в результате выполнения приведенной инструкции таблица STAFF становится пустой, из базы данных она не удаляется. Определение таблицы и ее столбцов остается в базе данных. MERGE (INSERT+ UPDATE) MERGE имя таблицы Using { имя таблицы или имя представления } 14 ON (условия) WHEN MATCHED THEN инструкция обновления (для UPDATE) WHEN NOT MATCHED THEN инструкция вставки (для INSERT) 16. Общие сведения о DDL. СУБД позволяет определять базу данных, что обычно осуществляется с помощью языка определения данных (DDL Data Definition Language), который предоставляет пользователям средства указания типов данных, а также средства задания ограничений для информации, хранимой в базе данных. С помощью инструкций DDL можно: • определить структуру новой таблицы и создать её; • удалить таблицу, которая больше не нужна; • изменить определение существующей таблицы; • определить виртуальную таблицу (или представление) данных (посредством инструкции CREATE VIEW); • обеспечить безопасность базы данных; • создать индекс для ускорения доступа к таблице; • управлять физическим размещением данных Ядро языка определения данных образуют три команды: • CREATE (создать), позволяющая определить и создать объект базы данных; • DROP (удалить), служащая для удаления существующего объекта базы данных; • ALTER (изменить), с помощью, которой можно изменить определение объекта базы данных. Все основные реляционные СУБД позволяют использовать три указанные команды DDL во время своей работы. Таким образом, структура реляционной базы данных является динамической. Например, СУБД может создавать, удалять или изменять таблицы, одновременно с этим обеспечивая пользователям доступ к базе данных. 15 17. Типы данных SQL. Тип данных BINARY_INTEGER Подтип NATURAL, NATURALN, POSITIVE, POSITIVEN, SIGNTYPE NUMBER Числовые типы данных DEC, DECIMAL, DOUBLE PRECISION, FLOAT (точность), INTEGER, INT, NUMERIC, REAL, SMALLINT Описание Сохраняет целые числа со знаком. Использует библиотечную арифметику. NATURAL и NATURALN сохраняют только неотрицательные целые числа, причем последний запрещает NULL – значения. POSITIVE и POSITIVEN сохраняют только положительные целые числа, причем последний запрещает NULL – значения. SIGNTYPE сохраняет только -1, 0, 1 Сохраняет числа с фиксированной и плавающей точкой. Использует библиотечную арифметику Сохраняет целые числа со знаком. Для ускорения вычислений использует машинную арифметику. Символьные типы данных: NCHAR (len), RCHARVARYING (len) CHAR (размер) CHARACTER Сохраняет строки символов фиксированной (размер) длины. Максимальный размер 32767 байт, однако, для баз данных ограничен 2000 байт. VARCHAR2(размер) VARCHAR Сохраняет строки символов переменной длины. PLS_INTEGER 16 (размер), STRING Максимальный размер 32767 байт, однако для баз данных ограничен 4000 байт. Сохраняет временную информацию, включая дату, часы, минуты и секунды. DATE DATE, Типы данных дата- TIME, TIME WITH TIME время ZONE, TIME STAMP, TIME STAMP WITH TIME ZONE BOOLEAN Сохраняет логические значения: TRUE, FALSE и NULL CLOB Сохраняет большие символьные объекты BLOB Сохраняет большие двоичные объекты BFILE Сохраняет указатели на объекты LOB, управляемые файловыми системами, внешними по отношению к СУБД. Двоичные (битовые) типы данных: BIT (len), BIT VARYING (len) Интервальный тип данных: INTEVAL 18. Создание таблиц (инструкция CREATE TABLE). Инструкция CREATE TABLE определяет новую таблицу и подготавливает ее к приему данных. Различные предложения инструкции задают элементы определения таблицы: Определения столбцов Столбцы новой таблицы задаются в инструкции CREATE TABLE. Определения столбцов представляют собой заключенный в скобки список, элементы которого отделены друг от друга запятыми. Порядок следования определений столбцов в списке соответствует расположению столбцов в таблице. Каждое такое “определение” содержит следующую информацию: • имя столбца, которое используется для ссылки на столбец в инструкциях SQL. Каждый столбец в таблице должен иметь уникальное имя, но в разных таблицах имена столбцов могут совпадать. • тип данных столбца, показывающий, данные какого вида хранятся в столбце. Типы данных были рассмотрены ранее. Для некоторых типов, например VARCHAR и FLOAT, требуется дополнительная информация, такая как размерность или число цифр после запятой. Эта информация заключается в скобки и должна следовать за ключевым словом, задающим тип данных. • значение по умолчанию, которое заносится в столбец в том случае, если в инструкции INSERT для таблицы не указано значение данного столбца. • указание на то, обязательно ли столбец должен содержать данные. Ограничение NOT NULL, если оно задано, предотвращает занесение в столбец значений NULL, в противном случае значения NULL допускаются. Создать таблицу ORDERS с первичными и внешними ключами create table orders (order_n integer not null, 17 ord_date date not null, cust_n integer, sale_n integer, prod_n varchar2(10), qty integer, amount integer, primary key (order_n), constraint placed_by foreign key (cust_n) references customers on delete cascade, constraint taken_by foreign key (sale_n) references salesreps, constraint is_for foreign key (prod_n) references products); Если первичный и внешний ключ включают в себя один столбец либо условие уникальности и условие назначения касаются одного столбца, то стандарт разрешает сокращенную форму записи Create Table. 18.1. 18 CREATE TABLE имя_таблицы ( определение столбца ) определение ограничений определение столбца имя_столбца тип данных DEFAULT значение NOT NULL определение ограничений определение первичного ключа определение внешнего ключа CONSTRAINT имя ограничения условие уникальности условие на значение определение первичного ключа PRIMARY KEY ( имя столбца ) , определение внешнего ключа FOREIGN KEY ( имя_столбца ) REFERENCES имя_таблицы , ON DELETE CASCADE ON UPDATE CASCADE условие уникальности UNIQUE ( имя столбца ) , условие на значение CHECK ( условие отбора ) 19. Изменение определения и удаление таблицы 19 (инструкции ALTER, DROP TABLE). DROP TABLE DROP TABLE имя таблицы CASCADE RESTRICT В соответствии со стандартом инструкция DROP TABLE должна включать в себя либо параметр CASCADE, либо RESTRICT, которые определяют, как влияет удаление таблицы на другие объекты базы данных (например, представления), зависящие от этой таблицы. Если задан параметр CASCADE и в базе данных имеются объекты, которые содержат ссылку на удаляемую таблицу, то выполнение инструкции закончится неуспешно. В большинстве коммерческих СУБД допускается применение инструкции DROP TABLE без каких-либо параметров. ALTER TABLE ALTER TABLE имя таблицы ADD определение столбца MODIFY имя столбца SET DEFAULT значение DROP DEFAULT DROP имя столбца CASCADE RESTRICT ADD определение первичного ключа определение внешнего ключа условие на значение условие уникальности DROP CONSTRAINT имя ограничения CASCADE RESTRICT Чаще всего инструкция ALTER TABLE применяется для добавления столбца в существующую таблицу. Предложение с определением столбца в инструкции ALTER TABLE имеет точно такой же вид, как и в инструкции CREATE TABLE, и выполняет ту же самую функцию С помощью инструкции ALTER TABLE можно удалить из существующей таблицы один или несколько столбцов, если в них больше нет необходимости. Например, следующая инструкция удаляет столбец POSITION из таблицы SALESREPS. alter table salesreps drop position; Как видно из рисунка, инструкция ALTER TABLE может: • добавить в таблицу определение столбца; • удалить столбец из таблицы; • изменить значение по умолчанию, для какого – либо столбца; • добавить или удалить первичный ключ таблицы; • добавить или удалить внешний ключ таблицы; • добавить или удалить условие уникальности; • добавить или удалить условие на значения 20. Условия целостности данных. 20 1. Обязательное наличие данных. NOT NULL. Недостаток: необходимость задавать при создании таблиц, нельзя наложить это ограничение на уже существующую таблицу. 2. Условие на значение. Ограничение на значения столбцов и их домены. CREATE DOMAIN valid INTEGER CHECK (VALUE BETWEEN 555 AND 777) 3. Целостность таблицы(сущности). Ссылка на первичный ключ primary key(д.б. уникальным). 4. Ссылочная целостность. В реляционной базе данных каждая строка таблицыпотомка с помощью внешнего ключа связана со строкой таблицы-предка, содержащей первичный ключ, значение которого равно значению внешнего ключа. Bno таблицы STAFF связывает служащего с офисом, в котором он работает. Столбец Bno должен содержать значение из столбца Bno таблицы BRANCH; в противном случае служащий будет закреплен за несуществующим офисом. 5. Бизнес правила. Обновление информации в базе данных может быть ограничено деловыми правилами, которым подчиняются сделки, представляемые подобными обновлениями (организация установит деловое правило, запрещающее принимать заказы на продукцию в количествах, превышающих её количество на складе). 6. Непротиворечивость. Многие реальные деловые операции вызывают в базе данных несколько изменений одновременно (увольнение сотрудника и передача всех закрепленных за ним объектов другим сотрудникам этого же отделения). Инструкции DELETE и UPDATE – должны быть выполнены. 21. Создание и удаление псевдонимов, индексов таблиц 21 (инструкции CREATE/DROP SYNONIM, CREATE/DROP INDEX). Псевдонимы (CREATE/DROP SYNONYM). Промышленные базы данных часто бывают организованы так, что все основные таблицы собраны вместе и принадлежат администратору. Администратор базы данных дает другим пользователям разрешения на доступ к таблицам, руководствуясь правилами обеспечения безопасности. Поэтому и только в случае получения разрешения на доступ к таблицам другого пользователя, для ссылки на них необходимо использовать полные имена таблиц. На практике это означает, что в каждом запросе к таким таблицам следует указывать полные имена таблиц, в результате чего запросы становятся длинными, а их ввод – утомительным: Для решения этой проблемы во многих СУБД вводится понятие псевдонима или синонима. Псевдоним – это назначаемое пользователем имя, которое заменяет имя некоторой таблицы. В ORACLE для создания псевдонимов используется инструкция CREATE SYNONYM. В других СУБД для аналогичных целей используется инструкция CREATE ALIAS. CREATE [PUBLIC] SYNONYM имя_синонима FOR [схема.] имя_таблицы[@связь_БД] После создания псевдонима его можно использовать в запросах SQL как обычное имя таблицы. Применение псевдонимов смысл запроса не изменяет, так как и в этом случае необходимо иметь разрешение на доступ к таблицам других пользователей. Тем не менее, псевдонимы упрощают инструкции SQL, и последние приобретают такой вид, как если бы вы обращались к своим собственным таблицам. Если позднее вы решите, что больше не нуждаетесь в псевдонимах, то можете их удалить посредством инструкции DROP SYNONYM имя_синонима Индексы CREATE/DROP INDEX Индекс – это средство, обеспечивающее быстрый доступ к строкам таблицы на основе значений одного или нескольких столбцов. СУБД пользуется индексом так же, как читатели пользуетесь предметным указателем книги. В индексе хранятся значения данных и указатели на строки, где эти данные встречаются. Данные в индексе располагаются в отсортированном по убыванию или возрастанию порядке, чтобы СУБД могла быстро найти требуемое значение. Затем по указателю СУБД может быстро локализовать строку, содержащую искомое значение. Пример select tel_no, address from staff where lname = ‘Комаров’; В инструкции ничего не говорится о том, имеется ли индекс для столбца LNAME или нет, и СУБД выполнит запрос в любом случае. Если бы индекса для столбца LNAME не существовало, то СУБД была бы вынуждена выполнять запрос путем последовательного “сканирования” таблицы STAFF, строка за строкой, просматривая в каждой строке столбец LNAME. . CREATE INDEX имя индекса ON имя таблицы ( имя столбца , ) 21.1. 22 В инструкции указывается имя индекса и таблица, для которой он создается. Задается также индексируемый столбец и порядок его сортировки (по возрастанию или убыванию). + индексирования: ускоряет выполнение инструкции - индексирования: занимает дополнительное место на диске, индекс необходимо добавлять каждый раз, когда обновляются данные. Create [Or replace] [Unique| Bitmap] Index [схема] имя_индекса ON [схема] имя_таблицы [псевдоним] (столбец| выражение для столбца [ASC|DESC] [,…]) Индексы могут быть уникальными или неуникальными. Уникальные индексы гарантируют отсутствие двух строк в таблице с одинаковыми значениями в ключевом столбце или столбцах. Неуникальные индексы не накладывают никаких ограничений на значения столбцов. Для создания уникального индекса используется оператор – CREATE UNIQUE INDEX. CREATE UNIQUE INDEX ANIKNAME_UNIQUE_IDX ON ALL_ORACLE_ADMIN (ANIKNAME) TABLESPACE ALL_ORACLE_IDX; Создание индексов, связанных с ограничением целостности Oracle обеспечивает выполнение ограничения целостности UNIQUE или PRIMARY KEY для таблицы, создавая уникальный индекс для уникального или первичного ключа. Этот индекс создается автоматически, когда включается ограничение целостности. Когда выполняется CREATE TABLE или ALTER TABLE, для создания индекса не надо предпринимать никаких действий, но при желании можно указать предложение USING INDEX, чтобы контролировать его создание. Чтобы включить ограничение целостности UNIQUE или PRIMARY KEY, создавая, таким образом, связанный с ним индекс, владелец таблицы должен иметь квоту табличного пространства, где будет храниться этот индекс, или системную привилегию UNLIMITED TABLESPACE. Индекс, связанный с ограничением целостности, всегда получает имя этого ограничения, если вы не укажете иное. Параметры хранения для индексов, связанных с ограничением целостности UNIQUE или PRIMARY KEY, можно устанавливать с помощью предложения USING INDEX. 22. СОЗДАНИЕ ПОСЛЕДОВАТЕЛЬНОСТЕЙ. 23 (ИНСТРУКЦИЯ CREATE/DROP SEQUENCE) Использование последовательностей полезно для автоматической генерации уникальных первичных ключей для данных, а также для координирования ключей между различными строками или таблицами. Без генератора последовательностей порядковые номера можно создавать лишь программным способом. Новое значение первичного ключа можно было бы получать выбором последнего программно вычисленного значения и наращиванием его. Этот метод требует блокировки во время выполнения транзакции и заставляет одновременно работающих пользователей ожидать очередного значения первичного ключа; такое ожидание известно, как СЕРИАЛИЗАЦИЯ (буквально – "выстраивание в очередь"). Если есть в пользовательских приложениях такие программные конструкции, то их нужно заменять на обращения к последовательностям. Последовательности устраняют сериализацию и улучшают конкурентные способности приложений. CREATE SEQUENCE [schema].sequence_name [INCREMENT BY increment_num] [START WITH start_num] [MAXVALUE maximum_num | NOMAXVALUE] [MINVALUE minimum_num | NOMINVALUE] [CYCLE | NOCYCLE] [CACHE cache_num | NOCACHE] [ORDER | NOORDER]; где, sequence_name – имя последовательности; increment_num – шаг последовательности, по умолчанию, это 1. Абсолютное значение этого параметра должно быть меньше, чем разница между конечным и начальным значениями; start_num – целочисленное значение с которого начинается отсчет, по умолчанию = 1; maximum_num – максимальное значение последовательности; значение maximum_num должно быть больше или равно значению start_num, и больше, чем значение minimum_num; NOMAXVALUE – устанавливает максимальное значение равным 1027 для возрастающей последовательности, или –1 для убывающей. NOMAXVALUE используется по умолчанию; minimum_num - минимальное значение последовательности; minimum_num должно быть меньше либо равно start_num, и меньше, чем maximum_num; NOMINVALUE – определяет минимальное значение равное 1 для возрастающей последовательности и -1026 для убывающей. NOMINVALUE используется по умолчанию; CYCLE – подразумевает, что последовательность начинает генерировать значения по кругу, при достижении максимального или минимального значения. При обращении к последовательности, когда она достигла максимального значения, следующее сгенерированное значение будет минимальным значением последовательности. В ситуации с убывающей последовательностью, при достижении минимального значения, следующее сгенерированное будет максимальным. NOCYCLE – указывает прекратить генерацию значений при достижении максимума или минимума последовательности. NOCYCLE используется по умолчанию. cache_num – количество значений, сохраняемых в памяти. По умолчанию это 20. Минимальное количество кэшированных значений – 2, максимальное значение высчитывается по формуле: CEIL(maximum_num -minimum_num)/ABS(increment_num); NOCACHE – отключает кэширование. Это не позволит базе данных выделить некоторое количество значений заблаговременно, что позволит избежать пробелов в последовательности, но увеличит затраты системных ресурсов. Пробелы могут возникнуть при остановке базы данных, когда кэшированные значения теряются. Если опции CACHE и NOCACHE не указываются, то по умолчанию кэшируется 20 значений. 22.1. 24 ORDER – обеспечивает генерацию значений в порядке запросов. Как правило, ORDER используется в среде Real Application Clusters. NOORDER – не дает таких гарантий. По умолчанию используется NOORDER. Например, следующая команда создает последовательность, которую можно использовать для генерации номеров сотрудников для столбца sno таблицы staff: CREATE SEQUENCE sno_sequence INCREMENT BY 1 START WITH 1 MAXVALUE 99999 MINVALUE 1 NOCYCLE CACHE 10; Чтобы изменить последовательность (за исключением начального номера) используется команда SQL ALTER SEQUENCE. Например, следующее предложение изменяет последовательность: ALTER SEQUENCE sno_sequence INCREMENT BY 10 MAXVALUE 10000 CYCLE CACHE 20; Чтобы изменить начальную точку последовательности, надо удалить эту последовательность и заново создать ее и все необходимые привилегии. Обращение к последовательности осуществляется в предложениях SQL через псевдостолбцы NEXTVAL и CURRVAL; каждый новый номер данной последовательности генерируется обращением к ее псевдостолбцу NEXTVAL, тогда как текущий номер последовательности можно извлекать неоднократно путем обращения к ее псевдостолбцу CURRVAL. NEXTVAL и CURRVAL не являются зарезервированными или ключевыми словами; их можно использовать как имена псевдостолбцов в предложениях SQL, таких как SELECT, INSERT или UPDATE. Чтобы сгенерировать и возвратить очередной номер данной последовательности, обратитесь к seq_name.NEXTVAL, где seq_name – имя последовательности. SELECT SEQ.NEXTVAL FROM DUAL; NEXTVAL и CURRVAL могут использоваться во фразе VALUES предложения INSERT, в списке SELECT предложения SELECT, во фразе SET предложения UPDATE. NEXTVAL и CURRVAL не могут использоваться в следующих местах: в подзапросе; в запросе, определяющем представление или моментальный снимок; в предложении SELECT с оператором DISTINCT; в предложении SELECT с фразой GROUP BY или ORDER BY; в предложении SELECT, скомбинированном с другим предложением SELECT одним из операторов множеств UNION, INTERSECT или MINUS; во фразе WHERE предложения SELECT; в выражении DEFAULT для столбца в предложении CREATE TABLE или ALTER TABLE; в условии ограничения CHECK. Если последовательность больше не нужна, вы можете удалить ее с помощью команды SQL DROP SEQUENCE. Например, следующее предложение удаляет последовательность order_seq: DROP SEQUENCE order_seq; При удалении последовательности ее определение удаляется из словаря данных. Все синонимы для последовательности остаются, но возвращают ошибку при обращении к ним. 23. Создание представлений (инструкция CREATE VIEW). 25 Преимущества и недостатки использования, основные виды. Представлением называется запрос на выборку, которому присвоили имя, а затем сохранили в базе данных. Представления используются по нескольким причинам: • они позволяют сделать так, что разные пользователи базы данных будут видеть ее поразному; • с их помощью можно ограничить доступ к данным, разрешая пользователям видеть только некоторые из строк и столбцов таблицы; • они упрощают доступ к базе данных, показывая каждому пользователю структуру хранимых данных в наиболее подходящем для него виде. CREATE VIEW имя представления AS запрос ( имя_столбца . ) , Создать представление, показывающее информацию о служащих, работающих в отделении компании города Минска. create view Minsk as select * from staff where bno in (select bno from branch where city = ‘Минск’); Преимущества представлений Безопасность Простота запросов Простота структуры Защита от изменений Целостность данных Недостатки представлений Уменьшение производительности Ограничения на обновление Типы представлений: 1) Горизонтальные – ограничен доступ к строкам 2) Вертикальные – к столбцам 3) Смешанные Бывают простые, сложные(сгруппированные), объединенные. Сложные если есть подзапрос, константа, системные переменные, order by, group by и так далее. Если определение представления простое, то СУБД формирует каждую строку представления "на лету", извлекая данные из исходных таблиц. Если же определение сложное, СУБД приходится материализовывать представление. Это означает, что СУБД выполняет запрос, определяющий представление, и сохраняет его результаты во временной таблице. Из нее СУБД берет данные для формирования результатов пользовательского запроса, а когда временная таблица становится ненужной, удаляет ее. 24. Проблемы обновления и удаление представлений. Фраза WITH CHECK OPTION 26 Если определение представления простое, то СУБД формирует каждую строку представления "на лету", извлекая данные из исходных таблиц. Если же определение сложное, СУБД приходится материализовывать представление. Это означает, что СУБД выполняет запрос, определяющий представление, и сохраняет его результаты во временной таблице. Из нее СУБД берет данные для формирования результатов пользовательского запроса, а когда временная таблица становится ненужной, удаляет ее. Согласно стандарту представление можно обновлять, только в том случае, если определяющий его запрос соответствует следующим требованиям: 1. Отсутствует предикат DISTINCT 2. В предложении from д.б. 1 обновляемая таблица 3. В списке возвращаемых столбцов д.б. только простые столбцы 4. В where не д.б. подчиненного запроса, только самые простые требования 5. В запросе не д.б. group by и having WITH CHECK OPTION – указывает, что вставки и обновления, которые будут осуществляться через этот запрос, должны давать в результате только такие строки, которые могут быть выбраны запросом этого же представления. Другими словами, если представление создается посредством запроса с предложением WHERE, то в представлении будут видны только строки, удовлетворяющие условию отбора. Остальные строки в исходной таблице присутствуют, но в представлении их нет. Например, представление Minsk содержит только строки таблицы staff с определенными значениями в столбце bno. Это представление является обновляемым как по стандарту ANSI/ISO, так и в ORACLE, следовательно, в него можно добавить информацию о новом служащем посредством инструкции INSERT: INSERT INTO Minsk (sno, fname, lname, address, position, sex, dob, salary, bno) VALUES ( ‘s129’, ‘…’, ‘…’, ‘…’, ‘менеджер’, ‘f’, ’01.01.81’, 300, 1). СУБД добавит новую строку в исходную таблицу staff; она будет видна также в представлении Minsk. Также без опции WITH CHECK OPTION ничего не препятствует выполнению следующей инструкции: INSERT INTO Minsk (sno, fname, lname, address, position, sex, dob, salary, bno) VALUES ( ‘s129’, ‘…’, ‘…’, ‘…’, ‘менеджер’, ‘f’, ’01.01.81’, 300, 2). После этого в запросе SELECT * FROM Minsk добавленная строка будет отсутствовать. Тот факт, что в результате выполнения инструкции INSERT или UPDATE из представления исчезают строки, в лучшем случае вызывает замешательство. При указании параметра WITH CHECK OPTION пользователь не сможет вводить, удалять и обновлять информацию таблицы, из которой он не имеет возможности считать информацию через простое представление (создаваемое из данных одной таблицы). Обновляемое представление, использующее несколько связанных таблиц, нельзя создавать с данным параметром, так как опция CHECK OPTION не может гарантировать контроль, если существует подзапрос в запросе этого представления или любого представления, на котором базируется данное представление. 25. Понятие транзакций. Модель транзакции в стандарте ANSI/ISO. 27 Инструкции обработки транзакций (COMMIT и ROLLBACK). Транзакцией называют несколько последовательных инструкций SQL, которые рассматриваются как единое целое. Либо все инструкции будут выполнены успешно, либо ни одна из них не должна быть выполнена. Инструкции COMMIT и ROLLBACK • инструкция COMMIT информирует СУБД о том, что транзакция завершена, все инструкции, входящие в состав транзакции, выполнены успешно и противоречия в базе данных не возникли; • инструкция ROLLBACK информирует СУБД о том, что пользователь не хочет завершать транзакцию; СУБД должна отменить все изменения, внесенные в базу данных в результате выполнения транзакции. Здесь же следует отметить, что проверка успешности выполнения инструкций, входящих в транзакцию и выполнение отката транзакции (ROLLBACK) или подтверждение ее успешного выполнения (COMMIT) осуществляется обычно программно, посредством специально разработанных и стандартизированных интерфейсов. Программа в таком случае должна обеспечить корректную генерацию строк запросов SQL с целью дальнейшей их пересылки на выполнение СУБД. В функцию интерфейсов помимо пересылки по сети пользовательских запросов входит также обеспечение корректного соединения с базами данных на основе существующих сетевых протоколов, а также предварительная обработка запросов, включающая их грамматический разбор и “связывание” параметров в предложениях WHERE. Модель транзакции в стандарте ANSI/ISO. В стандарте ANSI/ISO определена модель транзакции, а также указаны задачи инструкций COMMIT и ROLLBACK. Транзакция автоматически начинается с выполнения пользователем или программой первой инструкции SQL. Далее происходит последовательное выполнение остальных инструкций SQL до тех пор, пока транзакция не завершится одним из четырех способов: • Инструкция COMMIT завершает выполнение текущей транзакции. Изменения, внесенные в базу данных, становятся постоянными. Новая транзакция начинается непосредственно после инструкции COMMIT. • Инструкция ROLLBACK отменяет выполнение текущей транзакции. Произведенные изменения отменяются. Новая транзакция начинается непосредственно после инструкции ROLLBACK. • Успешное завершение программы (для программного SQL) считается также и успешным окончанием транзакции, как если бы была выполнена инструкция COMMIT. Поскольку программа завершена, новая транзакция не начинается. • Неуспешное завершение программы (для программного SQL) считается также и неуспешным окончанием транзакции, как если бы была выполнена инструкция ROLLBACK. Поскольку программа завершена, новая транзакция не начинается. 26. Журнал транзакций. Проблемы обработки параллельных транзакций. 28 С помощью журнала транзакции СУБД может отменить изменения, внесенные в базу данных, если во время выполнения транзакции происходит системная ошибка. Когда пользователь выполняет запрос на изменение базы данных, СУБД автоматически вносит в журнал транзакций одну запись для каждой строки, измененной в процессе выполнения запроса. Эта запись содержит две копии строки. Одна копия представляет собой строку до изменения, а другая – после изменения. Только когда в журнале будет сделана запись, СУБД изменит физическую строку на диске. Затем, если пользователь выполняет инструкцию COMMIT, в журнале отмечается конец транзакции. Если пользователь выполняет инструкцию ROLLBACK, СУБД обращается к журналу и извлекает из него “исходные” копии строк, измененных во время транзакции. Используя эти копии, СУБД возвращает строки в прежнее состояние и таким образом отменяет изменения, внесенные в базу данных в ходе транзакции. В случае системного сбоя администратор базы данных восстанавливает ее с помощью специальной утилиты восстановления, поставляемой вместе с СУБД. Проблемы обработки параллельных транзакций: Если несколько человек работают с одной БД, то Средства обработки транзакций в SQL позволяют реляционным СУБД “изолировать” пользователей друг от друга именно таким образом. 1. Проблема пропавшего обновления (может возникнуть всякий раз, когда две программы извлекают из базы одни и те же данные, используют их для каких – либо расчетов, а затем пытаются обновить эти данные). 2. Проблема промежуточных данных (Было 139 моб. 1-ый заказал 100 => осталось 39 в таблице. 2-ой хотел купить 120, но так как их там 39, то дал отказ. Клиент 1-ого отказался и 1-ый внес снова 100 штук. Т.о. СУБД восстанавливает 139 шт., хотя 39 предназначены уже 2-ому). 3. Проблема несогласованных данных (проблема нестабильных результатов выборки: 1-ый покупает, 2-ой думает, затем 2-ой хочет купить, но уже нет товара). 4. Проблема строк – призраков (пока печатается отчет. Приходят новые сведения, в результате итоговая сумма меняется). Когда две транзакции, A и B, выполняются параллельно, СУБД гарантирует, что результаты их выполнения будут точно такими же, как если бы вначале выполнялась транзакция А, а затем транзакция B; или вначале выполнялась транзакция B, а затем транзакция А. Данная концепция называется сериализацией транзакций. 27. Блокировки транзакций: уровни и виды, тупиковые ситуации. 29 Когда транзакция А обращается к базе данных, СУБД автоматически блокирует все части базы данных, в которых транзакция осуществляет выборку или изменение. Транзакция B выполняется параллельно, и СУБД также блокирует те части базы данных, к которым она обращается. Если транзакция B обращается к той части базы данных, которая заблокирована транзакцией А, то СУБД приостанавливает выполнение транзакции B, заставляя ее ждать до тех пор, пока данные не будут разблокированы. СУБД снимает блокировку, вызванную транзакцией А, только после того, как в этой транзакции встретится инструкция COMMIT или ROLLBACK. Затем СУБД позволяет продолжить выполнение транзакции B. Теперь транзакция B блокирует эту же часть базы данных, защищая ее от других транзакций. Уровни: 1. Самой грубой формой блокировки является блокировка всей базы данных. 2. блокировка на уровне таблиц. В этом случае СУБД блокирует только те таблицы, к которым обращается транзакция. Остальные транзакции в это время могут обращаться к другим таблицам. 3. блокировка на уровне страниц. В этом случае СУБД блокирует отдельные блоки данных на диске (“страницы”), когда транзакция обращается к ним. Остальным транзакциям запрещается доступ к заблокированным страницам, но они могут обращаться к другим страницам данных (и блокировать их для себя). 4. блокировка на уровне строк. Она допускает параллельное выполнение транзакций, которые обращаются к двум различным строкам таблицы, даже если эти строки содержатся на одной странице. Виды блокировки: нежесткая – при извлечении информации. При этом другие транзакции, выполняемые параллельно, могут извлекать те же данные. жесткая – при обновлении информации. Если транзакция жестко заблокировала какие-либо данные, другие транзакции не могут обращаться к ним ни для выборки, ни для записи. тупиковые ситуации – обращение к данным со стороны 2-х транзакций (н., при обновлении данных). СУБД периодически проверяет блокировки и если обнаруживает тупиковую ситуацию, то сама выбирает транзакцию, которая проиграла. явная блокировка (устраняет затраты, связанные с блокировкой строк и страниц, исключает ситуации, где блокируется часть таблиц, исключает возможность тупиковой ситуации) LOCK TABLE имя_таблицы IN SHARE| EXCLUSIVE MODE 28. Понятие транзакции и виды блокировок Oracle. 30 Транзакцией называют несколько последовательных инструкций SQL, которые рассматриваются как единое целое. Либо все инструкции будут выполнены успешно, либо ни одна из них не должна быть выполнена. Oracle применяет блокировку только если FOR UPDATE: “Грязное чтение”, “Фантомное чтение”. Виды блокировки: Блокировка записей (монопольная) – не просматриваются, не изменяются Блокировка чтения (разделяемая) – разрешены для чтения (применяется только если её специально запрашивают в предложении FOR UPDATE приложения SELECT) Проблемы нарушения целостности данных: 1) Грязное чтение – один пользователь может просматривать данные, когда другой их изменяет 2) Невоспроизводимое чтение – по 1 запросу получаем 2 раза разные данные (проблемы UPDATE) 3) Фантомное чтение – во 2-ом запросе новые данные (зависит от INSERT) Use сериализация данных. 29. Многоверсионная модель согласованности Oracle. ORACLE обеспечивает для всех запросов согласованность по чтению на уровне предложения, которая гарантирует, что данные, возвращаемые запросом, согласованы по отношению к моменту начала этого запроса. ORACLE также предоставляет необязательную возможность согласованности по чтению на уровне транзакции, которая гарантирует, что данные, которые видят все запросы внутри транзакции, согласованы по отношению к одной точке времени (моменту начала транзакции). ORACLE обеспечивает согласованность по чтению на уровне транзакции с помощью двух методов: 1) Транзакции read-only – могут содержать только запросы и не могут содержать никаких предложений DML (языка манипулирования данными). В течение транзакции ей доступны данные, которые были подтверждены к моменту её начала. 2) Монопольные блокировки таблиц и строк. Если повторяемость чтений необходимо обеспечить в транзакциях, содержащих предложения DML, транзакция может явно запросить разделяемые блокировки по таблицам или монопольные блокировки по тем строкам, которые будут считываться неоднократно. DDL – язык, содержащий набор операторов для определения данных. DML – для модификации данных. По умолчанию Oracle автоматически блокирует строки, на которые воздействуют операторы INSERT, UPDATE или DELETE; причём блокируются только те строки, на которые фактически оказано воздействие, а не вся таблица или весь блок данных. Назначение блокировок данных (блокировок DML) - защитить данные таблицы, гарантируя их целостность при одновременном доступе к данным нескольких пользователей. Блокировки данных предотвращают деструктивное взаимодействие одновременных конфликтующих операций DML и операций DDL. Операции DML могут получать блокировки на двух различных уровнях: для конкретных строк и для целых таблиц. 30. Операторы управления транзакциями в Oracle. 31 Операторы управления транзакциями обеспечивают согласованность данных. SQL-операторы объединяются в логические транзакции, которые выполняются либо успешно, либо неуспешно как единое целое. В ORACLE нет явного оператора, чтобы начать транзакцию, но и нет автоматического завершения транзакции. Транзакция автоматически начинается с первого оператора, который начал изменения, то есть установил блокировку TX. Заканчивается явным оператором окончания транзакции. По завершении транзакции необходимо явно указывать одну из команд завершения транзакции иначе за вас это сделает среда, в которой вы работаете (а среда не всегда это делает так, как вы предполагаете). COMMIT. Оператор COMMIT завершает транзакцию и делает любые выполненные в ней изменения постоянными. Освобождаются блокировки. ROLLBACK. Оператор отката завершает транзакцию и отменяет все выполненные в ней и незафиксированные изменения. Для этого он читает информацию из сегментов отката и восстанавливает блоки данных в состояние, в котором они находились до начала транзакции. Освобождаются блокировки. SAVEPOINT. Позволяет создать в транзакции точку сохранения. В одной транзакции можно выполнять оператор SAVEPOINT несколько раз, устанавливая несколько точек сохранения. Точки сохранения позволяют устанавливать маркеры внутри транзакции таким образом, чтобы была возможность отмены только части работы, проделанной в транзакции. Оправдано использование точек сохранения в продолжительных и сложных транзакциях. ORACLE освобождает блокировки, которые были установлены отменённым оператором. SET TRANSACTION. Этот оператор позволяет устанавливать атрибуты транзакции, такие как уровень изолированности и то, будет ли она использоваться только для чтения данных или для чтения и записи. Этот оператор также позволяет привязать транзакцию к определенному сегменту отката. Также есть READ COMITTED (изоляция на уровне команды), SERIABLE (на ур-е транзакций), READ ONLY, ALTER SESSION (измен. функц. хар-ки тек. сеанса). Предложение LOCK TABLE позволяет вам заблокировать одну или несколько таблиц в указанном режиме, так что вы можете регулировать одновременный доступ к таблицам, поддерживая их целостность. Например, предложение, приведенное ниже, блокирует таблицу emp в режиме row share. Такой режим разрешает одновременный доступ к таблице, но запрещает другим пользователям блокировать всю таблицу для монопольного использования. Блокировка таблицы освобождается, когда ваша транзакция выдает COMMIT или ROLLBACK. LOCK TABLE emp IN ROW SHARE MODE NOWAIT; Режим блокировки определяет, какие другие блокировки могут быть применены к таблице. Например, несколько пользователей могут одновременно затребовать блокировки row share для одной и той же таблицы, но лишь один пользователь за раз может затребовать МОНОПОЛЬНУЮ (exclusive) блокировку. Пока один пользователь имеет монопольную блокировку таблицы, другие пользователи не могут изменять (INSERT, UPDATE или DELETE) строки в этой таблице. Необязательное ключевое слово NOWAIT указывает, что, если запрос LOCK TABLE не может быть удовлетворен (возможно потому, что таблица уже заблокирована другим пользователем), то LOCK TABLE вернет управление пользователю вместо того, чтобы ждать удовлетворения запроса. Если вы опустите ключевое слово NOWAIT, то ORACLE будет ждать освобождения таблицы; это ожидание не имеет устанавливаемого предела. Модель Multiversion Read Consistency (MVRC): 1) Сегменты отката системных изменений (не журнал!!!) – структура, которая хранит информацию, необходимую для восстановления (не после аппаратного сбоя) 2) Системные номера изменений SCN – логические повременные метки, которые предназначены для отслеживания порядка транзакций 3) Блокировка блоков данных – указывается при помощи индикаторов, хранится в том же блоке, что и строка. Блок – минимальная единица; считывая строку, считывается и весь блок. Расширяемые блокировки расширяют блок до страницы или таблицы (если заблокировано 90%) 32 31. Принципы защиты данных в стандарте SQL: аутентификация пользователей, защищаемые объекты, использование привилегий и другие возможности обеспечения безопасности. С защитой данных в SQL связаны три основные концепции: • Действующими лицами в базе данных являются пользователи. Каждый раз, когда СУБД извлекает, вставляет, удаляет или обновляет данные, она делает это от имени какогото пользователя • Объекты базы данных являются теми элементами, чья защита может осуществляться посредством SQL. • Привилегии – это права пользователя на проведение тех или иных действий над определенным объектом базы данных. Аутентификация пользователей (идентификатор и пароль). Защищаемые объекты (таблицы и представления, но м.б. ф-ции, блоки, программы, подпрогр.,…). Привилегии (инструкция GRANT): Системная привилегия – это мощная привилегия, которая предоставляет пользователю возможность выполнять системную операцию определенного вида. GRANT SELECT| DELETE| INSERT (имя_столбца)| UPDATE (имя_столбца)| ALL PRIVILEGES ON имя_таблицы TO имя_пользователя| PUBLIC [,…список пользователей] [WITH GRANT OPTION] WITH GRANT OPTION – для предоставления пользователю права передачи привилегий grant select on orders to secretary with grant option; Роль – набор системных привилегий, который может быть предоставлен пользователю либо др. роли. REVOKE [GRANT OPTION FOR] SELECT| DELETE| INSERT| UPDATE| ALL PRIVILEGES ON имя_таблицы FROM имя_пользователя| PUBLIC [,…] [CASCADE| RESTRICT] Перекрытие привилегий: При использовании инструкции REVOKE следует учитывать, что если два разных пользователя предоставляют третьему пользователю одну и ту же привилегию на один и тот же объект, а затем один из них отменяет привилегию, то вторая привилегия остается в силе и по-прежнему разрешает пользователю доступ к объекту. 33 32. Стандартные инструкции GRANT и REVOKE, право предоставления привилегий. Для управления привилегиями определены следующие правила: -объект принадлежит пользователю, его создавшему; -владелец объекта может изменять привилегии своего объекта; -объектная привилегия всегда соотносится с конкретным объектом, а системная - с объектами вообще. GRANT SELECT| DELETE| INSERT (имя_столбца) | UPDATE (имя_столбца) | ALL PRIVILEGES ON имя_таблицы TO имя_пользователя| PUBLIC [,…список пользователей] [WITH GRANT| ADMIN| HIERARHY OPTION] WITH GRANT OPTION – для предоставления пользователю права передачи привилегий grant select on orders to secretary with grant option; Роль – набор системных привилегий, который может быть предоставлен пользователю либо др. роли. REVOKE [GRANT OPTION FOR] SELECT| DELETE| INSERT| UPDATE| ALL PRIVILEGES ON имя_таблицы FROM имя_пользователя | PUBLIC [,…] [CASCADE| RESTRICT] При использовании инструкции REVOKE следует учитывать, что если два разных пользователя предоставляют третьему пользователю одну и ту же привилегию на один и тот же объект, а затем один из них отменяет привилегию, то вторая привилегия остается в силе и по-прежнему разрешает пользователю доступ к объекту. Такую ситуацию в литературе иногда называют перекрытием привилегий. 33. Аутентификация в Oracle. Создание и изменение пользователей. Безопасность базы данных обеспечивается с помощью идентификаторов пользователей. В большинстве коммерческих реляционных СУБД идентификатор пользователя создается для каждого сеанса связи с базой данных. В интерактивном режиме сеанс начинается, когда пользователь запускает интерактивную программу формирования запросов, и продолжается до тех пор, пока пользователь не выйдет из программы. В приложении, использующем программный SQL, сеанс начинается, когда приложение подключается к СУБД, и заканчивается по завершении работы приложения. В течение сеанса все инструкции SQL ассоциируются с идентификатором пользователя, установленным для этого сеанса. В начале сеанса необходимо ввести идентификатор и пароль. Пароль служит для подтверждения того, что пользователь действительно имеет право работать под введенным идентификатором. Пользователи, автоматически создаваемые при инсталляции: SYS (CHANGE_ON_INSTAL) – возможность работы с БД SYSTEM (MANAGER) – возможность создавать БД и объекты Создание пользователей: CREATE USER имя_пользователя IDENTIFIED {BY пароль| EXTERNALLY|GLOBALLY AS внешнее имя} ALTER USER – исп-ся когда необходимо изменить пароль [DEFAULT| TEMPORARY TABLE SPASE имя_табл_пространства] [QUOTA {целое число (K/M)| UNLIMITED} ON имя_табл_пространства] 34 34. Профили в Oracle. Создание, изменение, удаление. С помощью профилей можно ограничить количество ресурсов системы и БД, доступных для пользователя, а так же управлять ограничениями, налагаемыми паролями. CREATE PROFILE TO имя_пользователя LIMIT (параметры ресурса| параметры пароля); UNLIMITED| SESSION_PER_USER| CONNECT TIME| CPU_PER_CALL - ресурс DEFAULT (профиль по умолчанию) | PASSWORD_LIFE_TIME 180(профиль ограничивает срок действия пароля до 180 дней) | PASSWORD_LOCK_TIME| FAILTED_LOGIN_ATTEMETS - пароль / ALTER PROFILE - Позволяет изменять профили. Сущ. Еще DROP PROFILE … CASCADE ALTER USER - Позволяет изменять пользователя и его параметры (пароль, профиль, роль и т.д.) ALTER USER имя_пользователя ACCOUNT LOCK| ACCOUNT UNLOCK (заблокировать/ разблокировать) / 35. Привилегии в Oracle. Классификация. Привилегии – это права пользователя на проведение тех или иных действий над определенным объектом базы данных (инструкция GRANT). Системная привилегия – это мощная привилегия, которая предоставляет пользователю возможность выполнять системную операцию определенного вида. Привилегии бывают: 1) Системные – на выполнение каких-либо команд Общие (ключ. слова ANY, ALTER, CREATE, DROP, EXECUTE, SELECT ANY) можно применить с любыми объектами Уникальные – на каждый случай свои, м.б. уникальные параметры Особые – минимальный набор базовых привилегий, который позволяет работать с БД (SYSDBA, SYSOPER) 2) Объектные – на работу с объектами Общие (ALTER, DEBUG, DELETE, FLASHBACK, INSERT, REFERENCES, SELECT, UNDER, UPDATE) Уникальные Работа с привилегиями при помощи ролей Роль – это совокупность сист. привилегий, предост. пользователям и др. ролям (CONNECT, RESOURSE). 35 36. Предоставление и отмена привилегий в Oracle. (инструкции GRANT и REVOKE для системных и объектных привилегий) Предоставление привилегий (инструкция GRANT). Синтаксическая диаграмма которой изображена на рисунке, используется для предоставления пользователям привилегий на объекты базы данных. Обычно инструкцией GRANT пользуется владелец таблицы или представления, чтобы разрешить другим пользователям доступ к этим данным. GRANT ON имя таблицы SELECT DELETE INSERT имя столбца ( UPDATE , , ) ALL PRIVILEGES TO . имя пользователя PUBLIC , WITH GRANT OPTION Синтаксическая диаграмма инструкции GRANT Инструкция GRANT содержит список предоставляемых привилегий, имя таблицы, для которой назначаются привилегии, и идентификатор пользователя, получающего их. При предоставлении большого числа привилегий или предоставлении привилегий большому числу пользователей в инструкции GRANT для удобства применяются два сокращения. Вместо того чтобы перечислять все привилегии для некоторого объекта, можно использовать предложение ALL PRIVILEGES. Вместо того чтобы давать привилегии по отдельности каждому пользователю базы данных, можно с помощью ключевого слова PUBLIC предоставить их сразу всем пользователям, имеющим право работать с базой данных. Такая инструкция GRANT дает привилегии всем нынешним и будущим пользователям базы данных, а не только тем, кто имеет право работать с базой данных в настоящее время. Это устраняет необходимость явно предоставлять привилегии новым пользователям при их появлении. Отмена привилегий (инструкция REVOKE). В большинстве реляционных баз данных привилегии, предоставленные посредством инструкции GRANT, могут быть отобраны с помощью инструкции REVOKE, синтаксическая диаграмма которой изображена на рисунке. Инструкция REVOKE, имеющая структуру, аналогичную структуре инструкции GRANT, содержит набор отбираемых привилегий, объект, к которому относятся эти привилегии, и идентификаторы пользователей, у которых отбираются привилегии. Посредством инструкции REVOKE можно отобрать только те привилегии, которые вы предоставили ранее некоторому пользователю. У него могут быть также привилегии, предоставленные другими пользователями; ваша инструкция REVOKE не влияет на эти привилегии. 36 36.1. REVOKE ON имя таблицы SELECT DELETE GRANT OPTION FOR INSERT имя столбца ( UPDATE , , ) ALL PRIVILEGES FROM . имя пользователя PUBLIC CASCADE , RESTRICT Синтаксическая диаграмма инструкции REVOKE При использовании инструкции REVOKE следует учитывать, что если два разных пользователя предоставляют третьему пользователю одну и ту же привилегию на один и тот же объект, а затем один из них отменяет привилегию, то вторая привилегия остается в силе и по-прежнему разрешает пользователю доступ к объекту. Такую ситуацию в литературе иногда называют перекрытием привилегий. Инструкция REVOKE и права предоставления привилегий. Когда вы даете комунибудь привилегии с правом последующего предоставления, а затем отменяете эти привилегии, то в большинстве СУБД автоматически отменяются все привилегии, которые являются производными от исходных. Рассмотрим еще раз цепочку привилегий: владелец → secretary → somebody. Если теперь владелец отменит привилегии secretary на представление orders, то привилегии somebody; также будут автоматически отменены. Ситуация становится более сложной, если привилегии предоставляются двумя или более пользователями, один из которых впоследствии отменяет привилегии. Рассмотрим пример (рисунок). Он представляет собой предыдущий пример в слегка измененном виде. Здесь secretary получает привилегию SELECT с правом предоставления, как от владельца, так и от anybody, а затем дает привилегии somebody. На этот раз, когда владелец отменяет привилегии secretary, остаются привилегии, предоставленные anybody. Привилегии somebody также остаются, поскольку они могут происходить от привилегий anybody. 1 GRANT WITH GRANT OPTION Владелец 2 GRANT WITH GRANT OPTION 4 REVOKE ANYBODY 3 SECRETARY GRANT SOMEBODY Рисунок Отмена привилегий, предоставленных двумя пользователями 37 36.2. Рассмотрим другой вариант этой цепочки привилегий, в котором изменен порядок событий (рисунок. Здесь secretary получает привилегию с правом предоставления от владельца, дает эту привилегию somebody и после этого получает привилегию с правом предоставления от anybody. Когда на этот раз владелец отменяет привилегии secretary, результат будет другим и может отличаться на разных СУБД. Как и в случае, изображенном на рисунке, у secretary останется привилегия SELECT на представление orders, предоставленная anybody. Но somebody автоматически потеряет привилегию SELECT. Произойдет это потому, что привилегия somebody явно происходит от привилегии, данной владельцем и только что отмененной. Она не может быть производной от привилегии, предоставленной secretary пользователем anybody, так как эта привилегия отсутствовала в тот момент, когда somebody давал привилегию somebody. Таким образом, то, как далеко распространятся последствия выполнения инструкции REVOKE, зависит не только от самих привилегий, но и от хронологической последовательности инструкций GRANT и REVOKE. Для получения желаемых результатов выдача привилегий с правом предоставления и аннулирование таких привилегий должны выполняться очень осторожно. 1 GRANT WITH GRANT OPTION Владелец 3 GRANT WITH GRANT OPTION 4 REVOKE ANYBODY 2 SECRETARY GRANT SOMEBODY Рисунок Отмена привилегий, предоставленных в другой последовательности 38 37. Работа с привилегиями при помощи ролей в Oracle. Системные роли, определение, изменение, удаление ролей. Привилегии объединяются в роли. Роль – это совокупность системных привилегий, предоставляемых пользователям и другим ролям. Надо отметить, что СУБД может предоставлять пользователям некоторое количество предварительно установленных ролей (системные роли): CONNECT – основная роль пользователей, которая позволяет соединяться с базой данных, а затем создавать таблицы, представления, синонимы и последовательности в соответствующей схеме. RESOURCE – роль, предназначенная для разработчиков приложений; помимо таблиц, представлений и т. д. позволяет создавать процедуры, функции, триггеры и объектные типы в соответствующей схеме. DBA – роль, предназначенная для администраторов; позволяет выполнять любые операции с базой данных, так как включает все системные привилегии. Кроме того, пользователь, которому предоставлена роль DBA, может предоставлять любые системные привилегии любому другому пользователю базы данных и любой роли. SELECT_CATALOG_ROLE – роль, позволяющая обращаться с запросами к представлениям словаря данных, созданным администратором. DELETE_CATALOG_ROLE – роль, позволяющая удалять записи из журнала аудита базы данных. Роли, определяемые пользователями (администратором): Для базы данных ORACLE можно создавать любое требуемое количество ролей. После создания роли нужно построить для нее набор привилегий, предоставив ей привилегии и другие роли. Затем надо предоставить эту роль пользователям, чтобы они имели привилегии, необходимые им для работы. Разрешение и запрещение ролей: Пользователь, которому предоставлена роль, не всегда имеет доступ к ее привилегиям. В ORACLE приложения могут разрешать и запрещать роли для любого пользователя. После того как приложение разрешает роль для пользователя, ему становятся доступны ее привилегии. И, соответственно, когда приложение запрещает роль для пользователя, он более не имеет доступа к ее привилегиям. Возможность динамически управлять набором привилегий позволяет приложениям обеспечивать постоянную корректность наборов привилегий пользователей во время работы с данным приложением. 38. Аудит. Типы и применение аудита. Аудит — это сочетание нескольких элементов в одном пакете для определенной группы действий сервера или базы данных, регистрирует все события - как успешные выполнения, так и отказы. Типы аудита: 1) аудит времени выполнения: аудит времени выполнения инициализации приложения аудит времени выполнения клиентского контекста и проверки доступа 2) аудит изменения хранилища данных авторизации. 39 39. Преимущества PL/SQL, основные возможности. Среда SQL*Plus. 1. Независимость от конкретной СУБД. Несмотря на наличие диалектов, и различий в синтаксисе, в большинстве своём тексты SQL-запросов, содержащие DDL и DML операторы, могут быть достаточно легко перенесены из одной СУБД в другую. Естественно, что при применении некоторых специфичных для реализации возможностей такой переносимости добиться очень трудно. 2. Наличие стандартов. Наличие стандартов и набора тестов для выявления совместимости и соответствия конкретной реализации SQL общепринятому стандарту способствует «стабилизации» языка. Однако стандарт местами чересчур формализован и раздут в размерах, например, Core-часть стандарта SQL:2003 представляет собой более 1300 страниц текста. 3. Декларативность. С помощью SQL программист описывает, какие данные нужно извлечь или модифицировать. То, каким образом это сделать, решает СУБД непосредственно при обработке SQLзапроса, но при этом полезно представлять, как СУБД будет разбирать текст его запроса. Особенно критичными такие моменты становятся при работе с большими базами данных и со сложными запросами, чем сложнее сконструирован запрос, тем больше он допускает вариантов написания, различных по скорости выполнения, но одинаковых по итоговому набору данных. Кроме этого, можно отметить и ряд недостатков: 1. Несоответствие реляционной модели данных. Создатель реляционной модели данных Эдгар Кодд, Кристофер Дейт и их сторонники указывают на то, что SQL не является истинно реляционным языком. В частности, они указывают на следующие проблемы SQL: повторяющиеся строки; неопределённые значения (NULL); явное указание порядка колонок слева направо; колонки без имени и дублирующиеся имена колонок; использование указателей и т.д. 2. Сложность. Хотя SQL и задумывался, как средство работы конечного пользователя, в конце концов, он стал настолько сложным, что превратился в инструмент программиста. 3. Отступления от стандартов. Несмотря на наличие международного стандарта ANSI SQL-92, многие компании, занимающиеся разработкой СУБД (например, Oracle, Sybase, Microsoft, MySQL), вносят изменения в язык SQL, применяемый в разрабатываемой СУБД, тем самым отступая от стандарта. Таким образом, появляются специфичные для каждой конкретной СУБД диалекты языка SQL. Существует четыре уровня соответствия реализации SQL стандарту: entry (базовый); transitional (переходный); intermediate (промежуточный); full (полный). 4. Сложность работы с иерархическими структурами. Ранее SQL не предлагал стандартного способа манипуляции древовидными структурами. Некоторые поставщики СУБД предлагали свои решения. Например, Oracle использует выражение CONNECT BY. В настоящее время в качестве стандарта принята рекурсивная конструкция WITH. Поскольку SQL не является языком программирования (то есть не предоставляет средств для автоматизации операций с данными), вводимые разными производителями расширения касались в первую очередь процедурных расширений. Это хранимые процедуры и процедурные языки. Практически в каждой СУБД применяется свой процедурный язык. Подобные языки для самых популярных СУБД приведены в следующей таблице. СУБД Borland InterBase, Firebird IBM DB2 Microsoft SQL Server, Sybase ASE MySQL Oracle PostgreSQL Краткое PSQL SQL PL Transact-SQL Расшифровка Procedural SQL SQL Procedural Language (расширяет SQL/PSM) Transact-SQL SQL/PSM PL/SQL PL/pgSQL SQL/Persistent Stored Module (стандарт SQL:2003)[ Procedural Language/SQL (основан на языке Ada) Procedural Language/PostgreSQL (очень похож на Oracle PL/SQL) 40 40. Лексические единицы PL/SQL. Символы группируются в лексические единицы, которые называют атомарными, поскольку они представляют собой наименьшие самостоятельные элементы языка. Идентификатор – это имя объекта PL/SQL, которым может быть: константа; скалярная переменная; составная переменная (запись или коллекция); исключение; процедура; функция; пакет; тип; курсор; зарезервированное слово; метка. К идентификаторам PL/SQL предъявляются следующие требования: 1) длина - до 30 символов; 2) должны начинаться с буквы; 3) не должны содержать пробелов (но могут включать символы "$", "_" и "#"). Литерал – это значение, с которым не связан идентификатор, оно существует "само по себе": NUMBER (например, 415, 21,6 или NULL), STRING (например, 'Предложение', '01FEB-2003', NULL) либо BOOLEAN (а именно TRUE, FALSE или NULL). Нет возможности непосредственно задать литеральное значение даты (только двоичное представление). Строковый литерал может состоять из одного или более символов, чувствителен к регистру символов. Литерал длиной нуль символов представляется как '' (две последовательные одинарные кавычки без символов между ними), имеет значение NULL и тип данных CHAR (строка нулевой длины). Разделитель в виде точки с запятой. Границы объявлений переменных и операторов определяются ; . Комментарии. Наличие поясняющего и сопроводительного комментариев является основным признаком хорошей программы. Бывают однострочные (--) и многострочные (/* текст комментария */). 41 41. Структура блока PL/SQL В PL/SQL, как и в большинстве других процедурных языков, наименьшей единицей группировки кода является блок. Он представляет собой фрагмент программного кода, определяющий границы выполнения и области видимости для объявлений переменных и обработки исключений. PL/SQL позволяет создавать как именованные, так и анонимные блоки (то есть блоки, не имеющие имени), которые представляют собой пакеты, процедуры, функции, триггеры или объектные типы. Блок PL/SQL может содержать до четырех разделов, однако только один из них является обязательным. Заголовок. Используется только в именованных блоках, определяет способ вызова именованного блока или программы. Не обязателен. Раздел объявлений. Содержит описания переменных, курсоров и вложенных блоков, на которые имеются ссылки в исполняемом разделе и разделе исключений. Не обязателен. Исполняемый раздел. Команды, выполняемые ядром PL/SQL во время работы приложения. Обязателен. Раздел исключений. Обрабатывает исключения (предупреждения и ошибки). Не обязателен. На рис. 2 показана процедура, содержащая все четыре раздела. Этот конкретный блок начинается с ключевого слова PROCEDURE и, как и все блоки, завершается ключевым словом END. 42 42. Классификация блоков PL/SQL и управление блоками в SQL*Plus. PL/SQL — процедурный язык программирования. С помощью PL/SQL можно создавать программы, в которых объединяются операторы для управления выполнением программ и те, с помощью которых можно обращаться к базам данных и обрабатывать информацию. С помощью PL/SQL можно строить процедуры, функции и модули. Классификация блоков PL/SQL: • Раздел объявлений блока (declare) PL/SQL – это часть блока, где объявляются переменные, константы, исключительные ситуации и т.д., которые затем становятся доступны во всех других частях блока. • В теле основной программы (begin) содержатся исполняемые операторы блока. Другими словами, тело – это часть блока PL/SQL, в которой определяются его функциональные возможности. • В разделе исключительных ситуаций (exception) находятся подпрограммы обработки ошибок. Когда оператор в теле блока определяет исключительную ситуацию (обнаруживает ошибку), он передает управление программой обработчику соответствующей исключительной ситуации, находящемуся в разделе обработчиков исключительных ситуаций. end; Вообще говоря, обязательным в блоке является только выполняемый раздел, кроме того, он должен содержать, по крайней мере, один выполняемый оператор. Управление блоками в SQL*Plus: ; - окончание выполнения SQL – оператора (не является элементом) , но в блоке синтаксический элемент. DECLARE или BEGIN - запуск на выполнение блока PL/SQL, а не SQL – оператора / - признак завершения блока (соответствует команде RUN) ЕХЕСUТЕ - способ вызова хранимых процедур (принимает заданные аргументы, автоматически размещает ключевые слова BEGIN и END перед и после указанных аргументов, а затем передает полученный блок серверу базы данных на выполнение). 43 43. Общие сведения о секциях объявления. Синтаксис объявления переменных. Использование атрибутов %TYPE и %ROWTYPE. Инструкция DECLARE инициализирует переменную Transact-SQL следующим образом: Назначение имени. Первым символом имени должен быть одиночный символ @. Назначение длины и типа данных, определяемого системой или пользователем. Для числовых переменных задаются также точность и масштаб. Для переменных типа XML может быть дополнительно задана коллекция схем. Присваивает созданной переменной значение NULL. Например, следующая инструкция DECLARE создает локальную переменную @mycounter типа int. DECLARE @MyCounter int; Инструкция DECLARE позволяет объявить несколько переменных одинакового или разного типов через запятую. Например, следующая инструкция DECLARE создает три локальные переменные с именем @LastName, @FirstName и @StateProvince, присваивая каждой из них значение NULL: DECLARE @LastName nvarchar(30), @FirstName nvarchar(20), @StateProvince nchar(2); Данные атрибуты используются для объявления переменных, констант и даже определяемых пользователями подтипов, и составных типов, соответствующих свойствам столбцов и таблиц баз данных. Использование атрибута %TYPE для ссылки на столбцы таблицы SALES.PARTS при объявлении типа PART_RECORD: declare type part_record is record ( /*объявление поля записи, идентичного по типу данных со столбцом id таблицы parts схемы sales*/ id sales.parts.id %type, unit_price sales.parts.unit_price %type, description sales.parts.description %type) current_part part_record; С помощью атрибута %rowtype можно объявлять переменные, имеющие тип записи, и другие конструкции: %ROWTYPE может упростить объявление вложенной таблицы CURRENT_PARTS_TABLE. declare type parts_table is table of sales.parts %rowtype; current_parts_table parts_table; Тип записи (record type) — это группа связанных полей, каждое из которых имеет свои собственные имя и тип данных. Тип записи обычно используется в программах PL/SQL для создания переменных, соответствующих всем столбцам таблицы или их подмножеству. Например, в следующем фрагменте программы тип записи, определяемый пользователем, объявляется для соответствия атрибутам таблицы базы данных, а затем с применением нового типа объявляется переменная. declare tуре part_record is record (id integer, unit_price number (10,2), description varchar2(200)); current_part part_record; 44 44. Функции преобразование типов данных. Область действия и область видимости переменных. 1. Переменные и константы (объявляются переменная и именованная константа): declare declare id integer; id integer:=0; - присвоено нач. значение standard constant integer := 500; standard integer default 500; - знач. по умолчанию 2. Подтипы, определяемы пользователями declare varchar2_50 varchar2(50); subtype description is Varchar2_50; current_description description default 'Unknown'; Нельзя прямо объявлять ограниченные подтипы. Необходимо вначале объявить ограниченную переменную (varchar2_50), а затем ограниченный подтип (description). 3. Составные типы, определяемые пользователями Переменная, объявленная с составным типом, представляет собой совокупность различных компонентов, каждым из которых можно управлять отдельно. Например, в программе при работе с переменной, имеющей тип записи, можно обновить единственное поле, не обновляя остальные поля. Преобразование типов данных происходит в следующих случаях: 1) При перемещении, сравнении или объединении данных одного объекта с данными другого объекта эти данные могут преобразовываться из одного типа в другой. 2) При перемещении в переменную программы данных из результирующего столбца Transact-SQL, кодов возврата или выходных параметров эти данные должны преобразовываться из системного типа данных SQL Server в тип данных переменной. Преобразование типов данных бывает явным и неявным (скрыто от пользователя). SQL Server автоматически преобразует данные из одного типа в другой. smallint => int (неявно) nchar => image (только явно) nchar => nvarchar (явно или неявно) 45. Скалярные типы PL/SQL. К допустимым скалярным типам относятся типы, аналогичные тем, что применяются для определения столбцов таблиц базы данных, плюс ряд дополнительных типов. Скалярные типы можно разделить на семь семейств: числовые типы, символьные типы, типы RAW, временные типы, типы ROWID, логические типы и типы Trusted. Таблица см. на стр. 12, вопрос № 20. 46. Ссылочные типы PL/SQL. После того как объявлена переменная PL/SQL скалярного или составного типа, для ее хранения выделяется определенная область памяти. Переменная дает выделенной области имя и впоследствии используется в программе для ссылки на нее. Память не освобождается до тех пор, пока переменная находится в области своего действия. Для ссылочных типов такого ограничения нет. Ссылочный тип PL/SQL — это то же самое, что и указатель в С. Переменная, объявленная как ссылочная, во время выполнения программы может указывать на различные области памяти. REF CURSOR - курсорная переменная. REF - указывает на некоторый объект. 45 47. Составные типы PL/SQL. 48. Составные типы PL/SQL. Составной тип содержит компоненты. В переменной, имеющей составной тип, находится одна или несколько скалярных переменных (называемых также атрибутами). Коллекцией называется упорядоченная группа элементов одного типа. Язык PL/SQL поддерживает три вида коллекций: вложенные таблицы (nested tables); индексированные таблицы; varray-массивы (variable-size arrays). Доступ к любому элементу вложенной таблицы или varray-массива осуществляется по его индексу, который указывается в скобках после имени переменной типа коллекции. Коллекция может быть передана в качестве параметра. Коллекцию можно использовать: для обмена с таблицами баз данных и столбцами данных; для передачи столбца данных из приложения клиента в хранимую процедуру или обратно. Для создания коллекции следует определить тип коллекции - TABLE или VARRAY - и объявить переменную этого типа. Вложенную таблицу можно рассматривать как одномерный массив, в котором индексами служат значения целочисленного типа в диапазоне от 1 до 2147483647. Вложенная таблица может иметь пустые элементы, которые появляются после их удаления встроенной процедурой DELETE. Вложенная таблица может динамически увеличиваться. Индексированная таблица - это вариант вложенной таблицы, в которой элементы могут иметь произвольные целочисленные значения индексов. Такой тип данных очень удобен, если в качестве индекса использовать значение первичного ключа. Максимальное количество элементов в Varray-массиве указывается при определении типа и не может изменяться динамически. Доступ к каждому элементу Varray-массива осуществляется по индексу. Varray-массивы можно передавать в качестве параметров. Varray-массивы не могут иметь пустот, так как для них нет операции удаления произвольного элемента массива. 46 49. Функции и методы коллекций. Методы нельзя вызывать из SQL-оператора. Наз-ся: collection_name.method_name[(parameters)] Функция Описание EXISTS(n) Если n-ый элемент коллекции существует, то функция возвращает значение TRUE COUNT Функция возвращает реальное количество элементов, которые содержит коллекция LIMIT Функция возвращает размер varray-массива или NULL - для вложенных таблиц DELETE(m,n) Эта процедура удаляет элементы из вложенной или индексированной таблицы. Если параметров не задано, то удаляются все элементы коллекции. При задании параметра n удаляется n-ый элемент вложенной таблицы, а если задано оба параметра, то удаляются все элементы в диапазоне от n до m FIRST, LAST Функции возвращают наименьший и наибольший индекс элементов коллекции. Для пустой вложенной таблицы обе функции возвращают значение NULL. Для Varray-массивов вызов функции FIRST всегда возвращает значение 1 PRIOR(n) Эта функция используется для цикла или последовательного просмотра элементов вложенных таблиц и возвращает индекс элемента, предшествующего указанному параметром n. Если такого элемента нет, то возвращается значение NULL NEXT(n) Функция употребляется для цикла или последовательного просмотра элементов вложенных таблиц и возвращает индекс элемента, следующего за указанным параметром n. Если такого элемента нет, то возвращается значение NULL EXTEND(n,i) Функция увеличивает размер вложенной или индексированной таблицы, позволяя добавлять в конец коллекции как один элемент, так и несколько элементов. Если параметров не задано, то в коллекцию добавляется один null-элемент, а если указан только параметр n, то добавляются n nullэлементов. Если задано оба параметра, то добавляются n элементов, являющихся копиями i-го элемента коллекции TRIM(n) Функция выполняет удаление одного или нескольких элементов вложенной или индексированной таблицы. Если параметры не указаны, то удаляется один последний элемент, а при задании параметра удаляются n последних элементов коллекции. Если значение параметра превышает реальное количество элементов, возвращаемое функцией COUNT, то инициируется исключение. Если элемент был ранее удален функцией DELETE, то он все равно будет входить в число удаляемых функцией TRIM элементов record_count := current_parts_table.count; current_parts_record := current_parts_table.first; current_parts_table.delete(3); current_parts_table.delete(4,6); current_parts_table.delete; 47 50. Инициализация переменных, записей и коллекций. Для инициализации коллекции используется конструктор - автоматически создаваемая функция, одноименная с типом коллекции. Конструктор создает коллекцию из значений переданного ему списка параметров. Конструктор может быть вызван как в секции объявлений через знак присваивания после указания типа, так и в теле программы. Вызов конструктора без параметров означает инициализацию коллекции как пустой, но не устанавливает ее равной NULL. Конструктор можно вызывать в любом месте, где допустим вызов функции. Для того чтобы добавить в таблицу базы данных строку, одно из полей которой имеет тип коллекции, следует использовать конструктор. 51. Виды и назначение курсоров. Курсор - указатель на текущую строку результирующего множества оператора (рабочей области). Для курсоров установлен ряд ограничений. К примеру, программа PL/SQL не может передавать курсор другой программе в качестве параметра – открывать курсор и обрабатывать соответствующую информацию можно только непосредственно в самой программе. Курсорные переменные (cursor variables). Типы курсоров (cursor types) – определяются пользователями: * Неявный – управляется автоматически, прозрачно для Вас, исп-ся, если надо возвратить единственную строку из таблицы. В процессе выполнения, курсор открывается, из него выбираются данные и закрывается, все за один шаг. * Явный – используется, когда ожидается, что запрос может вернуть как ни одной, так и много строк; позволяет выполнить сложные действия (логику) при выборке каждой строки. Управление явными курсорами осуществляет программист. Этапы исп-я: 1. Объявление курсора. 2. Открытие (OPEN) курсора. 3. Извлечение (FETCH) данных из курсора один или более раз. 4. Закрытие (CLOSE) курсора. Также бывают: параметризированные и не параметризированные, строгие и нестрогие. 48 52. Явные курсоры. 1. При объявлении курсора ему назначается имя и ставится в соответствие некоторый оператор SELECT. Синтаксис объявления курсора: CURSOR имя_курсора IS onepamop_SELECT 2. Курсор открывается следующим образом: OPEN имя_курсора; Когда курсор открывается, происходит следующее: • Анализируются значения переменных привязки. • На основе их значений и содержимого таблиц, к которым обращ-ся запрос, определяется активный набор. • Указатель активного набора устанавливается на первую строку. 3. Считывание строк из курсора. Предложение INTO запроса является частью оператора FETCH. FETCH имя_курсора INTO список_переменных; FETCH имя._курсора INTO зanuсь PL/SQL; 4. После того как весь активный набор выбран, курсор следует закрыть. Это сообщает PL/SQL, что программа закончила работу с курсором и отведенные для него ресурсы могут быть освобождены. В состав этих ресурсов, входит пространство для хранения активного набора, а также временное пространство, используемое для определения активного набора. Синтаксис закрытия курсора: CLOSE имя_курсора; После закрытия курсора считывать из него строки нельзя. 1 - вып-ся в разделе объявлений блока. 2, 3, 4 - производятся в выполняемом разделе или в разделе исключительных ситуаций. 53. Неявные курсоры. Каждый оператор SQL выполняется в пределах контекстной области и поэтому имеет курсор, указывающий на конкретную контекстную область. Такой курсор называется SQLкурсором. PL/SQL неявно открывает SQL-курсор, обрабатывает SQL-оператор и затем закрывает этот курсор. Неявные курсоры используются для обработки операторов INSERT, UPDATE, DELETE, а также однострочных операторов SELECT...INTO. Команды OPEN, FETCH и CLOSE не нужны. но для SQL-курсоров можно применять курсорные атрибуты. Курсорный цикл FOR - итеративная конструкция, которая позволяет использовать OPEN, FETCH, CLOSE курсор в пределах цикла. Он позволяет выполнять операции над каждой строкой, выбранной в цикле. Если Вам нужно прервать цикл преждевременно, используйте явные курсоры (с их большим управлением). 54. Атрибуты явных и неявных курсоров. Разработчик может использовать любые из четырех атрибутов курсоров с точно таким же синтаксисом, как и у статических курсоров. По правилам, управляющим их использованием, и значениям, возвращаемым атрибутами, они ничем не отличаются от явных курсоров. Так, для объявления курсорной переменной из предыдущего примера могут использоваться следующие атрибуты: var_cur%ISOPEN var_cur%FOUND var_cur%NOTFOUND var_cur%ROWCOUNT 49 55. Курсорные типы, переменные и выражения (подзапросы). Курсорная переменная ссылается на курсор. В отличие от явного курсора, имя которого в PL/SQL используется как идентификатор рабочей области результирующего набора строк, курсорная переменная содержит ссылку на эту рабочую область. Явные и неявные курсоры имеют статическую природу, поскольку они жестко привязаны к конкретным запросам. С помощью же курсорной переменной можно выполнить любой запрос и даже несколько разных запросов в одной программе. Важнейшим преимуществом курсорных переменных является то, что они предоставляют механизм передачи результатов запроса (выбранных из строк курсора) между разными программами PL/SQL, в том числе между клиентскими и серверными программами. До выхода PL/SQL Release 2.3 приходилось выбирать из курсора все данные, сохранять их в переменных PL/SQL (например, в коллекции) и передавать эти данные в аргументах. А курсорная переменная позволяет передать другой программе ссылку на объект курсора, чтобы та могла работать с его данными. Это упрощает программный код и повышает его эффективность. Кроме того, курсоры могут совместно использоваться несколькими программами. Например, в архитектуре «клиент-сервер» клиентская программа может открыть курсор и начать выборку из него данных, а затем передать указывающую на него переменную в качестве аргумента хранимой процедуре на сервере. Эта процедура продолжит выборку, а некоторое время спустя снова передаст управление клиентской программе, которая закроет курсор. Так же могут взаимодействовать и две разные хранимые программы из одного или разных экземпляров Oracle. Описанный процесс схематически показан на рис. 1. Он демонстрирует интересные новые возможности программ PL/SQL — совместное использование данных и управление курсорами. Рис. 1. Передача ссылки на курсор между программами 50 55.1. Когда используются курсорные переменные? Ниже перечислены основные области применения курсорных переменных. Курсорные переменные могут связываться с разными запросами в разные моменты выполнения вашей программы. Иначе говоря, одна курсорная переменная может использоваться для выборки данных из разных результирующих наборов. Курсорные переменные могут передаваться в аргументах процедур или функций. По сути, передавая ссылку на результирующий набор курсора, вы организуете совместное использование его результатов. Полноценное использование функциональности статических курсоров PL/SQL . Вы можете применять OPEN, CLOSE и FETCH к своим курсорным переменным в программах PL/SQL , а также обращаться к стандартным атрибутам курсоров — %IS0PEN, %FOUND, %NOTFOUND и %ROWCOUNT. Присваивание содержимого одного курсора (и его результирующего набора) другой курсорной переменной. Курсорная переменная, как и любая другая переменная, может использоваться в операциях присваивания. Однако, как будет показано позднее в этом блоге, на применение таких переменных устанавливаются определенные ограничения. Сходство со статическими курсорами При проектировании курсорных переменных одно из важнейших требований заключалось в том, что семантика управления объектами курсоров по возможности должна совпадать с семантикой управления статическими курсорами. Хотя объявления курсорных переменных и синтаксис их открытия были усовершенствованы, следующие операции с курсорными переменными не отличаются от операций со статическими курсорами: Команда CLOSE В следующем примере объявляется тип REF CURSOR и курсорная переменная для этого типа. Затем курсорная переменная закрывается с использованием того же синтаксиса, что и для статических курсоров: DECLARE TYPE var_cur_type IS REF CURSOR; var_cur var_cur_type; BEGIN OPEN var_cur FOR ... CLOSE var_cur; END; 51 56. Управляющие структуры PL/SQL. Область действия счетчика цикла, ограничения безусловных переходов. Условное управление: Оператор IF–ELSIF–ELSE в программе PL/SQL вычисляет некоторое логическое условие и, когда это условие истинно (TRUE), выполняет один или несколько операторов. if условие then оператор 1;оператор 2; elsif (не elseif) оператор 3;оператор 4; else оператор 5;оператор 6; end if; Итерационное управление: Для повторения выполнения группы операторов в PL/SQL-программах можно применять циклы. В примерах псевдопрограмм, приведенных ниже, продемонстрировано использование базовых циклов, циклов WHILE и FOR. -- БАЗОВЫЙ ЦИКЛ (LOOP) С ИСПОЛЬЗОВАНИЕМ EXIT – WHEN loop оператор 1; оператор 2; exit when условие; end loop; -- ЦИКЛ WHILE while условие loop оператор 1; оператор 2; end loop; -- ЦИКЛ FOR С ВЛОЖЕННЫМИ ЦИКЛОМ И МЕТКАМИ « внешний_цикл » – метка или имя цикла for x in у.. z loop внешний_оператор1; « внутренний_цикл » loop внутренний_оператор1; внутренний_оператор2; exit внешний_цикл when условие1; exit внутренний_цикл when условие2; end loop внутренний_цикл; внешний_оператор2; end loop внешний_цикл; Для завершения каждого базового цикла необходимо использовать при его определении либо оператор EXIT WHEN, либо оператор EXIT; в противном случае цикл будет выполняться бесконечно. При определении цикла WHILE или FOR требуется описывать способ завершения этого цикла. В третьем примере показано, как организовывать вложение циклов, применять для именования циклов специальные метки и ссылаться на определенные циклы по имени в операторах EXIT и END LOOP. 52 57. Директивы компилятора. Механизм условной компиляции, появившийся в Oracle Database 10g Release 2, позволяет организовать избирательную компиляцию частей программы в зависимости от условий, заданных в директиве $IF. Например, условная компиляция будет очень полезна, если вам потребуется: Написать программу, которая работает в разных версиях Oracle и использует специфические возможности этих версий. А конкретнее — если вы хотите использовать новые возможности Oracle там, где они доступны, но при этом ваша программа также должна компилироваться и работать в старых версиях. Без условной компиляции вам придется вести несколько разных файлов или использовать сложную логику подстановки переменных в SQL*Plus. Выполнять некоторый код во время тестирования и отладки, но пропускать его в окончательной версии. До появления условной компиляции вам пришлось бы либо закрывать нежелательные строки комментариями, либо добавлять лишние проверки в логику приложения — даже в окончательную версию. Устанавливать/компилировать разные элементы приложения в зависимости от требований (например, набора компонентов, на которые у пользователя имеется лицензия). Условная компиляция очень сильно упрощает ведение сложной кодовой базы. Условная компиляция реализуется посредством включения директив компилятора в исходный код. При компиляции программы препроцессор PL/SQL обрабатывает директивы и выбирает те части кода, которые требуется откомпилировать. «Урезанный» исходный код передается компилятору для дальнейшей обработки. Директивы делятся на три типа: Директивы выбора — директива $IF проверяет выражение и определяет, какой код следует включить в обработку (или исключить из нее). Директивы получения информации — синтаксис $$identifier используется для обращения к флагам условной компиляции. К директивам получения информации можно обращаться в директиве $IF или использовать их независимо в коде. Директивы ошибок — директива $ERROR используется для вывода ошибок компиляции на основании условий, вычисленных при подготовке кода препроцессором. 53 58. Автономные транзакции. Автономной транзакцией называется транзакция, которая начинается в контексте другой транзакции (транзакция-предок), но не зависит от нее. Автономная транзакция может завершаться или откатываться независимо от состояния транзакции-предка. Прагма AUTONOMOUSJTRANSACTION Автономную транзакцию можно выполнить только внутри блока PL/SQL. Блок помечается как автономный с помощью прагмы в разделе объявлений. Прагма указывает компилятору PL/SQL на то, что блок должен обрабатываться как автономный. Расположение прагмы. Прагма AUTONOMOUSJTRANSACTION должна находиться в разделе объявлений блока, причем только одна прагма допускается в блоке. Она может указываться в любом месте раздела объявлений, но хорошим стилем программирования является размещение ее в начале. Типы автономных блоков. Не все блоки можно пометить как автономные. Это допустимо только для: • Анонимных блоков верхнего уровня • Локальных, независимых и модульных подпрограмм • Методов объектных типов • Триггеров базы данных В частности, вложенные блоки PL/SQL не могут быть автономными. Только отдельные подпрограммы в модуле могут помечаться как автономные — сам модуль не может быть автономным. Свойства автономных транзакций. Автономная транзакция начинается с первой инструкции SQL в автономном блоке и заканчивается оператором COMMIT или ROLLBACK. Любой оператор управления транзакцией может использоваться в автономной транзакции, включая COMMIT, ROLLBACK, SAVEPOINT, ROLLBACK TO SAVEPOINT и SET TRANSACTION. Точки сохранения являются локальными для текущей транзакции. Следовательно, нельзя вернуться к точке сохранения в транзакции-предке. Завершение автономных транзакций. Автономная транзакция завершается оператором COMMIT или ROLLBACK. Она не заканчивается с завершением содержащего ее блока. Если автономный блок заканчивается без окончания транзакции, то возникает ошибка и автономная транзакция откатывается. 54 59. Секция исключительных ситуаций. В программах PL/SQL подпрограммы обработки ошибок в тело программы не встроены. Они представляют собой так называемые обработчики исключительных ситуаций. Распознав ошибку, программа PL/SQL устанавливает (raises) исключительную ситуацию (exception) и передает управление соответствующей подпрограмме – обработчику исключительных ситуаций. Исключительная ситуация представляет собой поименованное условие возникновения ошибки. Исключительные ситуации, определяемые пользователями, можно объявлять в разделе объявлений программы. Однако чтобы затем установить такую исключительную ситуацию, необходимо выполнить ее явную проверку. При желании можно назначить индивидуальный номер ошибки ORACLE исключительной ситуации, определяемой пользователем. При вызове программой указанной ошибки ORACLE автоматически устанавливается исключительная ситуация, определяемая пользователем. Обработчик исключительной ситуации – это подпрограмма, которой передается управление в случае установления ею соответствующей исключительной ситуации. 60. Использование SQL в PL/SQL. Понятие привязки. Из всех SQL-операторов в программах PL/SQL напрямую можно использовать лишь операторы DML и операторы управления транзакциями. Операторы DDL – использовать нельзя. Привязка (binding) переменной – это процесс указания области памяти, соответствующей некоторому идентификатору программы. В PL/SQL в процесс привязки входит также проверка базы данных на наличие полномочий, позволяющих обращаться к объектам схем. В том языке, где используется ранняя привязка (early binding), этот процесс осуществляется на этапе компиляции программы, а в языке, где применяется поздняя привязка (late binding), она откладывается до времени выполнения программы. Ранняя привязка означает, что этап компиляции программы будет занимать большее время (так как при этом нужно привязывать переменные), однако выполняться программа будет быстрее, поскольку к этому моменту привязка будет завершена. Таким образом, поздняя привязка сокращает время компиляции, но увеличивает время выполнения программы. При разработке PL/SQL было принято решение об использовании ранней привязки, чтобы объекты базы данных к моменту выполнения блока были уже проверены, и чтобы блок мог быть выполнен максимально быстро. Это вполне оправданно, так как блоки PL/SQL можно хранить в базе данных как процедуры, функции, модули и триггеры. Такие объекты хранятся в скомпилированном виде, то есть при необходимости их можно загрузить из базы данных и выполнить. Именно поэтому операторы DDL использовать нельзя. Оператор DDL модифицирует объект базы данных, следовательно, полномочия на объект должны быть подтверждены вновь. Процесс подтверждения полномочий требует привязки идентификаторов, а это уже было сделано во время компиляции. 55 61. Динамический SQL: использование пакета DBMS_SQL. Для динамических операторов устанавливается меньшее число ограничений: многое из того, что необходимо знать во время компиляции, вовсе не обязательно описывать до этапа выполнения программы. Полное описание SQL-оператора можно дать во время его выполнения. Динамический SQL помимо всего позволяет также выполнять и DDL операторы, создавая их динамически, во время выполнения программы, а затем проводя их грамматический разбор и обработку. Возможность выполнения DDL-инструкций – это также преимущество динамического SQL. Приложение в случае наличия определенных привилегий пользователя всегда может создавать временные таблицы в схеме базы данных и использовать их с целью временного хранения результатов промежуточных вычислений. Выполнять SQL-конструкции с помощью PL/SQL можно двумя способами: 1) воспользоваться DBMS_SQL, модулем (в нем - средства обработки массивов). 2) внутренний динамический SQL (динамические операторы управления встраиваются непосредственно в язык и поэтому выполняются значительно быстрее, чем DBMS_SQL) При разработке PL/SQL было принято решение об использовании ранней привязки, чтобы объекты базы данных к моменту выполнения блока были уже проверены, и чтобы блок мог быть выполнен максимально быстро. Это вполне оправданно, так как блоки PL/SQL можно хранить в базе данных как процедуры, функции, модули и триггеры. Такие объекты хранятся в скомпилированном виде, то есть при необходимости их можно загрузить из базы данных и выполнить. Именно поэтому операторы DDL использовать нельзя. Оператор DDL модифицирует объект базы данных, следовательно, полномочия на объект должны быть подтверждены вновь. Процесс подтверждения полномочий требует привязки идентификаторов, а это уже было сделано во время компиляции. 56 62. Общий алгоритм обработки SQL операторов в DBMS_SQL, осн. ф-ии пакета. Использование динамического SQL — естественная возможность работать с базой данных через функциональный интерфейс, такой как ODBC, JDBC и OCI. Статический SQL обычно принято использовать в средах с предварительной компиляцией кода, таких как Pro*C, SQLJ и PL/SQL. При работе через функциональный интерфейс поддерживается только динамический SQL. Программист создает запрос в виде строки, а затем эта строка анализируется, связываются входящие в нее переменные, запрос выполняется, при необходимости выбираются строки из результирующего множества через курсор и, наконец, соответствующий курсор закрывается. В среде статического SQL эти действия выполняются автоматически. Версия с динамическим SQL требует от разработчика написания гораздо большего объема кода. Статический SQL обеспечивает более высокую производительность труда программиста при написании кода (приложения разрабатываются быстрее), но динамический SQL обеспечивает большую гибкость при выполнении (программа в ходе работы может делать то, что не внесено в ее код явно). Кроме того, статический SQL (особенно в среде PL/SQL) будет выполняться намного эффективнее, чем динамический. Используя статический SQL, PL/SQL-машина при обработке одной строки интерпретируемого кода может сделать то, на что потребуется пять или шесть строк интерпретируемого кода с динамическим SQL. Когда использовать динамический SQL? •Разработка обобщенных процедур, выполняющих стандартные действия вроде выгрузки данных в файлы. •Разработка универсальных процедур загрузки данных в не известные заранее таблицы. •Динамический вызов других PL/SQL-процедур во время выполнения. •Генерация условий (например, конструкции WHERE) в процессе работы на основе введенных пользователем данных. Это, пожалуй, основная причина использования динамического SQL большинством разработчиков. •Выполнение операторов ЯОД. Поскольку PL/SQL не разрешает включать статические операторы ЯОД в код приложения, остается использовать динамический SQL. Это позволит выполнять операторы, начинающиеся с ключевых слов CREATE, ALTER, GRANT, DROP и т.п. Решаться перечисленные задачи будут с помощью двух средств языка PL/SQL. Пакет DBMS_SQL обеспечивает процедурный метод выполнения динамического SQL, аналогичный использованию функциональных интерфейсов (таких как JDBC или ODBC). Затем поговорим о встроенном динамическим SQL (который реализуется в PL/SQL оператором EXECUTE IMMEDIATE). Это декларативный способ выполнения динамического SQL в языке PL/ SQL и в большинстве случаев он синтаксически намного проще, чем использование пакета DBMS_SQL; кроме того, он обеспечивает более высокую производительность. Учтите, что многие подпрограммы пакета DBMS_SQL по-прежнему являются жизненно важными и активно используются в PL/SQL 57 62.1. Пакет DBMS_SQL необходимо использовать в следующих случаях. •Если заранее не известно количество или типы столбцов, с которыми придется работать. Пакет DBMS_SQL включает процедуры для описания результирующего множества. Встроенный динамический SQL не позволяет получить такое описание. При использовании встроенного динамического SQL необходимо знать характеристики результирующего множества при компиляции, если результаты необходимо обрабатывать в PL/SQL. •Если заранее не известно количество или типы связываемых переменных, с которыми придется работать. Пакет DBMS_SQL по ходу выполнения позволяет привязать с помощью процедур входные переменные к операторам. Встроенный динамический SQL требует учета количества и типов связываемых переменных на этапе компиляции (я приведу интересный способ решения этой проблемы). •Когда необходимо выбирать или вставлять тысячи строк и можно использовать обработку массивов. Пакет DBMS_SQL поддерживает обработку массивов — возможность выбрать N строк за раз, одним вызовом. Встроенный динамический SQL обычно не позволяет этого сделать, но это ограничение можно обойти, как будет показано далее. •Если в сеансе многократно выполняется один и тот же оператор. Пакет DBMS_SQL позволяет один раз разобрать оператор, а затем выполнять его многократно. При использовании встроенного динамического SQL мягкий разбор будет осуществляться при каждом выполнении. В главе 10 было показано, почему такие дополнительные повторные разборы нежелательны. Встроенный динамический SQL имеет смысл использовать в следующих случаях. •Когда количество и типы столбцов, с которыми придется работать, заранее известны. •Когда заранее известно количество и типы связываемых переменных. (Можно также использовать контексты приложений, чтобы с помощью более простого встроенного динамического SQL выполнять операторы с заранее неизвестным количеством или типами связываемых переменных.) •Когда необходимо выполнять операторы ЯОД. • Если динамически формируемые операторы будут выполняться лишь несколько раз (оптимальный вариант — однократно). 63. Алгоритм обработки данных в DBMS_SQL. 1. Преобразование SQL – оператора в строку символов; 2. Грамматический разбор строки символов с помощью DBMS_SQL.PARSE; 3. Привязка всех входных переменных с помощью DBMS_SQL.BIND_VARIABLE; 4. Если выполняемый оператор — это оператор DML или DDL (UPDATE, DELETE, INSERT) – выполнение его с помощью DBMS_SQL.EXECUTE с последующим считыванием выходных переменных привязки с помощью DBMS_SQL.VARIABLE_VALUE (если нужно), 5. Если оператор является оператором извлечения (SELECT) – описание выходных переменных с помощью DBMS_SQL.DEFINE_COLUMN; 6. Выполнение запроса на выборку с помощью DBMS_SQL.EXECUTE и выборка результатов при помощи DBMS_SQL.FETCH_ROWS и DBMS_SQL.COLUMN_VALUE. 58 64. Алгоритм обработки многострочного оператора SELECT в DBMS_SQL. Подзапросы ( subqueries ) реализуются в запросах, обработка которых должна выполняться за несколько шагов, и конечный результат в которых зависит от результатов выполнения какого-то дочернего запроса или подзапроса. Подзапрос, который размещается в операторе внутри конструкции WHERE , называется вложенным (nested subquery ). Анализ с получением n-го количества первых показателей (Top-N Analysis) Следующий запрос предусматривает получение данных о десяти первых сотрудниках с точки зрения их зарплаты. Точно так же легко можно извлечь данные и о десяти последних с точки зрения зарплаты сотрудников, просто применив вместо конструкции ORDER BY DESC конструкцию ORDER BY . SQL> SELECT emp_id, emp_name, job, manager, salary FROM (SELECT emp_id, emp_name, job, manager, salary, RANK() OVER (ORDER BY SALARY DESC NULLS LAST) AS Employee_Rank FROM employees ORDER BY SALARY DESC NULLS LAST) WHERE employee_Rank < 5; Подзапросы могут представлять собой как однострочные, так многострочные операторы SQL. Давайте вкратце рассмотрим каждый из этих видов подзапросов. Многострочные запросы Многострочный подзапрос (multiple-row subquery) предусматривает возврат множества строк в выводе, поэтому вместе с ним необходимо применять многострочные операции сравнения наподобие IN, ANY и ALL . В случае использования с ним однострочной операции Oracle будет выдавать такую довольно распространенную ошибку: ERROR: ORA-01427: single-row subquery returns more than one row однострочный подзапрос возвращает более одной строки Многостолбцовые подзапросы Многостолбцовыми подзапросами ( multiple-column subqueries ) называются запросы, в которых внутренний запрос извлекает значения более чем одного столбца. Строки, возвращаемые такими подзапросами, далее вычисляются в основном запросе путем сравнения соответствующих пар, столбцов со столбцами и строк со строками. Усовершенствованные подзапросы Коррелированные подзапросы (correlated subqueries) являются сложнее обычных и позволяют получать ответы на вопросы вроде: “Как выглядят имена все тех сотрудников, которые имеют зарплату ниже средней в своем отделе?”. Показатель средней зарплаты может вычисляться во внутреннем запросе, а информация о сотрудниках получаться во внешнем или основном запросе. Однако этот внутренний запрос должен обязательно выполняться для каждого сотрудника в основном (внешнем) запросе, потому что средние показатели отделов будут зависеть от номера отдела сотрудника во внешнем запросе. 59 65. Встроенный динамический SQL (NDS) и массовое связывание. Встроенный динамический SQL является составной частью самого языка. Вследствие этого он значительно проще в применении и быстрее, чем модуль DBMS_SQL. Блоки PL/SQL и выполнение операторов, не содержащих запросов (EXECUTE IMMEDIATE). 1) для выполнения DDL, DML и анонимных блоков PL/SQL. Выполняемая строка может задаваться как литерал, заключенный в одиночные кавычки (операторы CREATE TABLE и DROP TABLE) или как переменная типа символьной строки PL/SQL (оператор INSERT и анонимные блоки). Завершающая точка с запятой не нужна для операторов DML и DDL, но указывается для анонимных блоков. 2) для выполнения операторов со связанными переменными. В этом случае выполняемая строка содержит специальные позиции, помеченные двоеточием. Позиции предназначены для размещения переменных PL/SQL, которые указываются в предложении USING оператора EXECUTE IMMEDIATE. Выполнение запросов. Оператор OPEN FOR - аналогично курсорным переменным. Различие состоит в том, что строка, содержащая запрос, может быть переменной PL/SQL, а не литералом. К получаемой курсорной переменной можно обращаться так же, как и к любой другой переменной. Для связывания используется предложение USING, так же как в операторе EXECUTE IMMEDIATE. Выполнение запросов с помощью EXECUTE IMMEDIATE: EXECUTE IMMEDIATE можно также использовать для однострочных запросов, с применением или без применения переменных привязки. В случае массовых связываний его можно использовать и для многострочных запросов. Требование состоит в том, чтобы все строки извлекались в одной операции. Массовое связывание. Операторы SQL в блоках PL/SQL посылаются системе поддержки SQL. Система поддержки SQL в свою очередь может посылать данные назад системе поддержки PL/SQL. При выполнении этого блока в таблицу temp_table вставляется 500 строк. Однако каждая операция INSERT делается отдельно. Это приводит к 500 переключениям контекста между PL/SQL и SQL. Можно переключить контекст только один раз, передавая всю таблицу PL/SQL в систему выполнения SQL за один шаг, который называется массовым связыванием (bulk bind). Массовые связывания выполняются с помощью оператора FORALL. Массовые связывания могут использоваться также с запросами для извлечения за один раз более одной строки активного набора. 60 66. Программные единицы PL/SQL. Общие атрибуты. Программные единицы в составе БД Oracle - хранимые процедуры, функции и пакеты. Язык программирования PL/SQL позволяет создавать разнообразные именованные программные единицы – контейнеры для кода. В них входят: Процедура – программа, выполняющая одну или несколько команд. Функция – программа, выполняющая одну или несколько команд и возвращающая значение. Пакет – контейнер для процедур, функций и структур данных. Триггер – программа, выполняемая в ответ на изменение в БД. Объектный тип – Oracle-версия класса в объектно-ориентированном языке; элементами объектных типов могут быть процедуры и функции. Объектный тип может содержаться в своих методах код PL/SQL. Хранимая процедура (stored procedure) — это программа, которая выполняет некоторые действия с информацией в базе данных и при этом сама хранится в базе данных. В Oracle хранимые процедуры можно писать на языках PL/SQL и Java. Хранимые процедуры могут входные параметры и возвращать результаты. В отличие от триггеров, которые принадлежат определенной таблице или представлению, хранимые процедуры принадлежат базе данных в целом. Они могут вызываться любым процессом, использующим базу данных, при условии, что у этого процесса есть достаточные права доступа. Хранимые процедуры используются для многих целей. Хотя администраторы баз данных используют их для выполнения рутинных задач администрирования, главной областью их применения являются все же приложения баз данных. Эти процедуры могут вызываться из прикладных программ, написанных на таких языках, как Java, С#, С++ или VB.Net, а также из вебсценариев, написанных на VBScript или JavaScript. Кроме того, эти процедуры можно вызывать в интерактивном режиме из командной оболочки SQL*Plus. Можно выделить следующие преимущества хранимых процедур: В отличие от кода приложений, хранимые процедуры никогда не передаются на клиентские компьютеры. Она всегда находятся в базе данных и выполняются СУБД на том компьютере, где располагается сервер базы данных. Таким образом, они более безопасны, чем распространяемый код приложения, а кроме того, снижают сетевой трафик. Хранимые процедуры постепенно становятся предпочтительным режимом реализации логики приложения в сети Интернет и корпоративных интрасетях. Еще одно преимущество хранимых процедур заключается в том, что SQL-операторы в них могут быть оптимизированы компилятором СУБД CREATE OR REPLACE PROCEDURE TESTPRM (NUM IN NUMBER) IS in_COMP VARCHAR2(50); BEGIN SELECT COMPANY INTO in_COMP FROM customers WHERE customers.CUST_NUM = NUM; DBMS_OUTPUT.enable; DBMS_OUTPUT.put_line(in_COMP); END TESTPRM; / SET SERVEROUTPUT ON DECLARE BEGIN TESTPRM(2112); END; / 61 66.1. Функция – это подпрограмма, которая вычисляет значение. CREATE OR REPLACE Function FindCourse ( name_in IN varchar2 ) RETURN number IS cnumber number; cursor c1 is SELECT course_number FROM courses_tbl WHERE course_name = name_in; BEGIN open c1; fetch c1 into cnumber; if c1%notfound then cnumber := 9999; end if; close c1; RETURN cnumber; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001,'An error was encountered - '||SQLCODE||' -ERROR'||SQLERRM); END; CREATE OR REPLACE PACKAGE имя_модуля {IS AS} описание_процедуры | описание_функции | объявление_переменной | определение_типа | объявление_исключительной_ситуации | объявление_курсора | END [имя_модуля]; Тело модуля определяется так: CREATE OR REPLACE PACKAGE BODY имя_модуля {IS AS} код_инициализации_процедуры | код_инициализации_функции | END [имя_модуля]; По большому счету тело модуля не является обязательной частью. Если заголовок модуля содержит описание, скажем нескольких переменных, типов и курсоров, то создавать тело модуля нет необходимости. Такой способ целесообразен при объявлении глобальных переменных, поскольку все объекты модуля видимы вне его пределов. процедуры функции типы курсоры. 62 67. Создание и использование процедур. Хранимые процедуры и функции в отличие от анонимных блоков сохраняются в базе данных и наряду с таблицами, представлениями и др. являются самостоятельными объектами баз данных ORACLE. Модуль (package) – это группа процедур, функций и других конструкций, хранимых вместе в базе данных как одна единица. Модули особенно полезны для компоновки нескольких процедур и функций, имеющих отношение к конкретному приложению баз данных. 1.OR REPLACE- изменение текста процедуры (удаление и повторное создание) за один раз. Если процедура существует, то она удаляется без всякого предупреждения (в данном случае вызов инструкции DROP PROCEDURE не требуется), если же не существовала, то она просто создаётся 2. DECLARE – объявить 3. BEGIN – выполнить сreate[or replace] procedure имя_процедуры [(аргумент1 [{in | out | in out}] тип, … аргумент2 [{in | out | in out}] тип)] {is|as} тело процедуры/ Вызов процедур и функций: Приложение может вызывать процедуру в анонимном блоке PL/SQL. Вызов функций может осуществляться либо в анонимном блоке посредством оператора присваивания, либо в условии WHEN SQL – оператора. 68. Создание и использование (вызов) функций. сreate[or replace] function имя_функции [(аргумент1 [{in | out | in out}] тип, … аргумент2 [{in | out | in out}] тип)] return возвращаемый тип{is|as} тело функции оператор return/ Оператор RETURN имеет общий синтаксис: RETURN выражение. Выражение – это возвращаемое значение. Значение выражения преобразуется в тип, указанный в команде RETURN при описании функции, если, конечно, это значение уже не имеет данный тип. create or replace function get_customer_address (last in varchar2, firsr in varchar2) return varchar2 is addr varchar2(20); begin select address into addr from customers where lname=last and fname=first; return addr; exception when others then return NULL; end get_customer_address;/ 63 69. Локальные программы, перегрузка программ, табличные функции. Локальные программы могут быть перегружены, при этом действуют те же правила, что и для перегруженных программ пакетов. Перегрузка программ.PL/SQL позволяет определить внутри любой секции объявлений (в том числе в спецификации или теле пакета) несколько программ с одинаковыми именами. Такой прием называется перегрузкой. Если две или более программ имеют одно и то же имя, они должны отличаться чем-то другим, чтобы компилятор мог определить, которую из них следует использовать. Рассмотрим пример перегруженных программ в одной из спецификаций встроенного пакета Oracle: PACKAGE DBMS_OUTPUT IS PROCEDURE PUT_LINE (a VARCHAR2); PROCEDURE PUT_LINE (a NUMBER); PROCEDURE PUT_LINE (a DATE); END; Все процедуры PUT_LINE идентичны во всем, кроме типа данных параметра. Для компилятора такого различия достаточно. Для успешной перегрузки необходимо, чтобы было выполнено хотя бы одно из приведенных ниже условий: - наборы параметров должны отличаться по типам данных (числовой, строковый, дата-ивремя, логический); - должны отличаться типы программ (можно создать функцию и процедуру с одинаковыми именами и идентичными списками параметров); - количество параметров должно быть разным. Программы не удастся перегрузить, если: - отличаются только типы данных в инструкции RETURN для функций; - типы данных параметров относятся к одному семейству (СHAR и VARCHAR2, NUMBER и INTEGER и т.д.); - отличаются только режимом использования параметров. Программы, которые существуют в одной области видимости и имеют одинаковые имена, называются перегруженными. PL/SQL поддерживает перегрузку процедур и функций в разделе объявлений блока (именованного или неименованного), в теле и спецификации пакета, а также в объявлении объектного типа. В следующем простом примере представлены три перегруженные подпрограммы, определенные в разделе объявлений анонимного блока (а следовательно, являющихся локальными): DECLARE /* Первая версия получает параметр DATE. */ FUNCTION value_ok (date_in IN DATE) RETURN BOOLEAN IS BEGIN RETURN date_in <= SYSDATE; END; 64 69.1. /* Вторая версия получает параметр NUMBER. */ FUNCTION value_ok (number_in IN NUMBER) RETURN BOOLEAN IS BEGIN RETURN number_in > 0; END; /* Третья версия - процедура! */ PROCEDURE value_ok (number_in IN NUMBER) IS BEGIN IF number_in > 0 THEN DBMS_OUTPUT.PUT_LINE (number_in || 'is OK!'); ELSE DBMS_OUTPUT.PUT_LINE (number_in || 'is not OK!'); END IF; END; BEGIN Преимущества перегрузки Необходимость поддержки разных типов и наборов данных. Если одно и то же действие применяется к разным видам и наборам данных, перегрузка обеспечивает разные варианты активизации этого действия, а не просто позволяет назвать разные действия одним именем. Адаптация программы под разные требования. Чтобы ваш код получился по возможности универсальным, можно создать несколько его версий с разными вариантами вызова. Для этого часто требуется выполнять перегрузку процедур и функций. Хорошим признаком ее уместности служит невостребованный, «лишний» код. К примеру, работая с пакетом DBMS_SQL, вы вызываете функцию DBMS_SQL. EXECUTE , но при выполнении ею DDL-команд возвращаемое значение игнорируется. Если для этой функции создать перегруженную процедуру, DDL-команду можно выполнить следующим образом: BEGIN DBMS_SQL.EXECUTE ('CREATE TABLE xyz ...'); Без применения перегрузки вы должны вызвать функцию DECLARE feedback PLS_INTEGER; BEGIN feedback := DBMS_SQL.EXECUTE ('CREATE TABLE xyz ...'); а затем игнорировать переменную feedback . Необходимость перегрузки по типу, а не по значению. Самая редкая причина для использования перегрузки. В этом случае версия перегруженной программы выбирается в зависимости от типа данных, а не их значения. Хорошим примером такого рода служит функция DBMS_SQL.DEFINE_COLUMN : пакету DBMS_SQL необходимо сообщить тип каждого столбца, выбранного при помощи динамического запроса. Для определения числового столбца можно использовать вызов DBMS_SQL.DEFINE_COLUMN (cur, 1, 1); или вызов DBMS_SQL.DEFINE_COLUMN (cur, 1, DBMS_UTILITY.GET_TIME); Конкретное значение роли не играет; мы должны указать «это число», а не привести какое-то конкретное число. Перегрузка обеспечивает элегантное решение этой проблемы. Сейчас мы рассмотрим типичный пример перегрузки, а затем разберемся с ограничениями и рекомендациями по поводу перегрузки. 65 69.2. Табличной функцией SQL называется функция, которая может вызываться из секции FROM запроса, как если бы она была реляционной таблицей. Коллекции, возвращаемые табличными функциями, можно преобразовать оператором TABLE в структуру, к которой можно обращаться с запросами из языка SQL. Табличные функции особенно удобны в следующих ситуациях: Выполнение очень сложных преобразований данных, требующих использования PL/SQL , но с необходимостью обращаться к этим данным из команд SQL . Возвращение сложных результирующих наборов управляющей среде (отличной от PL/SQL ). Вы можете открыть курсорную переменную для запроса, основанного на табличной функции, чтобы управляющая среда могла выполнить выборку данных через курсорную переменную. Табличные функции открывают массу полезных возможностей для разработчиков PL/SQL . Чтобы продемонстрировать некоторые из этих возможностей, мы поближе познакомимся с потоковыми и конвейерными табличными функциями. Потоковые табличные функции Потоковая передача данных позволяет переходить между процессами или стадиями без использования вспомогательных структур данных. Табличные функции в сочетании с выражением CURSOR позволяют организовать потоковую передачу данных через несколько промежуточных преобразований в одной команде SQL . Конвейерные табличные функции Эти функции возвращают результирующий набор в конвейерном режиме, то есть данные поступают, пока функция продолжает выполняться. Добавьте секцию PARALLEL_ENABLE в заголовок конвейерной функции — и у вас появляется функция, которая будет выполняться параллельно в параллельном запросе. До выхода Oracle Database 12c табличные функции могли возвращать только вложенные таблицы и VARRAY . Начиная с версии 12.1 появилась возможность определения табличных функций, возвращающих ассоциативные массивы с целочисленными индексами, тип которых определяется в спецификации пакета. 66 70. Триггеры БД: виды и создание, предикаты триггеров. Триггер базы данных – это хранимая процедура, которую можно связать с некоторой таблицей. Когда приложение выполняет SQL – оператор DML над таблицей, удовлетворяющей условиям, указанным в триггере, ORACLE автоматически активизирует или выполняет триггер. сreate [or replace] trigger имя_триггера {before | after | instead of} активизирующее_событие on имя_таблицы [for each row] тело_триггера Описание триггера содержит однозначно определяемые части: • список операторов, активизирующих триггер, который включает INSERT, UPDATE и/или DELETE. Триггер может быть связан с одной и только с одной таблицей; • триггер может быть активизирован до (before) или после (after) выполнения оператора триггера в зависимости от логики конкретного приложения. Последовательность событий: Триггеры активизируются при выполнении оператора DML. При активизации каждого из триггеров будут видны изменения, сделанные предыдущими триггерами, а также изменения в базе данных, внесенные оператором. Для этого каждый триггер выводит значение счетчика. Если порядок важен, следует объединить все операции в один триггер. Предикат Принимаемое значение (в операторах условного перехода в теле триггера) INSERTING TRUE, если активизирующий оператор INSERT; FALSE в противном случае. UPDATING TRUE, если активизирующий оператор UPDATE; FALSE в противном случае. DELETING TRUE, если активизирующий оператор DELETE; FALSE в противном случае. Обычно триггеры используются для аудита (контроля) информации. В базе данных Oracle имеется специальное средство, позволяющее осуществлять аудит данных, однако с помощью триггеров можно сделать аудит более гибким. Можно проверять наличие у пользователей полномочий на внесение изменений и устанавливать исключительную ситуацию (с помощью RAISE_APPLICATION_ERROR) в том случае, когда полномочия отсутствуют. 71. Структура и определение пакета. ПАКЕТ - это объект базы данных, который группирует логически связанные типы, программные объекты и подпрограммы PL/SQL. Состоят из: СПЕЦИФИКАЦИЯ пакета - это интерфейс с вашими приложениями; она объявляет типы, переменные, константы, исключения, курсоры и подпрограммы, доступные для использования в пакете. ТЕЛО пакета полностью определяет курсоры и подпрограммы, тем самым реализуя спецификацию пакета. В отличие от подпрограмм, пакеты нельзя вызывать, передавать им параметры или вкладывать их друг в друга. PACKAGE имя IS -- спецификация (видимая часть) -- объявления общих типов и объектов -- спецификации подпрограмм END [имя]; PACKAGE BODY имя IS -- тело (скрытая часть) -- объявления личных типов и объектов -- тела подпрограмм [BEGIN -предложения инициализации] END [имя]; 67 72. Вызов функции PL/SQL в SQL: правила и ограничения, примеры. Oracle позволяет вызывать пользовательские функции в коде SQL . Фактически это позволяет адаптировать язык SQL под требования конкретных приложений. Каждый раз, когда исполнительное ядро SQL вызывает функцию PL/SQL, оно должно «переключаться» на исполнительное ядро PL/SQL. При многократном вызове функции затраты на переключение контекстов могут быть весьма значительными. Требования к вызываемым функциям Чтобы определяемую программистом функцию PL/SQL можно было вызывать из команд SQL , она должна отвечать следующим требованиям: Все параметры функции должны иметь режим использования IN . Режимы IN OUT и OUT в функциях, встраиваемых в SQL-код, недопустимы. Типы данных параметров функций и тип возвращаемого значения должны распознаваться сервером Oracle. PL/SQL дополняет основные типы Oracle, которые пока не поддерживаются базой данных. Речь идет о типах BOOLEAN , BINARY_INTEGER , ассоциативных массивах, записях PL/SQL и определяемых программистом подтипах. Функция должна храниться в базе данных. Функция, определенная на стороне клиента, не может вызываться в командах SQL, так как SQL не сможет разрешить ссылку на эту функцию. По умолчанию пользовательские функции, вызываемые в SQL , оперируют данными одной строки, а не столбца (как агрегатные функции SUM , MIN и AVG ). Чтобы создать агрегатные функции, вызываемые в SQL , необходимо использовать интерфейс ODCIAggregate , который является частью среды Oracle Extensibility Framework . За подробной информацией по этой теме обращайтесь к документации Oracle. Ограничения для пользовательских функций, вызываемых в SQL С целью защиты от побочных эффектов и непредсказуемого поведения хранимых процедур Oracle не позволяет им выполнять следующие действия: Хранимые функции не могут модифицировать таблицы баз данных и выполнять команды DDL ( CREATE TABLE , DROP INDEX и т. д.), INSERT , DELETE , MERGE и UPDATE . Эти ограничения ослабляются, если функция определена как автономная транзакция. В таком случае любые вносимые ею изменения осуществляются независимо от внешней транзакции, в которой выполняется запрос. Хранимые функции, которые вызываются удаленно или в параллельном режиме, не могут читать или изменять значения переменных пакета. Сервер Oracle не поддерживает побочные эффекты, действие которых выходит за рамки сеанса пользователя. Хранимая функция может изменять значения переменных пакета, только если она вызывается в списке выборки либо в предложении VALUES или SET . Если хранимая функция вызывается в предложении WHERE или GROUP BY , она не может изменять значения переменных пакета. 68 72.1. До выхода Oracle8 пользовательские функции не могли вызывать процедуру RAISE_ APPLICATION_ERROR . Хранимая функция не может вызывать другой модуль (хранимую процедуру или функцию), не соответствующий приведенным требованиям. Хранимая функция не может обращаться к представлению, которое нарушает любое из предшествующих правил. Представлением (view) называется хранимая команда SELECT , в которой могут вызываться хранимые функции. До выхода Oracle11g для передачи параметров функциям могла использоваться только позиционная запись. Начиная с Oracle11g, допускается передача параметров по имени и смешанная запись. Какой-то пример: FUNCTION total_sales (id_in IN account.account_id%TYPE) RETURN NUMBER IS CURSOR tot_cur IS SELECT SUM (sales) total FROM orders WHERE account_id = id_in AND TO_CHAR (ordered_on, 'YYYY') = TO_CHAR (SYSDATE, 'YYYY'); tot_rec tot_cur%ROWTYPE; BEGIN OPEN tot_cur; FETCH tot_cur INTO tot_rec; CLOSE tot_cur; RETURN tot_rec.total; END; SELECT name, total_sales (account_id) FROM account WHERE status = 'ACTIVE'; 69 73. Пакет DBMS_OUTPUT. В PL/SQL не предусмотрены средства, обеспечивающие ввод/вывод. Это было сделано преднамеренно, так как для работы с данными, хранимыми в базе, выводить значения переменных и структуры данных не нужно. Тем не менее, при отладке программ средство ввода/вывода весьма полезно. DBMS_OUTPUT может вызвать любой пользователь. С помощью процедур DBMS_OUTPUT реализованы две базовые операции: 1) PUT берет свои аргументы и помещает во внутренний буфер для хранения. Выполнение операции обеспечивается процедурами PUT, PUT_LINE и NEW_LINE. 2) GET считывает этот буфер и возвращает его содержимое процедуре в качестве аргумента. Выполнение операции – процедурами GET_LINE и GET_LINES. Размер буфера устанавливается с помощью процедуры ENABLE. Управляют буфером процедуры ENABLE и DISABLE. procedure GET_LINE (line out varchar2, status out integer); где LINE представляет собой последовательность символов, из которых состоит одна строка буфера, а STATUS указывает на то, успешно или нет, была считана эта строка. Максимальная длина строки – 255 байт. Если строка считана, то в переменной status находится 0, если в буфере больше нет строк для считывания, то в STATUS – 1. Аргументом процедуры GET_LINES является индексная таблица: type CHARARR is table of varchar2(255) index by binary integer; procedure GET_LINES (lines out chararr, numlines in out integer); В утилите SQL*Plus имеется средство, называемое SERVEROUTPUT (серверный вывод), команда SQL*Plus, называемая SET SERVEROUTPUT ON, неявно вызывает процедуру DBMS_OUTPUT.ENABLE, которая устанавливает внутренний буфер серверного вывода. SET SERVEROUTPUT ON SIZE размер_буфера – указ-ся размер буфера. 74. Пакет UTL_FILE. Ввод/вывод данных на экран осуществляется с помощью модуля DBMS_OUTPUT. Ввод/вывод текстовых файлов осуществляется посредством модуля UTL_FILE. С помощью UTL_FILE невозможно осуществлять вывод информации непосредственно в двоичные файлы. В ORACLE можно считывать файлы двоичного формата при помощи объектов BFILE, которые представляют собой особую форму внешних объектов LOB. Безопасность: В клиентском PL/SQL имеется модуль, подобный UTL_FILE, так называемый ТЕХТ_IO. Однако в отношении безопасности информации эти модули различны. Файлы, создаваемые с помощью клиентского модуля ТЕХТ_IO, можно размещать в любом месте на станции клиента при наличии необходимых привилегий для работы с операционной системой. При выполнении клиентских операций файлового ввода/вывода каких-либо привилегий для работы с PL/SQL и собственно базой данных не требуется. Все файлы, создаваемые в результате работы модуля UTL_FILE, будут принадлежать пользователю ORACLE. Кроме того, файлы будут создаваться с привилегиями, установленными операционной системой для пользователя ORACLE по умолчанию. Если с этими файлами должны работать другие пользователи, обращаясь к ним не из модуля UTL_FILE, системный администратор обязан изменить полномочия на эти файлы. 70 75. Пакет DBMS_PIPE. В дополнение к средствам чтения таблиц базы данных и записи в эти таблицы в PL/SQL предлагаются два встроенных модуля, предназначенных для взаимодействия между соединениями, или сеансами (sessions). Это модули DBMS_PIPE и DBMS_ALERT. Их можно использовать для обмена сообщениями между сеансами, соединенными с одним и тем же экземпляром базы данных. Посредством модуля DBMS_PIPE реализуются программные каналы баз данных (database pipe). Канал базы данных не зависит от операционной системы. Различные сеансы, соединенные с одним и тем же экземпляром ORACLE, могут посылать и получать сообщения по такому каналу. Канал могут использовать несколько сеансов, получающих сообщения, или получателей (readers), и несколько сеансов, посылающих сообщения, или отправителей (writers). Программные каналы асинхронны – они функционируют независимо от транзакций. После того как сообщение послано по каналу, вернуть его невозможно, даже если был выполнен откат той транзакции, которая выдала сообщение. В DBMS_PIPE и для посылки, и для получения сообщений применяется локальный буфер сообщений. Упаковка данных осущ. с пом. процедуры РАСК_MESSAGE, а посылка – SEND_MESSAGE. Ф-ции RECEIVE_MESSAGE, NEXT_ITEM_ТУРЕ, процедура UNPACK_MESSAGE испся для приема сообщений, посланных по каналу и для распаковки сообщений и превращения их в исх. элементы данных. Програмные каналы: Если канал не существует, то при первом указании его имени в SEND_MESSAGE он создается неявным образом. Каналы можно создавать и удалять явно (CREATE_PIPE и REMOVE_PIPE). Программный канал представляет собой структуру данных, находящуюся в разделяемом пуле системной глобальной области (SGA) памяти. Поэтому он не занимает память, в которую могут помещаться другие объекты базы данных при их считывании с диска. Когда необходимо освободить доп. пространство разделяемого пула, каналы автоматически уничтожаются (кроме тех, в которых нах-ся сообщения, ожидающие считывания). Канал можно удалить явно (PURGE). Общие и частные каналы: Каналы, создаваемые неявно с пом. SEND_MESSAGE - общие (public). Пользователь, имеющий полномочие EXECUTE на модуль DBMS_PIPE и знающий имя канала, может посылать и принимать по нему сообщения. Частные (private) - доступ ограничивается создателем канала, хранимыми процедурами, вып-ся на основании набора привилегий владельца этого канала, и пользователями SYSDBA или INTERNAL. Если канал успешно создан, CREATE_PIPE возвращает 0. Если канал уже существует, а тек. пользователь имеет привилегии для доступа к нему, то возвращ. 0, данные, нах-ся в канале, остаются без изменений. Если существует общий канал с указанным именем или частный канал, имеющий то же имя и принадлежащий другому пользователю, то устан-ся ошибка и ф-ция завершается неуспешно. 71 76. Архитектура ODBC и коды возврата. Прикладные API включают наборы функций, обеспечивающих программиста разнообразными типами доступа к базе данных: подключение, выполнение операторов, выборка отдельных строк данных из результирующего множества запросов. Недостаток отсутствие универсальности (программа должна быть обработана предкомпилятором и связана с API, поставляемым в составе конкретной целевой СУБД). Технология ODBC (Open Database Connectivity) предусматривает использование единого интерфейса для доступа к смеш. базам данных SQL, причем SQL рассматр-ся как баз. стандарт. ср-во доступа к данным. 1) Приложение - выполняет обработку данных и вызов функций библиотеки ODBC для отправки SQL – операторов в СУБД и выборки возвращаемой СУБД информации. 2) Менеджер драйверов (библ-ка DLL) - выполняет загрузку драйверов по требованию приложения. 3) Драйверы баз данных – обрабатывают вызовы функций ODBC и направляют SQL – запросы в конкретные источники данных, а также возвращают полученные результаты приложению. 4) Источники данных – содержат данные, доступ к которым необходим пользователю приложения. Данные сохраняются в базе данных, контролируемой целевой СУБД, операционной системой, а также сетевыми сервисами ОС. 5) Коды возврата - Все функции ODBC возвращают коды, чтобы показать в каком состоянии выполнения находится та или иная функция. Код возврата RETCODE указывает на то, был ли вызов функции ошибочным или нет, не указывает точной причины возникновения той или иной ошибки. SQL_SUCCESS SQL_SUCCESS_WITH_INFO SQL_NO_DATA_FOUND SQL_ERROR SQL_INVALID_HANDLE SQL_STILL_EXECUTING SQL_NEED_DATA Функция выполнена успешно, информация об ошибке отсутствует Функция выполнена успешно, но есть некот. предупрежд. информация Все строки результирующего множества извлечены. Ошибка в процессе выполнения данной функции. Какой-то идентификатор-параметр данной ф-ции явл. недействительным Возвращается функцией, находящейся в процессе выполнения Возвращается функциями исполнения SQL – оператора в случае определения параметров операторов во время выполнения. 72 77. Основной алгоритм программ ODBC. Инициализация и завершение, функции управления каталогом. Назначение идентификатора окружения Назначение идентификатора соединения Инициализация Соединение с сервером Назначение идентификатора оператора Обработка SQL оператора Выполнение оператора и выборка данных Освобождение идентификатора оператора Разрыв соединения с сервером Завершение Освобождение идентификатора соединения Освобождение идентификатора окружения В ODBC, так же как и в PL/SQL при обработке произвольного SQL-оператора, необходимо выполнять связывание параметров. Связывание выполняет драйвер ODBC. 1) Инициализация, установка окружения. ODBC использует окружение для отслеживания соединений с базой данных, установленного прикладной программой. Назначение окружения производится функцией ODBC SQLAllocEnv() и имеет следующий синтаксис: RETCODE SQLAllocEnv (phenv) RETCODE SQLFreeConnect(hdbc) Здесь параметр HDBC – входной параметр, представляющий освобождаемое соединение. Освобождение идентификатора соединения производится после разрыва соединения с источником данных ODBC на этапе завершения, когда необходимо освободить все ресурсы занятые прикладной программой. 2) Выполнение операторов: Функции управления каталогом возвращают информацию из системного каталога источника данных: имена таблиц, столбцов, табличную статистику и т. д. Функции обработки или передачи SQL – оператора требуют в качестве параметра идентификатор оператора. Идентификатор оператора ссылается на SQL – оператор. Назначение идентификатора оператора производится вызовом SQLAllocStmt(), которая выделяет область хранения в памяти для идентификатора оператора и связывает его с соединением, которое определяется собственным идентификатором. RETCODE SQLAllocStmt(hdbc, phstmt) Парная для SQLAllocStmt() функция SQLFreeStmt() выполняет следующие действия: • останавливает SQL – операторы, кот. в данный момент обраб-тся и связаны с задан. идент-ром опер-ра, • закрывает открытые курсоры, которые имеют отношение к определенному идентификатору оператора, • отбрасывает ожидаемые результаты, • дополнительно, освобождает все ресурсы, связанные с определенным идентификатором оператора. RETCODE SQLFreeStmt (hstmt, fOption) 73 77.1. Опция SQL_CLOSE отбрасывает неизвлечённые результаты и закрывает любые связанные с ними курсоры, не влияет на соотв. параметры, подготовленные операторы или соотв. столбцы результата. SQL_DROP освобождает все ресурсы, связанные с идентификатором, закрывает курсор, если он открыт и отбрасывает все ожидаемые строки результирующего множества, завершает все обращения к hstmt, т.к. после успешного вызова SQLFreeStmt с этим параметром, идентификатор становится недействительным. SQL_UNBIND освобождает (“отвязывает”) все буферы столбцов, связанные со столбцами результирующего множества запроса посредством SQLBindCol(). SQL_RESET_PARAMS освобождает все буферы параметров с фактическими значениями, связанные с маркерами параметров строки запроса. Связывание формальных параметров запроса (маркеров) с буферами фактических значений производится функцией SQLBindParametr(). Управление каталогом: Первая информация, которая может понадобиться прикладной программе для соединения с неизвестным источником данных – это информация о таблицах. ODBCфункция SQLTables возвращает список имен таблиц, которые содержит указанный источник данных. RETCODE SQLTables (hstmt, szTableQualifier, sbTableQualifier, szTableOwner, sbTableOwner, szTableName, sbTableName, szTableType, sbTableType). 74 78. Непосредственное и подготавливаемое выполнение. Выборка результатов. Непосредственное выполнение целесообразно использовать в следующих случаях: • SQL – операторы, которые должны быть выполнены, выполняются только один раз; • не требуется информация о результирующем множестве до выполнения оператора. Непосредственное выполнение реализуется с помощью функции SQLExecDirect() и представляет наиболее быстрый способ запуска SQL – оператора при одноразовом выполнении. RETCODE SQLExecDirect( hstmt, szSqlStr, sbSqlStr) Подготавливаемое выполнение: Данный способ выполнения оператора предпочтителен в случае, если оператор предполагается выполнять несколько раз и требуется предварительная информация о результирующем множестве. Для подготавливаемого выполнения необходимы две функции: SQLPrepare() подготавливает SQL – строку для выполнения. Синтаксис её ничем не отличается от синтаксиса SQLExecDirect(). SQLExecute(): RETCODE SQLExecute (hsmt), где HSMT – предварит. назначенный идент-тор опер-ра. SQLPrepare() отличается от SQLExecDirect() тем, что при вызове SQLPrepare() оператор на самом деле не выполняется. Вместо этого определяется путь доступа к данным, и информация о результирующем множестве становится доступной для использования. Так как план выполнения оператора после его подготовки известен, то его выполнение может выполняться несколько быстрее, чем при использовании SQLExecDirect(). Выборка результатов: Результат может быть либо результирующим множеством, либо числом строк, на которые воздействовал оператор. Результирующее множество представляет собой набор строк и столбцов, которые были определены SQL – оператором или функцией каталога. После создания, результирующее множество, тем не менее, располагается на сервере базы данных и требует извлечения прикладной программой клиента. Продвижение по строкам результирующего множества возможно посредством курсора. Курсор автоматически генерируется для каждого результирующего множества. Непосредственно после создания результирующего множества, курсор устанавливается перед первой строкой данных. Для продвижения курсора следует вызывать функцию SQLFetch(). Данная функция продвигает курсор вперед на одну строку до тех пор, пока он не будет установлен за последней строкой результирующего множества. RETCODE SQLNumResultCols (hstmt, pccol) – для определения числа столбцов. RETCODE SQLRowCount (hstmt, pcrow) – для возвращения числа строк. В ODBC существует две функции базового уровня для выборки результатов: SQLBindCol() и SQLFetch(). Функция SQLBindCol() определяет область хранения данных результирующего множества, а SQLFetch() осуществляет выборку данных в области хранения. Алгоритм программы предполагает выполнение следующих шагов: 1. Вызов SQLBindCol() один раз для каждого столбца, который должен быть возвращен из результирующего множества, назначает область хранения в памяти и тип данных для столбца результирующего множества и определяет: • Буфер хранения для получения содержимого столбца данных в результирующем множестве, • Длину указанного буфера хранения, • Область памяти для хранения длины столбца выборки, • Преобразование типа данных. RETCODE SQLBindCol (hstmt, icol, fcType, rgbValue, cbValueMax,pcbValue) 2. Вызов SQLFetch() для перемещения курсора на следующую строку и возврата данных из связанных столбцов, извлекает строку данных из результирующего множества для выполненного SQL – оператора: RETCODE SQLFetch (hstmt). Здесь HSTMT – идентификатор выполненного оператора. 3. Повторение шага 2 до тех пор пока SQLFetch() не возвратит SQL_NO_DATA_FOUND. Это указывает на то, что был достигнут конец результирующего множества. 75 1. История развития, основные характеристики и редакции СУБД Oracle 2. Общие сведения о SQL и его стандартах 3. Основные правила написания инструкций SQL 4. Понятие инструкции, основные части языка SQL Общие сведения о DML операторах 5. Общий синтаксис и возможности использования инструкции SELECT 6. Предложения SELECT, FROM и ORDER BY. Предикат DISTINCT и вычисляемые столбцы (примеры) 7. Предложение WHERE и классификация условий отбора (привести примеры) 8. Многотабличные запросы и их особенности (привести примеры), операторы комбинирования результатов запросов 9. Внутренние соединения (примеры) 10. Внешние соединения (примеры) 11. Предложения GROUP BY и HAVING. Статистические функции в SQL (примеры) 12. Причины использования подчиненных запросов, типы, виды условий, правила и ограничения 13. Условия отбора в подчиненном запросе и предикаты ANY, ALL, EXISTS, NOT EXISTS 14. Добавление данных (инструкции INSERT, MERGE) 15. Модификация и удаление данных (инструкции UPDATE, MERGE и DELETE) 16. Общие сведения о DDL операторах 17. Типы данных SQL (стандартные) 18. Создание таблиц (инструкция CREATE TABLE) 19. Изменение определения и удаление таблицы (инструкции ALTER, DROP TABLE) 20. Условия целостности данных 21. Создание и удаление псевдонимов, индексов (инструкции CREATE/DROP SYNONIM, CREATE/DROP INDEX) 22. Создание последовательностей (CREATE/DROP SEQUENCE) 23. Создание представлений (инструкция CREATE VIEW). Преимущества и недостатки использования, основные виды 24. Проблемы обновления и удаление представлений, фраза WITH CHECK OPTION 25. Понятие транзакции. Модель транзакции в стандарте ANSI/ISO (инструкции COMMIT и ROLLBACK) 26. Журнал транзакций. Проблемы обработки параллельных транзакций 27. Блокировки транзакций: уровни и виды, тупиковые ситуации 28. Понятие транзакции и виды блокировок Oracle 29. Многоверсионная модель согласованности Oracle 30. Операторы управления транзакциями в Oracle 31. Принципы защиты данных в стандарте SQL: аутентификация пользователей, защищаемые объекты, использование привилегий и другие возможности обеспечения безопасности 32. Стандартные инструкции GRANT и REVOKE, право предоставления привилегий 33. Аутентификация в Oracle. Создание и изменение пользователей 34. Профили в Oracle. Создание, изменение, удаление. 35. Привилегии в Oracle, классификация 36. Предоставление и отмена привилегий в Oracle (инструкции GRANT и REVOKE для системных и объектных привилегий). 37. Работа с привилегиями при помощи ролей в Oracle.. Системные роли, определение, изменение, удаление ролей. 76 38. Аудит. Типы и применение аудита. 39. Преимущества PL/SQL, основные возможности. Среда SQL*Plus. 40. Лексические единицы PL/SQL 41. Структура блока PL/SQL 42. Классификация блоков PL/SQL по виду секции заголовка (примеры) 43. Общие сведения о секции объявления. Синтаксис объявления переменных. Использование атрибутов %TYPE и %ROWTYPE 44. Функции преобразования типов данных. Область действия и область видимости переменных 45. Скалярные типы PL/SQL 46. Ссылочные и объектные типы PL/SQL 47. Составные типы PL/SQL: записи 48. Составные типы PL/SQL: коллекции 49. Функции и методы коллекций 50. Инициализация переменных, записей и коллекций 51. Виды и назначение курсоров 52. Явные курсоры 53. Неявные курсоры 54. Атрибуты явных и неявных курсоров 55. Курсорные типы, переменные и выражения (подзапросы) 56. Управляющие структуры PL/SQL. Область действия счетчика цикла, ограничения безусловных переходов 57. Директивы компилятора 58. Автономные транзакции 59. Секция исключительных ситуаций 60. Использование операторов SQL в PL/SQL. Понятие привязки 61. Динамический SQL: использование пакета DBMS_SQL 62. Общий алгоритм обработки SQL операторов в DBMS_SQL, основные функции пакета 63. Алгоритм обработки операторов DML в DBMS_SQL 64. Алгоритм обработки многострочного оператора SELECT в DBMS_SQL 65. Встроенный динамический SQL (NDS) и массовое связывание 66. Программные единицы PL/SQL. Общие атрибуты 67. Создание и использование процедур 68. Создание и использование (вызов) функций 69. Локальные программы, перегрузка программ, табличные функции 70. Триггеры: виды и создание, предикаты триггеров, последовательность событий 71. Структура и определение пакета 72. Вызов функций PL/SQL в SQL: правила и ограничения, примеры 73. Пакет DBMS_OUTPUT 74. Пакет UTL_FILE 75. Пакет DBMS_PIPE 76. Архитектура ODBC и коды возврата 77. Основной алгоритм программ ODBC. Инициализация и завершение, функции управления каталогом 78. Непосредственное и подготавливаемое выполнение. Выборка результатов 77