Similar presentations:
Базы данных Основы PL/SQL Часть 2
1.
БАЗЫ ДАННЫХОсновы PL/SQL
Часть 2
Преподаватель Савченко Н.А.
2.
Основа PL/SQL часть 2Управление явными курсорами
Нет
DECLARE
OPEN
• Создание
• Выявление
именованной
активного
рабочей
набора
области SQL
FETCH
ПУСТО?
Да
• Загрузка
• Проверка
текущей
на наличие
строки в
строк
переменные • Возврат к
FETCH, если
строки
обнаружены
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
CLOSE
Освобожден
ие
активного
набора
2
2
3.
Основа PL/SQL часть 2Управление явными курсорами
Открытие курсора
Указатель
Выборка строки курсора
Указатель
Выборка до тех пор, пока не останется строк
Указатель
Закрытие курсора
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
3
3
4.
Основа PL/SQL часть 2О курсорах
Для каждой команды SQL, выполняемой
сервером Oracle, выделяется отдельная рабочая
область (курсов).
•Неявные курсоры: объявляются в блоках
PL/SQL для всех команд DML и команд SELECT.
•Явные курсоры: объявляются явно
программистом, который присваивает им имя.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
4
4
5.
Основа PL/SQL часть 2Функции явного курсора
Таблица
Активный набор
Курсор
100 King
101 Kochhar
102 De Haan
. .
. .
. .
. .
139 Seo
140 Patel
. .
.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
AD_PRES
AD_VP
AD_VP
.
.
.
.
ST_CLERK
ST_CLERK
5
5
6.
Основа PL/SQL часть 2Объявление курсора
Синтаксис
CURSOR имя_курсора IS
команда_select;
•Предложение INTO при объявлении курсора не
используется.
•Если требуется обработка строк в определенной
последовательности, в запросе используется
предложение ORDER BY.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
6
6
7.
Основа PL/SQL часть 2Объявление курсора
Пример:
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name
FROM employees;
CURSOR dept_cursor IS
SELECT *
FROM departments
WHERE location_id=170;
BEGIN
…
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
7
7
8.
Основа PL/SQL часть 2Открытие курсора
Синтаксис:
OPEN имя_курсора;
•Курсор открывается для выполнения запроса и
выявления активного набора.
•Если запрос не возвращает ни одной строки,
исключение не возбуждается.
•Проверяйте состояние курсора после выборки
строки (операция FETCH) с помощью атрибутов
явного курсора.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
8
8
9.
Основа PL/SQL часть 2Выборка данных из курсора
Синтаксис:
FETCH имя_курсора INTO [переменная1,переменая2, …]
|имя_записи];
•Значение текущей строки выбирается в выходные
переменные.
•Включается столько переменных, сколько столбцов
в запросе.
•Последовательность и тип переменных должны
соответствовать последовательности и типу столбцов.
•Проверьте, содержит ли курсор строки.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
9
9
10.
Основа PL/SQL часть 2Выборка данных из курсора
Пример
LOOP
FETCH emp_cursor INTO v_empno, v_ename;
EXIT WHEN …;
…
--Process the retrieved data
…
END LOOP;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
10
10
11.
Основа PL/SQL часть 2Закрытие курсора
Синтаксис
CLOSE имя_курсора;
•По окончании обработки строк курсор следует
закрыть.
•Если нужно, откройте курсор снова.
•Не пытайтесь выбирать данные из кусрора
после его закрытия.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
11
11
12.
Основа PL/SQL часть 2Атрибуты явного курсора
Информацию о состоянии курсора можно получить с
помощью атрибутов явного курсора.
Атрибут
Тип
Описание
%ISOPEN
Boolean
Истинно (TRUE), если курсор
открыт
%NOTFOUND
Boolean
Истинно (TRUE), если команда
FETCH не возвращает строку
%FOUND
Boolean
Истинно (TRUE), пока
последняя команда FETCH
возвращает строку; дополняет
%NOTFOUND
%ROWCOUNT
Number
Общее количество строк,
выбранных на данный момент
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
12
12
13.
Основа PL/SQL часть 2Атрибут %ISOPEN
• Выборка строк возможна только при открытом
курсоре.
• Прежде, чем выполнять операцию FETCH,
проверьте с помощью атрибута %ISOPEN, открыт
ли курсор.
Пример:
IS NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
LOOP
FETCH emp_cursor…
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
13
13
14.
Основа PL/SQL часть 2Управление многократной выборки
• Для выборки нескольких строк из явного
курсора можно организовать цикл.
• При каждом выполнении цикла
извлекается одна строка.
• Проверить успех каждой выборки можно с
помощью атрибутов явного курсора.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
14
14
15.
Основа PL/SQL часть 2Атрибуты %NOTFOUND и %ROWCOUNT
• Атрибут явного курсора
%ROWCOUNT позволяет выбрать
точное количество строк.
• Момент выхода из цикла
определяется по атрибуту курсора
%NOTFOUND.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
15
15
16.
Основа PL/SQL часть 2Пример
DECLARE
v_empno hr.employees.employee_id%TYPE;
v_ename hr.employees.last_name%TYPE;
CURSOR emp_cursor IS
SELECT employee_id, last_name
FROM hr.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;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
16
16
17.
Основа PL/SQL часть 2Курсоры и записи
Строки из активного набора удобно обрабатывать, выбирая
значения в переменную PL/SQL типа RECORD.
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name
FROM employees;
emp_record emp_cursor%ROWTYPE;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor INTO emp_record;
…
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
17
18.
Основа PL/SQL часть 2Циклы FOR с курсором
Синтаксис
FOR имя_записи IN имя_курсора LOOP
команда1;
команда2;
…
END LOOP;
• Сокращенная форма кодирования операций с
явными курсорами.
• Неявное открытие, выборка и закрытие.
• Явного объявления записи не требуется; она
объявлена неявно.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
18
18
19.
Основа PL/SQL часть 2Циклы FOR с курсором
•Вывод списка служащих из таблицы EMPLOYEES,
работающих в отделе продаж.
DECLARE
CURSOR emp_cursor IS
SELECT last_name, department_id
FROM employees;
BEGIN
FOR emp_record IN emp_cursor LOOP
--implicit open and implicit fetch occur
IF emp_record.department_id = 80 THEN
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
19
19
20.
Основа PL/SQL часть 2Циклы FOR с курсорами,
в которых используется подзапрос
Объявлять курсор не требуется.
Пример:
BEGIN
FOR emp_record IN (SELECT last_name,department_id
FROM employees) LOOP
--implicit open and implicit fetch occur
IF emp_record.department_id = 80 THEN
…
END LOOP; --implicit close occurs
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
20
20
21.
Основа PL/SQL часть 2Курсоры с параметрами
Синтаксис:
CURSOR имя_курсора
[(имя_параметра, тип_данных, …)]
IS
команда_select;
Значения параметров передаются в курсор, когда курсор
открыт и выполняется запрос.
Явный курсор можно открывать многократно, получая
каждый раз новый активный набор.
OPEN имя_курсора(значение_параметра,…);
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
21
21
22.
Основа PL/SQL часть 2Курсоры с параметрами
Передача номера отдела и должности в предложение
WHERE команды SELECT, заданной в курсоре.
DECLARE
CURSOR emp_cursor
(p_Depno NUMBER, p_job VARCHAR2) IS
SELECT employee_id, last_name
FROM employees
WHERE department_id = p_deptno
AND job_id = p_job;
BEGIN
OPEN emp_cursor (80, ‘SA_REP’);
…
CLOSE emp_cursor;
OPEN emp_cursor (60, ‘IT_PROG’);
…
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
22
22
23.
Основа PL/SQL часть 2Предложение FOR UPDATE
Синтаксис:
SELECT …
FROM
…
FOR UPDATE [ OF ссылки_на_столбцы]
[NOWAIT];
• Явная блокировка позволяет запретить доступ к
данным в течение всей транзакции.
• Строки должны блокироваться до операции
обновления или удаления.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
23
23
24.
Основа PL/SQL часть 2Предложение FOR UPDATE
Выборка служащих 80 отдела и изменение
их оклада.
DECLARE
CURSOR emp_cursor IS
SELECT employee_id, last_name, department_name
FROM employees6 departments
WHERE employees.department_id =
department. department_id
AND employees. department_id = 80
FOR UPDATE OF salary NOWAIT
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
24
24
25.
Основа PL/SQL часть 2Предложение WHERE CURENT OF
Синтаксис
WHERE CURRENT OF курсор;
•Курсоры используются для обновления или
удаления текущей строки.
•Предложение FOR UPDATE включается в запрос
курсора для предварительной блокировки строк.
•Предложение WHERE CURRENT OF
используется для ссылки на текущую строку
явного курсора.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
25
25
26.
Основа PL/SQL часть 2Предложение WHERE CURRENT OF
DECLARE
CURSOR sal_cursor IS
SELECT e.department_id, employee_id, last_name, salary
FROM employee e, departments d
WHERE d.department_id=e.department_id
and d.department_id=60
FOR UPDATE OF salary NOWAIT;
BEGIN
FOR emp_record IN sal_cursor
LOOP
IF emp_record.salary<5000 THEN
UPDATE employees
SET salary=emp_record.salary*1.10
WHERE CURRENT OF sal_cursor;
END IF;
END LOOP;
END;
/
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
26
26
27.
Основа PL/SQL часть 2Курсоры с подзапросами
Пример
DECLARE
CURSOR my_cursor IS
SELECT t1.department_id, t1.department_name,
t2.staff
FROM departments t1, (SELECT department_id,
COUNT(*) AS STAFF
FROM employees
GROUP BY
department_id)t2
WHERE t1.department_id=t2.department_id
AND t2.staff > = 3 ;
…
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
27
27
28.
Основа PL/SQL часть 2Обработка исключений в PL/SQL
•Что такое исключение?
- Переменная в PL/SQL , возбуждаемая во
время выполнения.
•Как возникает исключение?
- Возбуждается сервером ORACLE.
- Возбуждается явно
•Как обрабатывается исключение?
- Перехватить с помощью обработчика
исключений.
- Распространить в вызывающую среду.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
28
28
29.
Основа PL/SQL часть 2Обработка исключений
Перехват
исключения
Распространение исключения
в вызывающую среду
DECLARE
BEGIN
Возбуждается
исключение
EXCEPTION
Исключение
перехвачено END;
BEGIN
EXCEPTION
END;
Возбуждается
исключение
Исключение не
перехвачено
Распространение
Исключений в
Российский государственный университет нефти и газа (НИУ)
имени И.М.Губкина
вызывающую
среду
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
29
29
30.
Основа PL/SQL часть 2Типы исключений
• Предопределенные,
возбуждаемые сервером Oracle
• Неопределенные, возбуждаемые
сервером Oracle
• Пользовательские
}
Возбуждается
неявно
Возбуждается
явно
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
30
30
31.
Основа PL/SQL часть 2Перехват исключений
Синтаксис:
EXCEPTION
WHEN исключение1 [OR исключение2…] THEN
Команда1;
Команда2;
…
[WHEN исключение3 [OR исключение4…] THEN
Команда1;
Команда2;
…]
[WHEN OTHERS THEN
Команда1;
Команда2;
…]
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
31
31
32.
Основа PL/SQL часть 2Перехват исключений: указания
• Секция обработки исключений начинается
с ключевого слова EXCEPTION
• Допускается несколько обработчиков
исключений
• Перед выходом из блока выполняется
только один обработчик исключений
• Предложение WHEN OTHERS является
последним
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
32
32
33.
Основа PL/SQL часть 2Перехват предопределенных ошибок
сервера Oracle
• В программе обработки исключений
ссылайтесь на стандартное имя
исключения.
• Примеры предопределенных исключений:
- NO_DATA_FOUNF
- TOO_MANY_ROWS
- INVALID_CURSOR
- ZERO_DIVIDE
- DUP_VAL_ON_INDEX
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
33
33
34.
Основа PL/SQL часть 2Предопределенные исключения
Синтаксис:
BEGIN
…
EXCEPTION
WHEN NO_DATA_FOUND THEN
Команда1;
Команда2;
WHEN TOO_MANY_ROWS THEN
Команда1;
WHEN OTHERS THEN
Команда1;
Команда2;
Команда3;
END
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
34
34
35.
Основа PL/SQL часть 2Перехват непредопределенных
исключения сервера Oracle
Объявление
Ссылка
Связывание
Декларативная секция
Присвоение имени
исключению
Секция обработки
исключений
Кодирование указания
компилятору PRAGMA
EXCEPTION_INIT
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
Обработка
исключения
35
35
36.
Основа PL/SQL часть 2Непредопределенное исключения
Перехват ошибки – 2292 сервера Oracle
(нарушение правила целостности)
DEFINE p_depno = 10
DECLARE
e_emps_remaining EXCEPTION;
PRAGMA EXCEPTION_INIT
(e_emps_remaining, -2292);
BEGIN
DELETE FROM departments
WHERE department_id=&p_deptno;
COMMIT;
EXCEPTION
WHEN e_emps_remaining THEN
DBMS_OUTPUT.PUT_LINE (‘Cannot remove dept’ || TO
ChAR(&p_deptno) || ‘ . Employees exist. ‘);
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
36
36
37.
Основа PL/SQL часть 2Функции для перехвата исключений
• SQLCODE: возвращает числовой код
ошибки
• SQLERRM: возвращает сообщение,
связанное с кодом ошибки
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
37
37
38.
Основа PL/SQL часть 2Функции для перехвата исключений
Пример:
DECLARE
v_error_code
NUMBER;
v_error_message VARCHAR2(255);
BEGIN
…
EXCEPTION
…
WHEN OTHERS THEN
ROLLBACK;
v_error_code : = SQLCODE ;
v_error_message : = SQLERRM ;
INSERT INTO errors
VALUES ( v_error_code, v_error_message);
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
38
38
39.
Основа PL/SQL часть 2Перехват пользовательских исключений
Объявление
Возбуждение
Ссылка
Декларативная
секция
Исполняемая
секция
Секция обработки
исключений
Присвоение
имени
исключению
Явное возбуждение
исключения с помощью
команды RAISE
Обработка
исключения
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
39
39
40.
Основа PL/SQL часть 2Пользовательские исключения
Пример
DEFINE p_department_desc = ‘Information Technology’
DEFINE P_department_number = 300
DECLARE
e_invalod_department EXCEPTION;
BEGIN
UPDATE
departments
SET
departments_name = ‘&p_department_desc’
WHERE
department_id = &p_department_number;
IF SQL%NOTFOUND THEN
RAISE e_invalid_department;
END IF;
COMMIT;
EXCEPTION
WHEN e_invalid_department THEN
DMBS_OUTPUT.PUT_LINE (‘No such department id.’);
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
40
40
41.
Основа PL/SQL часть 2Вызывающие среды
iSQL*PLUS
Выдает номер ошибки и
сообщение на экран
Procedure Builder
Выдает номер ошибки и
сообщение на экран
Oracle Developer Forms
Обеспечивает доступ к номеру
ошибки и сообщение в триггере с
помощью пакетных функций
ERROR_CODE и ERROR_TEXT
Приложения с прекомпилятором Обеспечивает доступ к номеру
ошибки в структуре данных
SQLCA
Внешний блок PL/SQL
Перехватывает исключение в
секции обработки исключений
внешнего блока
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
41
41
42.
Основа PL/SQL часть 2Распространение исключений
в вызывающую среду
Подборки могут
обрабатывать
исключения или
распространять его
во внешний блок
DECLARE
…
e_no_rows
exception;
e_integrity exception;
PRAGMA EXCEPTION_INIT (e_integrity, - 2292);
BEGIN
FOR c_record IN emp_cursor LOOP
BEGIN
SELECT …
UPDATE…
IF SQL%NOTFOUND THEN
RAISE e_no_rows;
END IF;
END;
END LOOP;
EXCEPTION
WHEN e_integrity THEN…
WHEN e_no_rows THEN…
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
42
42
43.
Основа PL/SQL часть 2Процедура RAISE_APPLICATION_ERROR
Синтаксис
raise_application_error (номер_исключения,
cообщение [ , {TRUE|FALSE}]);
•Процедура, которая позволяет посылать
пользовательские сообщения об исключениях из
хранимых подпрограмм.
•Можно сообщать приложению об исключениях
и избежать возврата необработанных
исключений.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
43
43
44.
Основа PL/SQL часть 2Процедура RAISE_APPLICATION_ERROR
•Используется в двух местах
- Исполняемая секция
- Секция исключения
- для выдачи других сообщений об
исключениях
•Возвращает пользователю информацию об
исключении тем же способом, которым
пользуется сервер Oracle
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
44
44
45.
Основа PL/SQL часть 2RASE_APPLICATION_ERROR
Исполняемая секция:
BEGIN
…
DELETE FROM employees
WHERE manager_id = v_mgr;
IF SQL%NOTFOUND THEN
RASE_APPLICATION_ERROR (-20202,
‘This is not a valid manager’);
END IF;
…
Секция обработки исключений:
…
EXCEPTION
WHEN NO_DATA_FOUND THEN
RASE_APPLICATION_ERROR (-20202,
‘This is not a valid employee’);
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
45
45
46.
Основа PL/SQL часть 2Пакет DBMS_SCHEDULER
Новые возможности:
• «программой» может быть не только блок PL/SQL,
но и хранимая процедура на PL/SQL или на Java,
внешняя процедура на С или даже команда ОС.
• запуск заданий получил возможность учета
текущей вычислительной обстановки в СУБД, а
также желаемой приоритетности среди прочих
заданий.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
46
46
47.
Основа PL/SQL часть 2Отслеживание выполнения
Таблицы словаря-справочника:
• DBA_SCHEDULER_JOBS,
• DBA_SCHEDULER_JOB_LOG
• прочие.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
47
47
48.
Основа PL/SQL часть 2Типы объектов хранения
•JOB
•SCHEDULE
•PROGRAM
•JOB CLASS,
•ряд других;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
48
48
49.
Основа PL/SQL часть 2Системные привилегии и роли,
необходимые для работы пакета
Системные привилегии:
•CREATE SESSION
•CREATE JOB
•CREATE ANY JOB
•EXECUTE ANY PROGRAM
•EXECUTE ANY CLASS
•MANAGE SCHEDULER
•CREATE EXTERNAL JOB
Объединяющая их роль:
•SCHEDULERADMIN;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
49
49
50.
Основа PL/SQL часть 2Объектные привилегии
• EXECUTE
• ALTER
• ALL
распространяются на:
• объекты типов JOB, SCHEDULE, PROGRAM и
JOB CLASS
• сам пакет DBMS_SCHEDULER.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
50
50
51.
Основа PL/SQL часть 2Процедура CREATE_JOB
Для создания простого внутреннего задания в оракл
необходимо выполнить процедуру CREATE_JOB
Синтаксис:
DBMS_SCHEDULER.CREATE_JOB(
job_name => '[схема_данных.]название_задания',
job_type
=>
'STORED_PROCEDURE
|
PLSQL_BLOCK
EXECUTABLE',
job_action => 'действие/процедура/команда_ОС',
[start_date => 'дата_старта',]
[repeat_interval => 'условие_повтора',]
[end_date => 'дата_останова',]
enabled => TRUE | FALSE,
[auto_drop => TRUE | FALSE,]
[comments => 'комментарий']);
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
|
51
51
52.
Основа PL/SQL часть 2Параметры процедуры CREATE_JOB
job_name - название задания.
job_type - тип задания, один из перечисленных ниже:
STORED_PROCEDURE - хранимая процедура
PLSQL_BLOCK - блок PL/SQL кода
EXECUTABLE - команда операционной системы
job_action - собственно сама задача, в зависимости от
типа задания job_type содержит либо название хранимой
процедуры,
либо
PL/SQL
код,
либо
команду
операционной системы, при этом следует учесть что для
ОС семейства Windows команда должна начинаться с
cmd.exe
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
52
52
53.
Основа PL/SQL часть 2Параметры процедуры CREATE_JOB
start_date - дата старта задания, если не указывается задание стартует немедленно (при условии удовлетворения
текущего времени интервалу повтора)
repeat_interval - интервал повтора, синтаксис указания
интервала повтора рассмотрен ниже
end_date - дата останова задания, позволяет указать до
какого времени выполнять задание
enabled - статус задания (включено или выключено) после
создания
auto_drop - автоматически удалить задание после последнего
выполнения
comments - комментарий
Интервал повтора задания задаётся строкой вида:
'FREQ=частота_запуска;[INTERVAL=интевал_повторений;]
[уточнения;]'
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
53
53
54.
Основа PL/SQL часть 2Интервал повтора процедуры CREATE_JOB
Интервал повтора задания задаётся строкой вида:
'FREQ=частота_запуска;
[INTERVAL=интевал_повторений;][уточнения;]'
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
54
54
55.
Основа PL/SQL часть 2Интервал повтора процедуры CREATE_JOB
FREQ - частота запуска может принять одно из
перечисленных ниже значений:
SECONDLY
- секунда
MINUTELY
- минута
HOURLY
- час
DAIL
- день
WEEKLY
- неделя
MONTHLY
- месяц
YEARLY
- год
INTERVAL
интервал
повторений
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
55
55
56.
Основа PL/SQL часть 2Интервал повтора процедуры CREATE_JOB
Уточнения могут быть следующими:
BYSECOND - в указанную секунду(секунды)
BYMINUTE - в указанную минуту(минуты)
BYHOUR - в указанный час
BYDAY - в указанный день недели:
MON - понедельник
TUE - вторник
WED - среда
THU - четверг
FRI - пятница
SAT - суббота
SUN - воскресенье
BYMONTHDAY - в указанный день месяца
BYYEARDAY - в указанный день года
BYMONTH - в указанный месяц
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
56
56
57.
Основа PL/SQL часть 2Интервал повтора процедуры CREATE_JOB
1. Самый простой вариант - необходимо выполнять
задание каждый час
FREQ=HOURLY;
Задание первый раз выполнится в текущий момент
времени и далее будет повторяться каждый час.
2. Выполнение задания каждые три часа
FREQ=HOURLY;INTERVAL=3;
3. Выполнение задания каждые три часа в 15 минут
FREQ=HOURLY;INTERVAL=3;BYMINUTE=15;BYSECOND=0;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
57
57
58.
Основа PL/SQL часть 2Примеры задания интервалов
4. Выполнение задания по субботам и воскресеньям в 2
часа ночи
FREQ=DAILY;BYDAY=SAT,SUN;BYHOUR=2;
BYMINUTE=0;
5. Выполнение задания осенью по понедельникам,
средам и пятницам каждый час в 17 минут 27 секунд
FREQ=HOURLY;BYMONTH=9,10,11;BYDAY=MON,WED,
FRI;BYMINUTE=17;BYSECOND=27;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
58
58
59.
Основа PL/SQL часть 2Проверка корректности интервала
Для проверки корректности придуманного Вами
интервала
повтора
существует
процедура
EVALUATE_CALENDAR_STRING:
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING(
интервал_повтора,
дата_и_время_старта_задания,
дата_и_время_предыдущего_запуска | NULL,
переменная_в_кот_возвр_время_сл_запуска);
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
59
59
60.
Основа PL/SQL часть 2Процедуры DISABLE и ENABLE
Для прекращения выполнения задания без его удаления
используется процедура:
DBMS_SCHEDULER.DISABLE
(’[схема_данных.]название_задания’,
форсировать_выключение);
форсировать_выключение => TRUE | FALSE
Снова запустить остановленное задание можно при
помощи процедуры:
DBMS_SCHEDULER.ENABLE
('[схема_данных.]название_задания');
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
60
60
61.
Основа PL/SQL часть 2Мониторинг состояния задания
Мониторинг состояния задания удобно осуществлять
при помощи представления DBA_SCHEDULER_JOBS:
SELECT *
FROM DBA_SCHEDULER_JOBS
В этом представлении также можно узнать полный состав
атрибутов задания.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
61
61
62.
Основа PL/SQL часть 2Управление атрибутами задания
DBMS_SCHEDULER.SET_ATTRIBUTE (
name
=>
'[схема_данных.]название_задания',
attribute => 'аттрибут',
value
=> 'значение'
);
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
62
62
63.
Основа PL/SQL часть 2Создание задания в виде
неименованного блока
BEGIN
sys.dbms_scheduler.create_job(job_name =>
‘MY_JOB’,
job_type => ‘PLSQL_BLOCK',
job_action => 'begin insert into
scheduler_log values (seq_schd_log.nextval,
sysdate, ''Мы начинаем!!!''); end;',
job_class => 'DBMS_JOB$',
enabled => true);
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
63
63
64.
Основа PL/SQL часть 2Создание задания для хранимой процедуры
CREATE OR REPLACE PROCEDURE schd_check AS
BEGIN insert into scheduler_log
values (seq_schd_log.nextval, sysdate,
'Теперь и в процедуре :)’);
COMMIT;
END;
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB(job_name => ‘SIMPLE_JOB',
job_type => ‘STORED_PROCEDURE',
job_action => ‘schd_check',
job_class => ‘DBMS_JOB$’,
enabled => true);
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
64
64
65.
Основа PL/SQL часть 2Создание задания с расписанием.
Подбор параметров
DECLARE
next_run_date
TIMESTAMP;
BEGIN
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING (
'FREQ=DAILY; BYDAY=MON,TUE,WED, THU,
FRI ;BYHOUR=7;BYMINUTE=0;’
, SYSTIMESTAMP
, NULL
, next_run_date
) ;
DBMS_OUTPUT.PUT_LINE ( 'next_run_date: ' ||
next_run_date );
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
65
65
66.
Основа PL/SQL часть 2Создания задания с расписанием
BEGIN
sys.DBMS_SCHEDULER.CREATE_JOB
( job_name
=> 'moning_job'
, jobtype
=> 'PLSQL_BLOCK'
, job_action => 'insert into scheduler_log
values (seq_schd_log.nextval, sysdate,
‘Жизнь прекрасна!!!’;’’
, 'FREQ=DAILY; BYDAY=MON,TUE,WED,
THU, FRI ;BYHOUR=7;BYMINUTE=0;’
, enabled
=> TRUE
);
END;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
66
66
67.
Основа PL/SQL часть 2Создание внешнего задания
CONNECT / AS SYSDBA
GRANT CREATE EXTERNAL JOB TO scott;
CONNECT scott/tiger
BEGIN
DBMS_SCHEDULER.CREATE_JOB
( job_name
=> 'simple_job'
, job_type
=> 'EXECUTABLE'
, jobaction => 'cmd.exe /C dir > \temp\out.txt'
, enabled
=> TRUE
);
END;
/
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
67
67
68.
Основа PL/SQL часть 2Скомпанованное задание
Более развитая возможность DBMS_SCHEDULER
позволяет скомпоновать задание из независимых
элементов: программы и расписания.
Причем элементы эти совершенно самостоятельны
и независимы.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
68
68
69.
Основа PL/SQL часть 2Создание программы для заданий
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM
( program_name => 'simple_program'
, program_type => 'STORED_PROCEDURE' ,
program_action => 'schd_check'
, enabled
=> TRUE
);
END;
/
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
69
69
70.
Основа PL/SQL часть 2Создание программы для заданий
При наличии у процедуры параметров при создании программы их количество
потребуется указать особо:
CREATE PROCEDURE schd_last ( schd_name varchar2 ) IS
Last_time date;
BEGIN
select last_time into last_time
from USER_SCHEDULER_PROGRAMS
where job_name= schd_name;
insert into scheduler_log
values (seq_schd_log.next_val, sysdate, ‘Последний раз:’||last_time;
end;
/
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM
( program_name
=> 'simple_program1'
, program_type
=> 'STORED_PROCEDURE'
, program_action
=> 'schd_last'
, enabled
=> FALSE
, number_of_arguments => 1
) ;
END;
/
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
70
70
71.
Основа PL/SQL часть 2Создание программы для заданий
Программа создана «отключенной». Указать фактические
значения параметрам программе во «включенном» состоянии
нельзя.
Последовательность действий будет следующая:
BEGIN
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT
( program_name
=> 'simple_program1'
, argument_position => 1
, argument_name
=> 'schd_name'
, argument_type
=> 'VARCHAR2'
) ;
END;
EXECUTE DBMS_SCHEDULER.ENABLE ( ‘simple_program1')
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
71
71
72.
Основа PL/SQL часть 2Создание расписания
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE
( schedule_name
=> 'simple_schedule'
, start_date
=> SYSDATE
, repeat_interval => ‘FREQ=WEEKLY;
BYDAY=MON, TUE, WED, THU, FRI'
, end_date
=> SYSTIMESTAMP +
INTERVAL'1' MONTH
) ;
END;
/
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
72
72
73.
Основа PL/SQL часть 2Пример скомпонованного задания
BEGIN
DBMS_SCHEDULER.CREATE_JOB
( job_name
=> 'compound_j ob'
, program_name => 'simple_program'
, schedule_name => 'simple_schedule'
, enabled
=> TRUE
);
END;
/
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
73
73
74.
Основа PL/SQL часть 2Пример скомпанованного задания
с параметрами
BEGIN
DBMS_SCHEDULER.CREATE_JOB
( job_name
=> 'compound_job1'
, program_name => 'simple_program1'
, schedule_name => 'simple_schedule'
, enabled
=> FALSE
);
END;
BEGIN
DBMS_SCHEDULER.SET_JOB_ANYDATA_VALUE
( job_name
=> 'compound_job1'
, argument_name => 'schd_name'
, argument_value => ‘simple_program’
END;
EXECUTE DBMS_SCHEDULER.ENABLE ( 'compound_job1' )
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
74
74
75.
Основа PL/SQL часть 2Пакеты в СУБД Oracle
Пакет состоит из двух различных фрагментов кода:
спецификации пакета и тела пакета.
Спецификация:
•содержит описание всех общедоступных элементов пакета, на
которые можно сослаться извне пакета.
•сообщает, что доступно для использования в пакете, и не
содержит никакой информации о реализации пакетных программ
(если вы не добавили поясняющий комментарий).
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
75
75
76.
Основа PL/SQL часть 2Пакеты в СУБД Oracle
Тело пакета:
•содержит весь код, необходимый для реализации элементов,
объявленных в спецификации пакета.
•может также содержать частные элементы, которые не
появляются в спецификации, и, следовательно, на которые нельзя
сослаться извне пакета.
•похоже на самостоятельный раздел объявлений программы. Оно
содержит как объявление переменных, так и описание всех
пакетных программ.
•может также содержать исполняемый раздел, который
называется раздел инициализации, потому что он запускается
только один раз, чтобы инициализировать пакет.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
76
76
77.
Основа PL/SQL часть 2Пакеты в СУБД Oracle. Общий и частный
код
Общий (Public) код объявлен в спецификации пакета и доступен
любой схеме, которая имеет привилегию EXECUTE на пакет
(включая схему, которая владеет пакетом).
Частный (Private) код, напротив, объявлен и является видимым
только внутри пакета. Внешние программы, использующие пакет,
не могут видеть или использовать частный код.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
77
77
78.
Основа PL/SQL часть 2Пакеты в СУБД Oracle. Спецификация
(синтаксис)
CREATE OR REPLACE PACKAGE имя_модуля {IS
AS}
описание_процедуры |
описание_функции |
объявление_переменной |
определение_типа |
объявление_исключительной_ситуации |
объявление_курсора |
END [имя_модуля];
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
78
78
79.
Основа PL/SQL часть 2Пакеты в СУБД Oracle. Тело пакета
(синтаксис)
CREATE OR REPLACE PACKAGE BODY имя_модуля
{IS AS}
код_инициализации_процедуры |
код_инициализации_функции |
END [имя_модуля];
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
79
79
80.
Основа PL/SQL часть 2Пакеты в СУБД Oracle
•Тело модуля не является обязательной частью. Если заголовок
модуля содержит описание, нескольких переменных, типов и курсоров,
то создавать тело модуля нет необходимости.
•Элементы модуля могут указываться в любом порядке. Однако, как и в
разделе объявлений, объект должен быть объявлен до того как на него будут
произведены ссылки. Например, если частью условия WHERE курсора
является некоторая переменная, то она должна быть объявлена до
объявления курсора.
•Присутствие элементов всех видов не обязательно. Например, модуль может
состоять только из объявлений процедур и функций, без
объявления курсоров или типов.
•Объявление процедур и функций должны быть предварительными. В этом
отличие модуля от раздела объявлений блока, где могут находиться как
предварительные объявления, так и реальный код процедур и функций.
Программный код процедур и функций модуля содержится в тексте этого
модуля.
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
80
80
81.
Основа PL/SQL часть 2Пример создания пакета
Спецификация пакета
CREATE OR REPLACE PACKAGE test_pkg IS
PROCEDURE Out_Screen(TOSC IN VARCHAR2);
FUNCTION Add_Two_Num(A IN NUMBER, B IN NUMBER)
RETURN NUMBER;
FUNCTION Min_Two_Num(A IN NUMBER, B IN NUMBER)
RETURN NUMBER;
FUNCTION FACTORIAL(NUM IN NUMBER) RETURN NUMBER;
END test_pkg;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
81
81
82.
Основа PL/SQL часть 2Пример создания пакета
Тело пакета
CREATE OR REPLACE PACKAGE BODY test_pkg IS
PROCEDURE Out_Screen(TOSC IN VARCHAR2)
IS
BEGIN
DBMS_OUTPUT.enable;
DBMS_OUTPUT.put_line(TOSC);
END Out_Screen;
FUNCTION Min_Two_Num(A IN NUMBER, B IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURN (A - B);
END Min_Two_Num;
...
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
82
82
83.
Основа PL/SQL часть 2Пример создания пакета
...
FUNCTION Add_Two_Num(A IN NUMBER, B IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURN (A + B);
END Add_Two_Num;
FUNCTION FACTORIAL(NUM IN NUMBER) RETURN NUMBER
IS
BEGIN
IF (NUM <=1) THEN
RETURN (NUM);
ELSE
RETURN (NUM * FACTORIAL(NUM-1));
END IF;
END FACTORIAL;
END test_pkg;
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
83
83
84.
Успехов в освоениикурса
Савченко Наталья Александровна
savchenko.n@gubkin.ru
http://www.fdo.gubkin.ru
Российский государственный университет нефти и газа (НИУ) имени И.М.Губкина
ФАКУЛЬТЕТ КОМПЛЕКСНОЙ БЕЗОПАСНОСТИ ТЭК
84
programming