Введение Система Oracle является одним из наиболее популярных продуктов в области разработки программных решений. Oracle включает следующие основные продукты: База данных Сервер приложений (Application Server) Комплект продуктов для Интернет разработок (Internet Development Suite) Средства для работы с хранилищами данных и организацией бизнеса (Data Warehousing and Business Development) Набор приложений для электронного бизнеса (Oracle E-business Suite) Комплекс лабораторных работ в среде Oracle был разработан при активном участии иностранного аспиранта Ясера Рахала (Yasser Rahal). Лабораторная работа №1 Целью работы является знакомство с программным обеспечением Oracle Database 9i, создание экземпляра пользователя, создание новой базы данных, выполнение операций по администрированию базы данных. Кроме того, конфигурирование базы данных для указанного приложения, определение структуры хранения, а также настраивание средств безопасности. Архитектура сервера Серверный продукт представляет собой выполняемый модуль, который после запуска осуществляет важные функции. Доступ к базе данных Oracle9i обеспечивается с помощью выполняемого модуля Oracle, а также ряда вспомогательных программ и файлов.
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
ВведениеСистема Oracle является одним из наиболее популярных продуктов в области разработки программных решений. Oracle включает следующие основные продукты:
База данных Сервер приложений (Application Server) Комплект продуктов для Интернет разработок (Internet Development
Suite) Средства для работы с хранилищами данных и организацией бизнеса
(Data Warehousing and Business Development) Набор приложений для электронного бизнеса (Oracle E-business Suite) Комплекс лабораторных работ в среде Oracle был разработан при
активном участии иностранного аспиранта Ясера Рахала (Yasser Rahal).
Лабораторная работа №1
Целью работы является знакомство с программным обеспечением Oracle Database 9i, создание экземпляра пользователя, создание новой базы данных, выполнение операций по администрированию базы данных. Кроме того, конфигурирование базы данных для указанного приложения, определение структуры хранения, а также настраивание средств безопасности.
Архитектура сервера
Серверный продукт представляет собой выполняемый модуль, который после запуска осуществляет важные функции. Доступ к базе данных Oracle9i обеспечивается с помощью выполняемого модуля Oracle, а также ряда вспомогательных программ и файлов.
Файлы базы данных разделяются на три категории: файлы данных, управляющие файлы и файлы журналов повтора.
Процессы, обеспечивающие работу базы данных, порождаются при запуске экземпляра Oracle9i и облегчают доступ к файлам базы данных. Фоновые процессы обеспечивают функционирование экземпляра Oracle9i и принимают запросы об установлении соединений от пользователей. На рис.1 показаны эти фоновые процессы экземпляра.
Рис.1. Структура базы данных Oracle9i
Каждая работающая база данных Oracle9i связана с экземпляром (instance) Oracle. Когда на сервере баз данных стартует база данных, программное обеспечение Oracle выделяет память для системной глобальной области (System Global Area, SGA) и запускает несколько фоновых процессов (background processes) Oracle. Такое объединение SGA и процессов называется экземпляром Oracle. Фоновые процессы (background processes) выполняют разные функции и взаимодействуют с различными частями базы данных. Существуют следующие фоновые процессы:
Smon (system monitor – системный монитор) Pmon (process monitor – монитор процессов) Dbwr (database write – процесс записи в базу данных) Lgwr (log write – процесс записи в журнал) Ckpt (checkpoint – генератор контрольных точек)
После запуска экземпляра программное обеспечение связывает экземпляр с определенной базой данных. Это называется монтированием базы данных. Вслед за этим база данных готова для открытия, после которого она становится доступной для зарегистрированных пользователей.
База данных Oracle использует структуры памяти и процессы для управления и доступа к базе данных. Процессы представляют собой задания, работающие в памяти этих компьютеров.
Структура памяти, связанная с экземпляром, состоит из двух основных частей системной глобальной области (System Global Area – SGA) и программной глобальной области (Program Global Area – PGA).
Экземпляр oracle
База данных Oracle
Процесс пользовател
я
Процесс сервера
Глобальная системная облость (SGA)
Фоновые процессы Oracle.
Файлы данных
Контрольные Файлы
АрхивныеФайлы
SGA – это область разделяемой памяти, в которой содержатся данные и управляющая информация экземпляра.
PGA – это область памяти, выделяемая для каждого серверного процесса, содержащая данные и управляющую информацию этого процесса. Серверный процесс – это процесс, который обрабатывает запросы клиента.
Табличные пространства и файлы данных
Табличное пространство (tablespace) – это набор, состоящий из одного или нескольких файлов данных. В этих файлах размещается информация, относящаяся к базе данных. Каждая база данных Oracle содержит табличные пространства System и SYS (рис.2). Они автоматически создаются, когда создается база данных. Пространство System всегда находится в оперативном состоянии, когда открыта база данных. В нем хранятся таблицы, поддерживающие функциональные возможности ядра базы данных (например, таблицы словаря данных). SYS – вспомогательное по отношению к System табличное пространство. Оно хранит многие компоненты базы данных и должно быть в оперативном состоянии для корректного функционирования базы данных.
Рис.2. Табличные пространства System и Sys
Польз.1
Польз.2
Польз.n
Словаря данных
Oracle Администратор
1-System2-sys
Только чтение
Только чтение
tabdual
User_constraints
В базе данных существуют следующие структуры хранения:
- Логические: база данных, схема, табличное пространство, сегмент, экстент, блок Oracle,- Физические: файлы данных, файлы параметров, журналы и блок ОС.
Типовая схема базы данных “Персонал”(HR - Human Resources)
В Oracle9i содержится схема базы данных «Персонал» (- Human Resources - HR), которая может быть использована для проверки работоспособности системы. В этой схеме находятся таблицы, в которых хранится вся необходимая информация о сотрудниках, работающих в организации. Схема HR состоит из семи таблиц: Employees, Departments, Locations, Countries, Regions, Jobs, Job_history.
Ниже приведены данные по трем таблицам.
1- Employees (служащие)
2- Departments (отделы)
3- Locations (местоположение)
Запуск SQL*Plus
Для запуска SQL*Plus выполните:Пуск->Программы->Oracle->Application Development->SQL*Plus
Предложение SQL * plus представляет собой интерпретатор для SQL и PL / SQL c интерфейсом командой строки. Оно принимает от пользователя инструкцию для доступа к базе данных и направляет их серверу ORACLE, а результаты отображает на экране монитора. На рис.3 показано диалоговое окно для входа в систему.
Введите в поле имени пользователя hr, а в поле пароля также hr.
Рис.3. Диалоговое окно
После выполнения ОК при успешном вводе появится окно SQL*Plus (рис.4), через которое можно в дальнейшем взаимодействовать.
Рис.4. Окно SQL*Plus
Кроме того, для входа в систему можно использовать идентификатор System с установленным паролем, например manager. Если первоначально вошли в систему как пользователь hr и желаете установить System, то для этого необходимо произвести разъединение оператором Disconnect, а затем соединение оператором Connect.Disconnect;Connect System /managerДля обновления состояния пользователя используется следующая конструкция:Alter user hr Account unlock;Alter user hr identified by hr;
Disconnect;Connect hr/hr
Для сохранения всей последовательности работ в отдельном файле используется конструкция Spool – spool off. Sql>Spool lab1;...
Sql>Spool off;
Файл lab1 будет : oracle /bin
Завершение сеанса Oracle выполняется с помощью команды exit.1- Каждое предложение занимает 1 строку. 2- Каждое предложение заканчивается символом ‘;’ .
В табл.1 приведены основные операторы языка SQL.
Таблица 1. Операторы SQLSelect Data retrievalInsert
Data manipulation language (DML)UpdateDeleteCreate
Data definition language (DDL)AlterDropRenameCommit
Transaction controlRollbackSavepointGrant
Data control language (DCL)Revoke
Основные типы данных, поддерживаемые Oracle.Тип данных ОписаниеChar(n) Символьная строка фиксированной длиныVarchar2(n) Символьная строка переменной длиныNumber(l,d) Числовые данныеBlob Большой двоичный объектRaw(n) Двоичные данные переменной длиныDate Календарная датаlong Строки переменной длины с размером до 2 Гбайт
Для проверки работоспособности системы выполните вывод информации из таблиц «Персонал».
Sql>Select * From Employees;Sql>Select * From Departments;
Полезные предложения sql>select user from dual; -- просмотр существующих пользователей.sql>select current_date from dual; -- просмотр даты.sql>select * from all_users; -- просмотр всех пользователей.sql>select * from tab; - просмотр всех объектов существующего пользователя.С помощью команды describe можно проанализировать структуру таблицы.sql>describe employees;
Создание нового пользователяТолько администратор или пользователь, обладающий привилегий DBA или “create user” может создавать новых пользователей.
Для создания пользователя в Oracle служит команда create user.
CREATE USER имя_пользователя IDENTIFIED BY пароль_ пользователя;
Для изменения пароля учетной записи пользователя служит команда alter user.
Пример 1. Создание пользователя user1 с паролем miki1 и изменение на пароль miki2.
CREATE USER user1 IDENTIFIED BY miki1;
ALTER USER user1IDENTIFIED BY miki2;
Вновь созданный пользователь не может входить в базу данных и не имеет права создавать там объекты. Для того чтобы предоставить ему такие полномочия, необходимо применить команду grant connect, resource.
SQL>grant connect resource to имя_пользователя;
GRANT privilege [, privilege...] - - разрешение привилегии пользователю.TO user [, user| role, PUBLIC...];
Grant connect, resource to user1;
Пример 2.Connect user1/mikiCreate user peter identified by peter;привилегий недостаточно
Connect system/systemGrant create user to user1;Connect user1/mikiCreate user peter identified by peter;Пользователь создан.
Для отмены привилегий пользователя существует предложение revoke
Пример 3.
Revoke create user from user1;
Привилегии изъяты.
Создание объектов базы данных
База данных формируется с помощью следующих объектов:1- Table - таблица, 2- View – представление, 3- Sequence - Последовательность, 4- Index – индекс, 5- Synonym - Синоним.
Создание объектов базы данных осуществляется с помощью предложения оператора Create.Create объект название_объекта ……. .
Создание таблицы
Осуществляется с помощью предложения CREATE TABLECREATE TABLE [schema.]table
1- Создать нового пользователя и задать ему привилегии.2- Спроектировать базу данных (получить вариант задания)3- Создать таблицы. 4- Ввести данные(до 10 строк)4- Добавить ограничения.
Варианты заданий
1- Спроектировать базу данных для получения сведений о студентах. Возможные атрибуты :Номер_факультета, название, ФИО_декана, телефон, номер_группы, специальность, количество_студентов_ в_группе, ФИО_старосты, ФИО_студента, стипендия, номер_зачетной_книжки. 2- Спроектировать базу данных о сотрудниках. Возможные атрибуты :ФИО, год_раждения, должность, отдел, домашний_адрес, вуз¸ адрес_вуза, год_окончания, сведения_о_детях.
3 - Спроектировать базу данных о поставщиках и деталях. Возможные атрибуты :Наименование_поставщива, адрес, номер_счета_в_госбанке, номер_госта, Наименование_детали, единица_измерения¸цена.
4 - Спроектировать базу данных о книжных магазинах. Возможные атрибуты:
5 - Спроектировать базу данных о торговли магазинах. Возможные атрибуты: Адрес_магазина, название_магазина,тип_товара, номер_товар, единица_измерения¸цена , количество_на_складе,номер_продажа_ операция, дата_продажа_операция, название_товара .
Вопросы1. Основные продукты Oracle2. Архитектура сервера3. Экземпляр Oracle4. Фоновые процессы5. Основные части структуры памяти6. SGA7. PGA8. Табличное пространство9. Назначение System и Sys10.Логические и физические структуры хранения11.Создание учетной записи пользователя12.Изменение пароля13.Задание полномочий14.Отмена привилегий15.Создание таблиц16.Обновление таблиц17.Добавление ограничений18.Удаление ограничений19.Добавление данные
Лабораторная работа №2
Язык SQLОператоры манипулирования данными
Целью работы является изучение особенностей применения основных операторов манипулирования данными языка SQL в среде СУБД Oracle. Выполнение однострочных и многострочных запросов,
выборки данных из нескольких таблиц, организации подзапросов, применение различных функций, применение транзакций и др.
Манипулирования даннымиДобавить новые строки в таблице.Изменить существующие строки в таблице.Удалить существующие строки из таблицы.
После завершения изменения данных в таблице и чтобы сохранить изменения нужно написать команду “Commit”. Если нужно отменить изменения, то нужно написать команду “Rollback”.
Добавление данных
INSERT INTO table [(column [, column...])]VALUES (value [, value...]);
Если тип данных date то нужно написать: ‘dd-mm-yyyy’ ex : ‘1-1-2008’ или to_date(‘1-1-2008’,’dd-mm-yyyy’)
FROM employees, departmentsWHERE employees.department_id = departments.department_id;
Если предложение состояло бы без условия (WHERE), то в результате было бы получено декартово произведение.
Внешние соединения Внешнее соединение используется для выборки строк, не удовлетворяющих обычным условиям соединения. Оператором внешнего соединения является знак плюс, заключенный в скобки “(+)”. Этот оператор указывается с той стороны, где нет значения, по которому можно было бы произвести соединение.
Синтаксис:
SELECT таблица.столбец, таблица.столбец FROM таблица1, таблица2; WHERE таблица1.столбец1 = таблица2.столбец2(+)
Пример. Вывод имен сотрудников и департаментов.
SELECT e.last_name, e.department_id,d.department_nameFROM employees e, departments dWHERE e.department_id(+) = d.department_id;
Соединение таблицы с собой Рекурсивное соединение возникает в том случае, когда строки таблицы соединяются со строками этой же самой таблицы. При этом в предложении FROM наличие двух таблиц имитируется путем использования двух различных псевдонимов одной и той же таблицы.
Пример. Вывод имен сотрудников и их менеджеров.
SELECT worker.last_name || ' works for ' || manager.last_nameFROM employees worker, employees managerWHERE worker.manager_id = manager.employee_id;
Функции группирования “Group Functions”
(avg, count, sum, max, min, stddev, variance).
SELECT [column,] group_function(column), ...FROM table[WHERE condition][GROUP BY column][ORDER BY column];
SELECT AVG(salary), MAX(salary), MIN(salary), SUM(salary)FROM employeesWHERE job_id LIKE '%REP%';
Создание групп данных:
SELECT column, group_function(column)FROM table[WHERE condition][GROUP BY group_by_expression][ORDER BY column];
SELECT AVG(salary)FROM employeesGROUP BY department_id;
Использование предиката HAVING
Предикат having служит для ограничения выборки строк при использовании команды группирования.
Чтобы получить максимальную зарплату по каждому департаменту, при этом показывать только те департаменты, которые имеют максимальное значение зарплаты больше чем на $ 10000, нужно выполнить следующее: 1. Найти максимальный оклад по каждому департаменту по группам с разбивкой по номерам. 2. Ограничить группы для тех департаментов, максимальная заработная плата которых составляет более $ 10000.
SELECT department_id, MAX(salary)FROM employeesGROUP BY department_idHAVING MAX(salary)>10000;
Подзапросы
Подзапрос - это команда SELECT, вложенная в другую команду SQL. позволяющая создавать сложные команды при работе с данными. Это может быть удобно для выборки строк таблицы по условию, зависящему от данных в самой таблице.
Подзапросы можно использовать в разных предложениях команд SQL: • предложение WHERE; • предложение HAVING; • предложение FROM команды SELECT или DELETE.
ПримерНеобходимо определить какие работники имеют зарплату больше, чем зарплата работника Abel. Нужно в начале определить сколько денег получает Abel .
SELECT last_nameFROM employeesWHERE salary > (SELECT salary FROM employees WHERE last_name = 'Abel');
Однострочные и многострочные подзапросы
По количеству возвращаемых строк, удовлетворяющих условию запроса, подзапросы разделяют на однострочные и многострочные. В однострочных подзапросах в качестве операторов сравнения могут быть использованы операторы:“>”, “=”, “>=”, “<”, “<>”, “<=”. Для многострочных запросов правильным будет использование операторыIN, (NOT IN), All, ANY.
Правила оформления подзапроса следующие: • подзапрос должен быть заключен в круглые скобки; • подзапрос должен находиться справа от оператора сравнения в логическом выражении; • в подзапросе нельзя использовать предложение ORDER BY.
Примеры однострочных подзапросов 1. Выборка фамилий и зарплаты сотрудников, работающих в том же отделе, где работает сотрудник по фамилии 'Kochhar‘.
select last_name , salary from employeeswhere department_id = (select department_id from employees where last_name ='Kochhar')
2. Вывод фамилий, имени и зарплаты всех служащих с зарплатой ниже средней.
select last_name , first_name , salary from employees where salary > (select avg(salary) from employees);
Многострочные подзапросыМногострочные запросы, возвращающие более одной строки. В них следует использовать многострочный операторы IN, (NOT IN), All, ANY.
Примеры 1. Вывод списка служащих, приписанных к отделу Финансы “Finance” или отделу Маркетинг “Marketing” .
select last_name , first_name from employeeswhere DEPARTMENT_ID in (select DEPARTMENT_ID from departmentswhere DEPARTMENT_NAME = 'Finance' or department_name = 'Marketing');
2. Вывод списка служащих, чья зарплата меньше, чем зарплата всех работников предприятия. Идентификатор IT_PROG и чья работа заключается не IT_PROG.
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < ALL (SELECT salary FROM employees WHERE job_id = 'IT_PROG') AND job_id <> 'IT_PROG';
Предложение Having с подзапросамиПодзапросы можно использовать не только в предложении WHERE, но и в предложении HAVING. При этом подзапросы выполняются первыми и результаты возвращаются в предложение HAVING главного запроса.Пример Вывод всех отделов, где средняя зарплата выше, чем в отделе 40. select department_id , avg(salary) from employeesgroup by department_idhaving avg(salary) > (select avg(salary) from employees where department_id =40)
Операторы управления транзакциями
COMMIT завершать транзакцию (успешно сохранять изменение)ROLLBACK завершать транзакцию (не сохранять изменение)SAVEPOINT позволяет вам создать “маркерную точку” внутри транзакции (В одной транзакции можно иметь множество таких точек.).
В Oracle нет необходимости в операторе “начала транзакции”.
Вы всегда должны явно завершать транзакцию с помощью COMMIT или
ROLLBACK,
База данных транзакций может включать следующие предложения: DML предложения, которые представляют собой команды изменения данных; одно предложение DDL;одно предложение DCL;
Порядок выполнения транзакций представлен на рис.1.1- Начало транзакции. Может начинаться с любого оператора DML. 2- Конец представляется одним из следующих событий:
a. Командами COMMIT или ROLLBACK b. DDL или DCL предложения исполняет (автоматическая commit)
c. Пользовательский выход iSQL * Plus d. Система сбоев с одним из следующих событий
Рис 1. управления транзакциями
Определение маркерной точки выполняется следующим образом:
savepoint a;
Отмена до маркерной точки выполняется следующим образом:
maxsal, AVG(e.salary) avgsalFROM employees e, departments dWHERE e.department_id = d.department_id GROUP BY d.department_name;
Пример3 (WITH CHECK OPTION )
CREATE OR REPLACE VIEW empvu20AS SELECT * FROM employees WHERE department_id = 20 WITH CHECK OPTION CONSTRAINT empvu20_ck;
UPDATE empvu20 SET department_id = 10 WHERE employee_id = 201; UPDATE empvu20 * ERROR at line 1: ORA-01402: view WITH CHECK OPTION where-clause violation
Пример4 (WITH READ ONLY )
CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title)
AS SELECT employee_id, last_name, job_id FROM employees WHERE department_id = 10 WITH READ ONLY;
Последовательность
Создание последовательности - SEQUENCE
CREATE SEQUENCE sequence_имя [INCREMENT BY n] -- увеличение [START WITH n] -- начать с [{MAXVALUE n | NOMAXVALUE}] -- максимальное значение или нет [{MINVALUE n | NOMINVALUE}] -- минимальное значение или нет [{CYCLE | NOCYCLE}] -- совершать цикл развития или нет [{CACHE n | NOCACHE}]; -- определить, сколько кэш или нет кэш.
CREATE SEQUENCE dept_deptid_seq INCREMENT BY 10 START WITH 120 MAXVALUE 9999 NOCACHE NOCYCLE;
Использование последовательности с помощью:Имя_ Последовательность.CURRVAL и Имя_ Последовательность. NEXTVALМожно узнать и использовать только текущее значение.
INSERT INTO departments(department_id, department_name, location_id)VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);
SELECT dept_deptid_seq.CURRVALFROM dual;
Последовательность не может быть обновлена, но может быть удалена.
Удаление последовательности
DROP SEQUENCE dept_deptid_seq;
Индекс
Создание индекса
CREATE INDEX индекс_имяON table (column[, column]...);
CREATE INDEX emp_last_name_idxON employees(last_name);
Когда необходимо создавать индекс:• колонка содержит широкий спектр значений;• колонка содержит большое количество нулевых значений;• один или несколько столбцов, часто используются вместе в “where”
оговорка или присоединиться условие.• Таблица имеет большую размерность, но ожидаемая выборка на
запросы, будет составлять не более, чем 2 - 4% от множества строк.
Можно найти информации об индексах в представлении словаря данныхUSER_INDEXES или USER_IND_COLUMNS.
Удаление индекс
DROP INDEX индекс_имя;
Упражнения
1. Войдите в Oracle как пользователь hr/hr.2. Выполните следующие задания:3. Выведите на дисплей фамилию, зарплату, и комиссионные для всех
работников, которые зарабатывают комиссионные. Отсортировать данные в порядке зарплаты и комиссионных.
4. Для каждого работника, вывести идентификационный номер, фамилию, зарплату, заработную плату и зарплату с учетом надбавки на 15%.
5. Написать запрос для отображения работника с указанием фамилии, департамента наименование, местонахождение ID, и город для всех работников, которые зарабатывают комиссионные.
6. Написать запрос для отображения фамилии и даты (начала работы) для всех сотрудников, работающих в том же департаменте, где работает сотрудник Zlotkey. Исключить Zlotkey.
7. Написать запрос, который отображает номера и фамилии всех работников. При этом они работают в департаменте с любым сотрудником, чья фамилия содержит букву u.
8. Написать запрос для отображения видов работ и количество людей связанных с этой работой.
9. Написать запрос для отображения номера департамента, количества работников, средней зарплаты для всех работников этого департамента.
10. Войдите в Oracle как пользователь со своим идентификатором
11.Проделайте следующие задания на основе своей таблицы, созданной в лаб.работе № 1:
1. Создание представлений из одной таблицей.2. Создание представлений из двух таблиц.3. Создание индекса.4. Создание последовательности: начать со значения 1200, увеличение
100, максимальное значение 10000.
Лабораторная работа 3
Процедурный язык PL/SQL
Процедурный Язык / SQL (PL / SQL) – это расширение SQL в процедурный язык, это стандарт доступа к данным для реляционных баз данных. PL / SQL предлагает современные технологии программирования функций, таких как инкапсуляция данных, обработка исключений, скрытия информации, объектная ориентация.
1- Блок PL / SQL
Каждая единица PL / SQL состоит из одного или нескольких блоков. Эти блоки могут быть совершенно отдельными или вложенными одна в другую. Эти блоки могут быть (процедуры, функции или анонимные блоки). Программы PL/SQL являются логическими блоками, которые могут содержать любое количество вложенных подблоков. Таким образом, один блок может составлять незначительную часть от другого блока, который в свою очередь, может быть частью всего блока кода.
DECLARE -- Факультативный, если нужно определить “variables” Variables, cursors, user-defined exceptionsBEGIN -- Обязательный- SQL предложения- PL/SQL предложения
EXCEPTION – Факультативный
-- Исключения (Действия выполнять, когда ошибки)
END; – Обязательный/ -- Знак для завершения и компиляции PL/SQL блока
В блоке DECLARE описываются переменные В pl/sql существует блоки трех типов :
а. Безымянный блок.б. Процедурный блок.в. Функция.
а. Безымянный блок
[DECLARE]-- ОбъявленияBEGIN-- Предложения или операторы
Можно для “variables” определить тип данных или с помощью уже определенного “variables” с использованием слова %TYPE, как в следующих примерах:
v_name employees.last_name%TYPE; -- The database table and columnv_balance NUMBER(7,2);v_min_balance v_balance%TYPE := 10; -- The previously declared variable name
Использование связывания переменных “Using Bind Variables”.Чтобы вывести значение переменной из блока (PL/SQL) используется двоеточие (:) перед переменой, которой надо присвоить ее значение.Например, перемен g_salary принимает значение внутри блока (PL/SQL).Для чтения этой переменной с (SQL) используется оператор (:).
VARIABLE g_salary NUMBERBEGIN SELECT salary INTO :g_salary FROM employees WHERE employee_id = 178; END;/PRINT g_salary
Использование Пакет DBMS_OUTPUT.PUT_LINE
Пакет DBMS_OUTPUT.PUT_LINE - это Oracle пакет для отображения данных из PL / SQL блока. Для включения пакета необходимо произвести установку с помощью SET SERVEROUTPUT ON.
CASE selector WHEN expression1 THEN result1 WHEN expression2 THEN result2 ... WHEN expressionN THEN resultN [ELSE resultN+1;]END;
Пример. Необходимо оценить учебу студентов (Отлично, Очень хорошо, Хорошо)На основе значения переменной p_grade:
SET SERVEROUTPUT ONDEFINE p_grade = aDECLARE v_grade CHAR(1) := UPPER('&p_grade'); v_appraisal VARCHAR2(20);BEGIN v_appraisal := CASE v_grade WHEN 'A' THEN 'Excellent' WHEN 'B' THEN 'Very Good' WHEN 'C' THEN 'Good' ELSE 'No such grade' END;DBMS_OUTPUT.PUT_LINE ('Grade: '|| v_grade || ' Appraisal ' || v_appraisal); END;/
DECLARE v_country_id locations.country_id%TYPE := 'CA'; v_location_id locations.location_id%TYPE; v_counter NUMBER(2) := 1; v_city locations.city%TYPE := 'Montreal';BEGIN SELECT MAX(location_id) INTO v_location_id FROM locations WHERE country_id = v_country_id; LOOP INSERT INTO locations(location_id, city, country_id) VALUES((v_location_id + v_counter),v_city, v_country_id ); v_counter := v_counter + 1; EXIT WHEN v_counter > 3; END LOOP;END;/
3-3-2. WHILE Loops
WHILE condition LOOP Операторы; . . .END LOOP;
Пример
DECLARE v_country_id locations.country_id%TYPE := 'CA'; v_location_id locations.location_id%TYPE; v_city locations.city%TYPE := 'Montreal'; v_counter NUMBER := 1;BEGIN SELECT MAX(location_id) INTO v_location_id FROM locations
WHERE country_id = v_country_id; WHILE v_counter <= 3 LOOP INSERT INTO locations(location_id, city, country_id) VALUES((v_location_id + v_counter), v_city, v_country_id ); v_counter := v_counter + 1; END LOOP;END;/
3-3-3. FOR Loops
FOR counter IN [REVERSE] lower_bound..upper_bound LOOP Операторы ; . . .END LOOP;
Пример
DECLARE v_country_id locations.country_id%TYPE := 'CA'; v_location_id locations.location_id%TYPE; v_city locations.city%TYPE := 'Montreal';BEGIN SELECT MAX(location_id) INTO v_location_id FROM locations WHERE country_id = v_country_id; FOR i IN 1..3 LOOP INSERT INTO locations(location_id, city, country_id) VALUES((v_location_id + i), v_city, v_country_id ); END LOOP;END;/
3-4. SQL Курсор Cursor
- Ключевым понятием языка PL/SQL является курсор.- Для выполнения предложений SQL и хранения их результатов ORACLE использует рабочие области, называемые ЛИЧНЫМИ ОБЛАСТЯМИ SQL.- Конструкт PL/SQL, называемый КУРСОРОМ, позволяет вам обращаться к личной области SQL по имени и извлекать из нее информацию.Есть два вида курсоров:
1- Явные,
2- Неявные (курсор SQL).
Неявным курсором, объявленным для всех DML – выражения.Явным курсором, объявленным и поименованным программистом. С использованием любого правильного выражения выборки «select»
Атрибуты курсора SQL
1- SQL%ROWCOUNT Число строк, затронутых последним предложения SQL (целое число)
2- SQL%FOUND Булевых атрибутов, которые оцениваются в TRUE, если последним SQL предложением затрагивается один или несколько строк.
3- SQL%NOTFOUND Булевых атрибутов, которые оцениваются в TRUE, если последним SQL заявлением, не затрагиваются какие-либо строки.
4- SQL%ISOPEN Всегда оценивается в FALSE потому, что PL / SQL закрывает неявной курсоры немедленно после того, как они исполняются
Пример :Declare Cursor c1 is select employee_id, last_name from employees;
190 Иванов------ Курсор 191 Петров Текущая строка
200 Рослонова…..203 Госпоров
Пример. Неявный курсор Следующий блок pl/sql использует SQL%ROWCOUNT. Атрибуты для подсчета - сколько строк из таблицы было удаленно
VARIABLE строк_удаленно VARCHAR2(30)DECLARE v_employee_id employees.employee_id%TYPE := 176;BEGIN DELETE FROM employees WHERE employee_id = v_employee_id;
Declare -- Создает именованную SQL область. Open – Определяет активное множество.Fetch – передает текущий ряд в переменную. Empty – проверка на существование ряда, возврат в Fetch если ряды существуют.Close – Реализовать активное множество.
3-FETCH имя_курсора INTO [variable1, variable2, ...];
4-EXIT WHEN имя_курсора %ROWCOUNT NOTFOUND;
5-CLOSE имя_курсора;
Атрибуты Явный курсора
(%ISOPEN - %NOTFOUND -%FOUND - %ROWCOUNT)
Пример: Выведите на дисплей идентификационный номер и фамилию всех работников предприятия.
SET SERVEROUTPUT ONDECLARE v_empno employees.employee_id%TYPE; v_ename employees.last_name%TYPE; CURSOR emp_cursor IS SELECT employee_id, last_name FROM employees; BEGIN
OPEN emp_cursor; LOOP FETCH emp_cursor INTO v_empno, v_ename; EXIT WHEN emp_cursor%ROWCOUNT > 10 OR emp_cursor%NOTFOUND; DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_empno) ||' '|| v_ename); END LOOP; CLOSE emp_cursor;END ;
Процедурный блок
CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter1 [mode1] datatype1, -- mode может быть in/out/in out parameter2 [mode2] datatype2, . . .)]IS|ASPL/SQL Block;END;
Пример1. Написать процедур, что бы обновить зарплату с учетом надбавки на 10%. Для определенного сотрудника.
CREATE OR REPLACE PROCEDURE raise_salary (p_id IN employees.employee_id%TYPE)ISBEGIN UPDATE employees SET salary = salary * 1.10 WHERE employee_id = p_id;END;/
Пример2Написать процедуру, что бы читать информацию о сотруднике
CREATE OR REPLACE PROCEDURE query_emp (p_id IN employees.employee_id%TYPE, p_name OUT employees.last_name%TYPE, p_salary OUT employees.salary%TYPE, p_comm OUT employees.commission_pct%TYPE)
ISBEGIN SELECT last_name, salary, commission_pct INTO p_name, p_salary, p_comm FROM employees WHERE employee_id = p_id;END;/
Выполнить процедур с SQLдля выполнения процедуры с sql используются выражений EXECUTE.
VARIABLE g_name VARCHAR2(25)VARIABLE g_sal NUMBERVARIABLE g_comm NUMBER
ФункцияНаписать функцию, что бы вывести на дисплей зарплату определенного сотрудника.
CREATE OR REPLACE FUNCTION get_sal (p_id IN employees.employee_id%TYPE) RETURN NUMBER IS v_salary employees.salary%TYPE :=0; BEGIN SELECT salary INTO v_salary FROM employees WHERE employee_id = p_id; RETURN v_salary;END get_sal;/
Выполнить функцию
VARIABLE g_salary NUMBER
EXECUTE :g_salary := get_sal(117)
PRINT g_salary
Вызов функции в SQL выраженииМожно использовать функции в выражении SQL
Пример. Написать функцию, что бы определить налог для каждого сотрудника в зависимости от заработной платы. И выполнить ее внутри выражения «select». CREATE OR REPLACE FUNCTION tax (p_value IN NUMBER) RETURN NUMBER ISBEGIN RETURN (p_value * 0.08);END tax;/SELECT employee_id, last_name, salary, tax(salary)FROM employeesWHERE department_id = 100;
Удалить процедуру, функцию
DROP PROCEDURE raise_salary;
DROP FUNCTION get_sal;
Можно найти информацию о процедурах или функциях в представлении словаря данных user_objects.
SELECT object_name, object_typeFROM user_objectsWHERE object_type in ('PROCEDURE', 'FUNCTION')ORDER BY object_name;
Можно найти текст процедуры, или функции в представлении словаря данных user_source в следующием виде:
SELECT textFROM user_sourceWHERE name = 'QUERY_EMPLOYEE'ORDER BY line;
Триггеры базы данныхТриггер базы данных – это процедура PL/SQL, которая автоматически запускается при возникновении определенных событий, связанных с выполнением операций вставки, удаления или модификации данных таблицы.
Предложения триггера содержатся: Триггеры события --Триггер может запускается при выполнении одной из трех операций изменения содержимого таблицы:INSERT, UPDATE, или DELETE
Trigger timing -- триггеры времяКод триггер может выполняться либо до, либо после тех операторов, которые инициировали запуск триггера.- Для таблицы: BEFORE (До), AFTER(после)- Для представления: INSTEAD OF (ВМЕСТО)
Имя таблицы: On table, viewТриггер типа: Row or statement (строк или предложения)WHEN clause: Restricting conditionTrigger body (триггеры текст): PL/SQL блока
Создание базы данных триггеров
CREATE [OR REPLACE] TRIGGER trigger_name время события1 [OR события2 OR события3 ] ON table_nametrigger_body
Пример. Написать триггер, чтобы запретить добавление информации в не рабочие дни и часы.
CREATE OR REPLACE TRIGGER триггер_имя BEFORE INSERT ON employees BEGIN IF (TO_CHAR(SYSDATE,'DY') IN ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI')
NOT BETWEEN '08:00' AND '18:00') THEN RAISE_APPLICATION_ERROR (-20500,'You may insert into EMPLOYEES table only during business hours.'); END IF;END;/
Пример. Написать триггер, чтобы аудит SQL выражений были выполнены на таблице «employees» и сохранить результаты в новой таблице.
CREATE OR REPLACE TRIGGER audit_emp_values AFTER DELETE OR INSERT OR UPDATE ON employees FOR EACH ROWBEGIN INSERT INTO audit_emp_table (user_name, timestamp, id, old_last_name, new_last_name, old_title, new_title, old_salary, new_salary) VALUES (USER, SYSDATE, :OLD.employee_id, :OLD.last_name, :NEW.last_name, :OLD.job_id, :NEW.job_id, :OLD.salary, :NEW.salary );END;/Мы используем перемен (:new) когда нужно обратиться к новой информации,И (:old) когда нужно обратиться к старой информации, USER : имя существующего пользователя, SYSDATE : системная дата.
Упражнения
А. Войдите в Oracle как пользователь hr/hr.1- Создать новую таблицу EMP1 похоже на таб. EMPLOYEES.
2- Написать процедуру, чтобы вывести на дисплей зарплату и название работы определенного сотрудника, зная его идентификационного номера (например, 110).
3- Написать процедуру, для отображения номера департамента, количества работников, средней зарплаты для всех работников этого департамента, хранить результаты в новой таблице. Надо использовать явные курсоры.
4- Создать блок PL/SQL для обновления столбца SALARY в таб. EMP1, как следующий: Добавление 150$ если COMMISSION_PCT > 0 & SALARY < 6000. Добавление 250$ если COMMISSION_PCT > 0 & SALARY > 6000. Добавление 650$ если сотрудник не получает COMMISSION_PCT.
5- Используйте явные курсоры в блоке PL/SQL, чтобы обновить все значения SALARY с учетом надбавки на 10%. Для всех работников.
Б. Войдите в Oracle как пользователь со своим идентификатором
1- Написать триггер, чтобы запретить обновления информации в не рабочие дни и часы.
END ;/A-2-б CREATE OR REPLACE PROCEDURE query_emp (p_id IN employees.employee_id%TYPE, p_salary OUT employees.salary%TYPE, p_job_id OUT employees.job_id%TYPE) IS BEGIN SELECT salary, job_id INTO p_salary, p_job_id FROM employees WHERE employee_id = p_id; END;/VARIABLE g_sal NUMBERVARIABLE g_job varchar2(10)EXECUTE query_emp(171, :g_sal, :g_job);print g_salprint g_job
create or replace procedure find_info is v_department_id employees.department_id%type; v_count_emp NUMBER; v_avg_salary NUMBER; cursor info is select department_id , count(*) , avg(salary) from employees group by department_id; begin open info; fetch info into v_department_id, v_count_emp, v_avg_salary; while info%found loop
insert into dept_info values(v_department_id,v_count_emp,
v_avg_salary); fetch info into v_department_id, v_count_emp, v_avg_salary; exit when info%notfound; end loop; close info; commit; end; /execute find_info;
==============================A-4-create or replace procedure update_salary is v_employee_id emp1.employee_id%type; v_salary emp1.salary%type;
v_commission emp1.commission_pct%type;cursor update_sal is select employee_id , salary,nvl(commission_pct,0)
from emp1; begin open update_sal; fetch update_sal into v_employee_id, v_salary, v_commission; while update_sal %found loop
if v_commission >0 and v_salary < 6000 thenupdate emp1set salary = salary + 150where employee_id = v_employee_id;
end if;fetch update_sal into v_employee_id, v_salary, v_commission;exit when update_sal %notfound;
end loop; close update_sal; commit; end;/execute update_salary;
==============================A-5-create or replace procedure update_all_salary is v_employee_id emp1.employee_id%type;
cursor update_all_sal is select employee_id from emp1; begin open update_all_sal; fetch update_all_sal into v_employee_id; while update_all_sal %found loop
fetch update_all_sal into v_employee_id;exit when update_all_sal %notfound;
end loop; close update_all_sal; commit; end;/execute update_all_salary;++++++++B-1CREATE OR REPLACE TRIGGER t1 BEFORE INSERT or UPDATE ON emp1 BEGIN IF (TO_CHAR(SYSDATE,'DY') in ('SAT','SUN')) OR (TO_CHAR(SYSDATE,'HH24:MI') not between '08:00' AND '18:00')THEN RAISE_APPLICATION_ERROR (-20500,'обновление информации только в рабочие дни и часы .'); END IF; END;
Лабораторная работа №4
1. Соединение Oracle c Access
Соединение Oracle c Access выполняется с помощью программы Источники данных (ODBC). С этой целью необходимо создать в Access «Форму» для чтения данных из таблиц (в Oracle). C помощью «Формы» можно также произвести добавление, удаление, и обновление.
Для построения соединения Oracle c Access с помощью ODBC необходимо выполнить:
a)- открыть программу ODBC (для этого нажать Пуск-Панель
управления-Администратор-Источники данных (ODBC)).- нажать кнопку добавить,- выбрать oracle из возможных вариантов,- определить нужные информации (имя источника данных, имя
пользователя).b)- открыть программу MS Access,- создавать новую базу данных,- использовать команду( файл \ внешние данные \ импорт или связь с
таблицами),- выбрать имя связи с oracle,- написать имя и пароль пользователя и продолжать рабату.
2. Создание новой базы данных
либо с использованием sql+ , либо с помощью программа «database configuration assistant».
3. Соединение 2 баз данных
Пусть у нас имеются 2 БД
Имя 1 бд. Orc1 есть пользователь user1 и пароль u1Имя 2 бд. Orc2 есть пользователь user2 и пароль u2
Что бы создать соединения между бд1 и бд2 (пользователь бд1 может использовать бд2) нужно:
1- С помощью файла (TNSNAME) проверить, что вы можете использовать две БД. Если нет, надо обновить файла (TNSNAME).
2- Connect user1/password@orc1 /* user1 должен обладать привилегией администратор.*/3- Create database link DB_Link_name.us.oracle.com
connect to user2 identified by u2using ‘orc2’;
4- Select count(*) from table_name@DB_Link ; -- для проверки.
Проверить все операции (select , update , insert , delete) с использованием соединения между 2 бд.
Проверить распределенные БД, используя операции (COMMIT,ROLLBACK).
Физическая структура Физическая структура базы данных это набор файлов операционной системы, В Oracle база данных состоит из трех типов файлов. • Файлы данных (data files), содержащие фактические данные в базе данных • Журнал повторов (redo log files), содержит записи изменений, внесенных в базу данных, с целью восстановление данных в случае сбоев. • Файл контроля (control files), содержащит информацию, необходимую для поддержания и проверки целостности данных
Логическая структура
Логическая структура включает tablespaces, сегменты (segments), экстенты (extents), и данные блоков (data blocks).
Tablespaces Данные в базе данных Oracle хранятся в табличном пространстве tablespaces.
• Tablespace может принадлежать только одна база данных по времени. • Каждая tablespace состоит из одного или нескольких файлов операционной системы, которые называют файлы данных.• Tablespace может состоять из одного или нескольких сегментов. • Tablespaces может быть доступна в то время, когда активизируется база данных. • Tablespaces может быть включена только для чтения или для чтения и записи.
Рис. Логическая структура БД
Файлы данных • Каждая tablespace в базе данных Oracle состоит из одного или нескольких файлов данных являющиеся физическими структурами.• Файл данных может принадлежать только одному tablespace.• Администратор БД может изменить размер файла данных после ее создания или может указать, что файл данных, может динамично развиваться в качестве объектов в tablespace.
Сегменты • Сегмент это пространство, выделяемое под конкретные логические структуры хранения tablespace. • Tablespace может состоять из одного или нескольких сегментов. • Сегмент не может охватывать tablespace, однако сегмент может охватывать несколько файлов данных, которые принадлежат к одному и тому же tablespace. • Каждый сегмент состоит из одного или нескольких экстентов.
Экстенты
• Один или несколько экстентов составляют сегмент.- Когда сегмент будет создан, он состоит по крайней мере из одного экстента. - По мере роста сегмента, экстенты будут добавляться к сегмент.
Oracle block
Extent
Segment
Teblespace
Database
Data file
OS block
PhysicalLogical
- Только DBA имеет право добавлять экстенты в сегмент.
Блоки данных • Блок данных это наименьшая единица хранения данных, • Стандартный размер блока данных для базы данных Oracle не установлен. Параметр размера блока (DB_BLOCK_SIZE) инициализируется при создании базы данных. • Максимальный размер блока данных зависит от операционной системы.
Интерфейс ‘ENTERPRISE MANAGER CONSOLE’
1- Если пока нет определенной базы данных, Вы можете определить ее с
использованием Add database, где нужно определить (host name - имя
компьютера, где хранится БД, и sid - имя БД)
2- Далее открываем базу данных с помощью кнопки (Launch standalone , login
to the oracle management server). Затем в открывшемся окне вводим имя
- обновить tablesapce (1- добавить новый файл, 2- увеличить объем).
- удалить tablesapce.
Экспорт и Импорт пользователя
Программы exp и imp: предназначены для экспортирования и импортирования данных из или в oracle. Результат экспортирования будет файл типа «dmp». И файл импортирования так же должен быть файл типа «dmp». Пользователь, обладающий привилегий (import (imp-full-database) или export (exp-full-database) или database administrator) может выполнить такие операции. Экспорт пользователя ( Export user) :С помощью программа EXP, находящаяся в папке Oracle/bin:
Создать пакетный файл в блокноте windows (имя. bat ) :Полное_название_прграммы_Экспорт + ‘ ‘ползователь/пароль@имя_бд + ‘ ‘FILE=название_результат_файл.dmp +’ ‘ LOG= название_файл_отчета.log
Пример C:\oracle9i\ora92\bin\EXP ff/ff@ora FILE=C:\oracle9i\STA.DMP LOG=C:\oracle9i\STAjam111.LOG
Импорт пользователя (Import user):С помощью программа IMP:Создать пакетный файл windows (. bat ) в нем:Полный_название_прграмма_Экспорт + ‘ ‘ползоватль/пороль@имя_бд + ‘ ‘ fromuser = имя_ ползоватль + ‘ ’ ignore=yes + ‘ ‘ название_Источник файла.dmp +’ ‘ + LOG= название_файл_отчета.log
Пример -C:\oracle9i\ora92\bin\IMP ff/ff@ora fromuser=ff ignore=yes FILE=C:\oracle9i\
STA.DMP LOG=C:\oracle9i\jam111.LOG
Программы экспорт и импорт создаются с целью сохранения данных и восстановления.
Упражнения
1- Соединить СУБД Access с Oracle (связь с таблицами) (с использованием пользователя со своим идентификатором) и создать новые Формы для чтения данных из таблиц (в Oracle ).
2- Выполнить операции добавление , удаление, обновление, из oracle с помощью формы, сделанной в СУБД Access. Проверить результаты с использованием sql.
3- Выполнить процесс «импорт из oracle в таблицу access» и сделать несколько изменений в таблице access и выполнить обратный процесса «экспорт из access в oracle».
4- С помощью интерфейса ENTERPRISE MANAGER CONSOLE’ выполнить следующие операции:- добавить новый tablesapce, определить его объема и место
нахождения,- обновить tablesapce (1- добавить новый файл, 2- увеличить объем),- создавать нового пользователя ( который будет использовать этот
tablesapce), определить его привилегии как администратора базы данных,- создать таблицы в схеме б.д, принадлежащего этому новому