Top Banner
Введение Система 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, а также ряда вспомогательных программ и файлов.
66

ЛабРабOracle

Nov 29, 2014

Download

Documents

anon_769843966
Welcome message from author
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
Page 1: ЛабРабOracle

ВведениеСистема 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 показаны эти фоновые процессы экземпляра.

Page 2: ЛабРабOracle

Рис.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.

Файлы данных

Контрольные Файлы

АрхивныеФайлы

Page 3: ЛабРабOracle

SGA – это область разделяемой памяти, в которой содержатся данные и управляющая информация экземпляра.

PGA – это область памяти, выделяемая для каждого серверного процесса, содержащая данные и управляющую информацию этого процесса. Серверный процесс – это процесс, который обрабатывает запросы клиента.

Табличные пространства и файлы данных

Табличное пространство (tablespace) – это набор, состоящий из одного или нескольких файлов данных. В этих файлах размещается информация, относящаяся к базе данных. Каждая база данных Oracle содержит табличные пространства System и SYS (рис.2). Они автоматически создаются, когда создается база данных. Пространство System всегда находится в оперативном состоянии, когда открыта база данных. В нем хранятся таблицы, поддерживающие функциональные возможности ядра базы данных (например, таблицы словаря данных). SYS – вспомогательное по отношению к System табличное пространство. Оно хранит многие компоненты базы данных и должно быть в оперативном состоянии для корректного функционирования базы данных.

Рис.2. Табличные пространства System и Sys

Польз.1

Польз.2

Польз.n

Словаря данных

Oracle Администратор

1-System2-sys

Только чтение

Только чтение

tabdual

User_constraints

Page 4: ЛабРабOracle

В базе данных существуют следующие структуры хранения:

- Логические: база данных, схема, табличное пространство, сегмент, экстент, блок Oracle,- Физические: файлы данных, файлы параметров, журналы и блок ОС.

Типовая схема базы данных “Персонал”(HR - Human Resources)

В Oracle9i содержится схема базы данных «Персонал» (- Human Resources - HR), которая может быть использована для проверки работоспособности системы. В этой схеме находятся таблицы, в которых хранится вся необходимая информация о сотрудниках, работающих в организации. Схема HR состоит из семи таблиц: Employees, Departments, Locations, Countries, Regions, Jobs, Job_history.

Ниже приведены данные по трем таблицам.

1- Employees (служащие)

2- Departments (отделы)

3- Locations (местоположение)

Page 5: ЛабРабOracle

Запуск SQL*Plus

Для запуска SQL*Plus выполните:Пуск->Программы->Oracle->Application Development->SQL*Plus

Предложение SQL * plus представляет собой интерпретатор для SQL и PL / SQL c интерфейсом командой строки. Оно принимает от пользователя инструкцию для доступа к базе данных и направляет их серверу ORACLE, а результаты отображает на экране монитора. На рис.3 показано диалоговое окно для входа в систему.

Введите в поле имени пользователя hr, а в поле пароля также hr.

Рис.3. Диалоговое окно

После выполнения ОК при успешном вводе появится окно SQL*Plus (рис.4), через которое можно в дальнейшем взаимодействовать.

Page 6: ЛабРабOracle

Рис.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.

Page 7: ЛабРабOracle

Таблица 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” может создавать новых пользователей.

Page 8: ЛабРабOracle

Для создания пользователя в 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.

Page 9: ЛабРабOracle

Revoke create user from user1;

Привилегии изъяты.

Создание объектов базы данных

База данных формируется с помощью следующих объектов:1- Table - таблица, 2- View – представление, 3- Sequence - Последовательность, 4- Index – индекс, 5- Synonym - Синоним.

Создание объектов базы данных осуществляется с помощью предложения оператора Create.Create объект название_объекта ……. .

Создание таблицы

Осуществляется с помощью предложения CREATE TABLECREATE TABLE [schema.]table

(column datatype [DEFAULT expr][, ...]);

Пример:

CREATE TABLE dept(deptno NUMBER(2), dname VARCHAR2(14),loc VARCHAR2(13));

VARCHAR2(size) Variable-length character dataNUMBER [(p,s)] Number having precision p and scale s DATE Date and time values

Обновление таблицы ALTER TABLE позволяет:

• Добавить новый столбец.• Обновить свойства существующего столбца.• Задать значение столбца default value.• Удалить столбец.

ALTER TABLE таблица_имяADD (column datatype [DEFAULT expr]

Page 10: ЛабРабOracle

[, column datatype]...);

ALTER TABLE таблица_имяMODIFY (column datatype [DEFAULT expr]

[, column datatype]...);

ALTER TABLE таблица_имяDROP (column);

Удаление таблиц

DROP TABLE dept80;

Изменение имени таблицы

RENAME dept TO detail_dept;

Добавление ограничения “Constraints”

Существуют следующие вид ограничения

– NOT NULL– UNIQUE – PRIMARY KEY– FOREIGN KEY– CHECK

CREATE TABLE [schema.] таблица_имя (column datatype [DEFAULT expr]

[column_constraint],...[table_constraint][,...]);

CREATE TABLE employees( employee_id NUMBER(6), first_name VARCHAR2(20), ... job_id VARCHAR2(10) NOT NULL,

CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID));

NOT NULL Constraint

Page 11: ЛабРабOracle

CREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE CONSTRAINT emp_hire_date_nn NOT NULL,...

UNIQUE ConstraintCREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL,... CONSTRAINT emp_email_uk UNIQUE(email));

PRIMARY KEY ConstraintCREATE TABLE departments( department_id NUMBER(4), department_name VARCHAR2(30) CONSTRAINT dept_name_nn NOT NULL, manager_id NUMBER(6), location_id NUMBER(4), CONSTRAINT dept_id_pk PRIMARY KEY(department_id));

FOREIGN KEY ConstraintCREATE TABLE employees( employee_id NUMBER(6), last_name VARCHAR2(25) NOT NULL, email VARCHAR2(25), salary NUMBER(8,2), commission_pct NUMBER(2,2), hire_date DATE NOT NULL,... department_id NUMBER(4), CONSTRAINT emp_dept_fk FOREIGN KEY (department_id) REFERENCES departments(department_id), CONSTRAINT emp_email_uk UNIQUE(email));

Page 12: ЛабРабOracle

CHECK Constraintsalary NUMBER(2) CONSTRAINT emp_salary_min CHECK (salary > 0),...

Добавление ограничений предложения

ALTER TABLE таблица_имя ADD [CONSTRAINT constraint] type (столбец);

ALTER TABLE employeesADD CONSTRAINT emp_manager_fk FOREIGN KEY(manager_id) REFERENCES employees(employee_id);

Удаление ограничений

ALTER TABLE employeesDROP CONSTRAINT emp_manager_fk;

ALTER TABLE employeesDROP CONSTRAINT emp_manager_fk;

ALTER TABLE departmentsDROP PRIMARY KEY CASCADE;

Отключение ограничений - Disabling Constraints

ALTER TABLE employeesDISABLE CONSTRAINT emp_emp_id_pk CASCADE;

Включиие ограничений - Enabling Constraints

ALTER TABLE employeesENABLE CONSTRAINT emp_emp_id_pk;

Просмотр ограниченийМожно найти информации об Ограничениях в таблице USER_CONSTRAINTS или представление словаря данных USER_CONS_COLUMNS

Добавление данные

INSERT INTO table [(column [, column...])]

Page 13: ЛабРабOracle

VALUES (value [, value...]);

Если типа данных date то нужно написать: ‘dd-mm-yyyy’ ex : ‘1-1-2008’ или to_date(‘1-1-2008’,’dd-mm-yyyy’)

Если типа данных varchar2 то нужно написать:

varchar2_стол. ‘value’ ex : ‘moscow’

INSERT INTO departments(department_id, department_name, manager_id, location_id)VALUES (70, 'Public Relations', 100, 1700);

Exercises (Упражнения)

1- Создать нового пользователя и задать ему привилегии.2- Спроектировать базу данных (получить вариант задания)3- Создать таблицы. 4- Ввести данные(до 10 строк)4- Добавить ограничения.

Варианты заданий

1- Спроектировать базу данных для получения сведений о студентах. Возможные атрибуты :Номер_факультета, название, ФИО_декана, телефон, номер_группы, специальность, количество_студентов_ в_группе, ФИО_старосты, ФИО_студента, стипендия, номер_зачетной_книжки. 2- Спроектировать базу данных о сотрудниках. Возможные атрибуты :ФИО, год_раждения, должность, отдел, домашний_адрес, вуз¸ адрес_вуза, год_окончания, сведения_о_детях.

3 - Спроектировать базу данных о поставщиках и деталях. Возможные атрибуты :Наименование_поставщива, адрес, номер_счета_в_госбанке, номер_госта, Наименование_детали, единица_измерения¸цена.

4 - Спроектировать базу данных о книжных магазинах. Возможные атрибуты:

Page 14: ЛабРабOracle

Адрес_книжного_магазина, название_книжного_магазина, название_книгой , издательства, ФИО писатель.

5 - Спроектировать базу данных о торговли магазинах. Возможные атрибуты: Адрес_магазина, название_магазина,тип_товара, номер_товар, единица_измерения¸цена , количество_на_складе,номер_продажа_ операция, дата_продажа_операция, название_товара .

Вопросы1. Основные продукты Oracle2. Архитектура сервера3. Экземпляр Oracle4. Фоновые процессы5. Основные части структуры памяти6. SGA7. PGA8. Табличное пространство9. Назначение System и Sys10.Логические и физические структуры хранения11.Создание учетной записи пользователя12.Изменение пароля13.Задание полномочий14.Отмена привилегий15.Создание таблиц16.Обновление таблиц17.Добавление ограничений18.Удаление ограничений19.Добавление данные

Page 15: ЛабРабOracle

Лабораторная работа №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’)

Если тип данных varchar2 то нужно написать:

varchar2_стол. ‘value’ ex : ‘moscow

INSERT INTO departments(department_id, department_name, manager_id, location_id)VALUES (70, 'Public Relations', 100, 1700);

Обновление данных

UPDATE tableSET column = value [, column = value, ...][WHERE condition];

Page 16: ЛабРабOracle

UPDATE employeesSET department_id = 70WHERE employee_id = 113;

Удаление данных

DELETE [FROM] table[WHERE condition];

DELETE FROM departmentsWHERE department_name = 'Finance';

Выбор данных Select (Data retrieval)

SELECT *|{[DISTINCT] column|expression [alias],...}FROM table[WHERE condition(s)];[ORDER BY {column, expr, alias} [ASC|DESC]];

SELECT department_id, location_idFROM departments;

Использование арифметических операторов ( + , - , * , / )

SELECT last_name, salary, 12*salary+100FROM employees;

SELECT last_name ||' is a '||job_id AS "Employee Details"FROM employees;

SELECT employee_id, last_name, job_id, department_idFROM employeesWHERE department_id = 90;

Comparison Conditions(=,<>,<,>,<=,>=)(Between and , in , like , is null)(And, or, not)

Page 17: ЛабРабOracle

SELECT employee_id, last_name, job_id, salaryFROM employeesWHERE salary >= 10000OR job_id LIKE '%MAN%';

ФУНКЦИИ

1- NVL (expr1, expr2)expr1 - исходное или вычисленное значение, которое может быть

неопределенного значения.expr2 значение, которое подставляется вместо неопределенного значения.

Функция возвращает значение expr1, если оно не нулевое, иначе возвращает expr2

2- NVL2 (expr1, expr2, expr3)

Return expr2, если expr1 is not null Return expr3, если expr1 is null

3. NULLIF (expr1, expr2)

Return null if expr1 = expr2Return expr1 if expr1 <> expr2

Функция возвращает нулевое значение (null), если expr1 = expr2, иначе возвращает expr1

4. COALESCE (expr1, expr2, ..., exprn)

Функция возвращает первый ненулевой элемент в списке элементов.

Примеры применения функций

SELECT last_name, commission_pct, NVL(commission_pct, 0)FROM employees;

SELECT last_name, salary, commission_pct, NVL2(commission_pct, 'SAL+COMM', 'SAL') incomeFROM employees WHERE department_id IN (50, 80);

Page 18: ЛабРабOracle

SELECT first_name, LENGTH(first_name) "expr1", last_name, LENGTH(last_name) "expr2", NULLIF(LENGTH(first_name), LENGTH(last_name)) resultFROM employees;

SELECT last_name, COALESCE(commission_pct, salary, 10) commFROM employeesORDER BY commission_pct;

Выборка данных из нескольких таблиц

Выборка данных из двух или нескольких таблиц в Oracle выполняется следующим образом:

SELECT table1.column, table2.columnFROM table1, table2WHERE table1.column1 = table2.column2;

Пример

SELECT employees.employee_id, employees.last_name,employees.department_id, departments.department_id, departments.location_id

FROM employees, departmentsWHERE employees.department_id = departments.department_id;

Если предложение состояло бы без условия (WHERE), то в результате было бы получено декартово произведение.

Внешние соединения Внешнее соединение используется для выборки строк, не удовлетворяющих обычным условиям соединения. Оператором внешнего соединения является знак плюс, заключенный в скобки “(+)”. Этот оператор указывается с той стороны, где нет значения, по которому можно было бы произвести соединение.

Синтаксис:

SELECT таблица.столбец, таблица.столбец FROM таблица1, таблица2; WHERE таблица1.столбец1 = таблица2.столбец2(+)

Page 19: ЛабРабOracle

Пример. Вывод имен сотрудников и департаментов.

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;

Page 20: ЛабРабOracle

Использование предиката 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');

Page 21: ЛабРабOracle

Однострочные и многострочные подзапросы

По количеству возвращаемых строк, удовлетворяющих условию запроса, подзапросы разделяют на однострочные и многострочные. В однострочных подзапросах в качестве операторов сравнения могут быть использованы операторы:“>”, “=”, “>=”, “<”, “<>”, “<=”. Для многострочных запросов правильным будет использование операторы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');

Page 22: ЛабРабOracle

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;

Page 23: ЛабРабOracle

Порядок выполнения транзакций представлен на рис.1.1- Начало транзакции. Может начинаться с любого оператора DML. 2- Конец представляется одним из следующих событий:

a. Командами COMMIT или ROLLBACK b. DDL или DCL предложения исполняет (автоматическая commit)

c. Пользовательский выход iSQL * Plus d. Система сбоев с одним из следующих событий

Рис 1. управления транзакциями

Определение маркерной точки выполняется следующим образом:

savepoint a;

Отмена до маркерной точки выполняется следующим образом:

rollback to savepoint a;

Создание представлений

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW представление_имя [(alias[, alias]...)]AS subquery[WITH CHECK OPTION [CONSTRAINT constraint]][WITH READ ONLY [CONSTRAINT constraint]];

Использование алиаса для имени столбца является обязательным тогда, когда происходит вычисление ее значений

SAVEPOINT B

SAVEPOINT A

DELETE

INSERT

UPDATE

INSERT

COMMITTime

Transaction

ROLLBACK to SAVEPOINT B

ROLLBACK to SAVEPOINT A

ROLLBACK

Page 24: ЛабРабOracle

FORCE/NOFORCE позволяет создавать представление с учетом или без учета того, существуют ли применяемые в нем таблицы.

WITH READ ONLY - Запрет применения к данному представлению операций DML.

WITH CHECK OPTION - Режим, при котором добавлять или обновлять можно только строки, доступные в представлении.

Пример1 (Простые представления):Create or replace view view_department_50As select last_name , first_name , salary from employeesWhere department_id = 50;

Пример2 (Сложные представления):

CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal)AS SELECT d.department_name, MIN(e.salary) minsal, MAX(e.salary)

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)

Page 25: ЛабРабOracle

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;

SELECT sequence_name, min_value, max_value, increment_by, last_number

FROM user_sequences;

Использование последовательности с помощью:Имя_ Последовательность.CURRVAL и Имя_ Последовательность. NEXTVALМожно узнать и использовать только текущее значение.

INSERT INTO departments(department_id, department_name, location_id)VALUES (dept_deptid_seq.NEXTVAL, 'Support', 2500);

SELECT dept_deptid_seq.CURRVALFROM dual;

Последовательность не может быть обновлена, но может быть удалена.

Удаление последовательности

Page 26: ЛабРабOracle

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%.

Page 27: ЛабРабOracle

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

Page 28: ЛабРабOracle

Каждая единица PL / SQL состоит из одного или нескольких блоков. Эти блоки могут быть совершенно отдельными или вложенными одна в другую. Эти блоки могут быть (процедуры, функции или анонимные блоки). Программы PL/SQL являются логическими блоками, которые могут содержать любое количество вложенных подблоков. Таким образом, один блок может составлять незначительную часть от другого блока, который в свою очередь, может быть частью всего блока кода.

DECLARE -- Факультативный, если нужно определить “variables” Variables, cursors, user-defined exceptionsBEGIN -- Обязательный- SQL предложения- PL/SQL предложения

EXCEPTION – Факультативный

-- Исключения (Действия выполнять, когда ошибки)

END; – Обязательный/ -- Знак для завершения и компиляции PL/SQL блока

В блоке DECLARE описываются переменные В pl/sql существует блоки трех типов :

а. Безымянный блок.б. Процедурный блок.в. Функция.

а. Безымянный блок

[DECLARE]-- ОбъявленияBEGIN-- Предложения или операторы

[EXCEPTION]-- ИсключенияEND;

Б. Процедурный блок

CREATE [OR REPLACE] PROCEDURE название_процедуры[(

Page 29: ЛабРабOracle

parameter1 [mode1] datatype1, -- mode может быть in/out/in out parameter2 [mode2] datatype2, . . .)]IS|ASBEGIN -- Предложения[EXCEPTION] -- ИсключенияEND;

-parameter[mode] или Параметр [вид], вид параметре может быть либо IN либо OUT либо INOUT.

В. Функция

CREATE [OR REPLACE] FUNCTION название_функции [(parameter1 [mode1] datatype1, parameter2 [mode2] datatype2, . . .)]RETURN datatypeIS|ASBEGIN -- предложения RETURN value;[EXCEPTION] -- ИсключенияEND;

-parameter[mode] или Параметр [вид], вид параметре может быть либо IN либо OUT либо INOUT.

Data types

CHAR [(maximum length)] . -- максимальная ширина 255 символов.VARCHAR2 (maximum length). -- максимальная ширина 4000 символов.LONG -- максимальная ширина 2 гигабайта.DATEBOOLEAN

Примеры декларации:DECLARE v_job VARCHAR2(9); v_total_sal NUMBER(9,2) := 0; v_orderdate DATE := SYSDATE + 7; c_tax_rate CONSTANT NUMBER(3,2) := 8.25;

Page 30: ЛабРабOracle

v_valid BOOLEAN NOT NULL := TRUE; ...

Можно для “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.

SET SERVEROUTPUT ON

DEFINE p_annual_sal = 60000 DECLARE v_sal NUMBER(9,2) := &p_annual_sal;BEGIN v_sal := v_sal/12; DBMS_OUTPUT.PUT_LINE ('The monthly salary is ' || TO_CHAR(v_sal));

Page 31: ЛабРабOracle

END;/

2. Использование выражений SQL внутри блок PL/SQL:

2-1. Выборка данных:

SELECT Statements in PL/SQL

SELECT select_listINTO {variable_name[, variable_name]...

| record_name} FROM table[WHERE condition];

DECLARE v_deptno NUMBER(4); v_location_id NUMBER(4);BEGIN SELECT department_id, location_id INTO v_deptno, v_location_id FROM departments WHERE department_name = 'Sales'; ...END;/

2-2. Добавление данные

BEGIN INSERT INTO employees (employee_id, first_name, last_name, email, hire_date, job_id, salary) VALUES (employees_seq.NEXTVAL, 'Ruth', 'Cores', 'RCORES', sysdate, 'AD_ASST', 4000);END;/

2-3. Обновление данные

DECLARE

Page 32: ЛабРабOracle

v_sal_increase employees.salary%TYPE := 800; BEGIN UPDATE employees SET salary = salary + v_sal_increase WHERE job_id = 'ST_CLERK';

END;/

2-4. Удаление данные

DECLARE v_deptno employees.department_id%TYPE := 10; BEGIN DELETE FROM employees WHERE department_id = v_deptno;END;/

3. Дополнительные выражений:

3-1. IF-THEN-ELSE предложения

DECLAREv_hire_date DATE := '12-Dec-1990';

v_five_years BOOLEAN;BEGIN. . .IF MONTHS_BETWEEN(SYSDATE,v_hire_date)/12 > 5 THEN v_five_years := TRUE;ELSE v_five_years := FALSE;END IF;...

Дрогой вид предложения IF-THEN-ELSIF

. . .IF v_start > 100 THEN v_start := .2 * v_start;ELSIF v_start >= 50 THEN v_start := .5 * v_start;ELSE v_start := .1 * v_start;

Page 33: ЛабРабOracle

END IF;. . .

3-2. CASE предложения

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;/

3-3. Оператор цикла: LOOP

В pl/sql есть три типа оператора цикла:

- Basic loop- FOR loop- WHILE loop

3-3-1. Basic Loops

Page 34: ЛабРабOracle

LOOP Оператор 1; Оператор 2; . . . EXIT [WHEN условие];END LOOP;

Пример

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

Page 35: ЛабРабOracle

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- Явные,

Page 36: ЛабРабOracle

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;

Page 37: ЛабРабOracle

:строк_удаленно:= (SQL%ROWCOUNT || ' row deleted.');END;/PRINT строк_удаленно

Явные курсоры (Explicit Cursor)

Declare -- Создает именованную SQL область. Open – Определяет активное множество.Fetch – передает текущий ряд в переменную. Empty – проверка на существование ряда, возврат в Fetch если ряды существуют.Close – Реализовать активное множество.

1-DeclareCURSOR имя_курсора ISВыборка предложения; -- любое select предложение.

2-OPEN имя_курсора;

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

Page 38: ЛабРабOracle

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)

Page 39: ЛабРабOracle

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

EXECUTE query_emp(171, :g_name, :g_sal, :g_comm)PRINT g_name

Пример3CREATE OR REPLACE PROCEDURE format_phone (p_phone_no IN OUT VARCHAR2)ISBEGIN p_phone_no := '(' || SUBSTR(p_phone_no,1,3) || ')' || SUBSTR(p_phone_no,4,3) || '-' || SUBSTR(p_phone_no,7);END format_phone;/

Выполнить процедуру

1- VARIABLE g_phone_no VARCHAR2(15)BEGIN :g_phone_no := '8006330575'; END;/PRINT g_phone_no2- EXECUTE format_phone (:g_phone_no)PRINT g_phone_no

ФункцияНаписать функцию, что бы вывести на дисплей зарплату определенного сотрудника.

Page 40: ЛабРабOracle

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;

Page 41: ЛабРабOracle

Можно найти информацию о процедурах или функциях в представлении словаря данных 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 блока

Создание базы данных триггеров

Page 42: ЛабРабOracle

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 : системная дата.

Упражнения

Page 43: ЛабРабOracle

А. Войдите в 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- Написать триггер, чтобы запретить обновления информации в не рабочие дни и часы.

Solutions

A-1-Create table emp1As select * from employees;

A-2-SET SERVEROUTPUT ONDECLARE

v_empno employees.employee_id%TYPE := 110;v_salary employees.salary%TYPE;

Page 44: ЛабРабOracle

v_job employees.job_id%TYPE;BEGIN

Select salary,job_idInto v_salary, v_jobFrom employeesWhere employee_id = v_empno;DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_empno)||' '|| v_salary || ' '|| v_job);

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

==============================A-3- Create table dept_info(Dept_id number,

Dept_countemp number,Dept_avgsalary number);

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

Page 45: ЛабРабOracle

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;

elsif v_commission >0 and v_salary > 6000 thenupdate emp1set salary = salary + 250where employee_id = v_employee_id;

else update emp1set salary = salary + 650where 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;

Page 46: ЛабРабOracle

==============================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

update emp1set salary = salary *1.1where employee_id = v_employee_id;

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 помощью «Формы» можно также произвести добавление, удаление, и обновление.

Page 47: ЛабРабOracle

Для построения соединения 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 бд.

Page 48: ЛабРабOracle

Проверить распределенные БД, используя операции (COMMIT,ROLLBACK).

Физическая структура Физическая структура базы данных это набор файлов операционной системы, В Oracle база данных состоит из трех типов файлов. • Файлы данных (data files), содержащие фактические данные в базе данных • Журнал повторов (redo log files), содержит записи изменений, внесенных в базу данных, с целью восстановление данных в случае сбоев. • Файл контроля (control files), содержащит информацию, необходимую для поддержания и проверки целостности данных

Логическая структура

Логическая структура включает tablespaces, сегменты (segments), экстенты (extents), и данные блоков (data blocks).

Tablespaces Данные в базе данных Oracle хранятся в табличном пространстве tablespaces.

• Tablespace может принадлежать только одна база данных по времени. • Каждая tablespace состоит из одного или нескольких файлов операционной системы, которые называют файлы данных.• Tablespace может состоять из одного или нескольких сегментов. • Tablespaces может быть доступна в то время, когда активизируется база данных. • Tablespaces может быть включена только для чтения или для чтения и записи.

Page 49: ЛабРабOracle

Рис. Логическая структура БД

Файлы данных • Каждая tablespace в базе данных Oracle состоит из одного или нескольких файлов данных являющиеся физическими структурами.• Файл данных может принадлежать только одному tablespace.• Администратор БД может изменить размер файла данных после ее создания или может указать, что файл данных, может динамично развиваться в качестве объектов в tablespace.

Сегменты • Сегмент это пространство, выделяемое под конкретные логические структуры хранения tablespace. • Tablespace может состоять из одного или нескольких сегментов. • Сегмент не может охватывать tablespace, однако сегмент может охватывать несколько файлов данных, которые принадлежат к одному и тому же tablespace. • Каждый сегмент состоит из одного или нескольких экстентов.

Экстенты

• Один или несколько экстентов составляют сегмент.- Когда сегмент будет создан, он состоит по крайней мере из одного экстента. - По мере роста сегмента, экстенты будут добавляться к сегмент.

Oracle block

Extent

Segment

Teblespace

Database

Data file

OS block

PhysicalLogical

Page 50: ЛабРабOracle

- Только DBA имеет право добавлять экстенты в сегмент.

Блоки данных • Блок данных это наименьшая единица хранения данных, • Стандартный размер блока данных для базы данных Oracle не установлен. Параметр размера блока (DB_BLOCK_SIZE) инициализируется при создании базы данных. • Максимальный размер блока данных зависит от операционной системы.

Интерфейс ‘ENTERPRISE MANAGER CONSOLE’

1- Если пока нет определенной базы данных, Вы можете определить ее с

использованием Add database, где нужно определить (host name - имя

компьютера, где хранится БД, и sid - имя БД)

2- Далее открываем базу данных с помощью кнопки (Launch standalone , login

to the oracle management server). Затем в открывшемся окне вводим имя

администратора и пароль.

3. Просмотрите возможности, предоставляемые интерфейсом.

Например, Storage:

- Добавить tablesapce определить его обема.

- обновить tablesapce (1- добавить новый файл, 2- увеличить объем).

- удалить tablesapce.

Экспорт и Импорт пользователя

Page 51: ЛабРабOracle

Программы 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».

Page 52: ЛабРабOracle

4- С помощью интерфейса ENTERPRISE MANAGER CONSOLE’ выполнить следующие операции:- добавить новый tablesapce, определить его объема и место

нахождения,- обновить tablesapce (1- добавить новый файл, 2- увеличить объем),- создавать нового пользователя ( который будет использовать этот

tablesapce), определить его привилегии как администратора базы данных,- создать таблицы в схеме б.д, принадлежащего этому новому

пользователю.5- Экспорт пользователя ех1 (схема ex1).6- Удалить пользователя ех1.7- Создать ех1.8- Импорт пользователя ех1 (схема ex1).