Слайд 1Язык программирования ORACLE PL/SQL
Учебные материалы ИВЦ АИС
Слайд 2Язык программирования PL/SQL
Содержание курса. (1)
Общий обзор PL/SQL
Что такое PL/SQL и
зачем он нужен
Архитектура PL/SQL
Основы PL/SQL
Слайд 3Язык программирования PL/SQL
Содержание курса. (2)
Взаимодействие с ORACLE
Подпрограммы
Пакеты
Хранимые функции в SQL-операторах
Слайд 4Язык программирования PL/SQL
Содержание курса. (3)
PL/SQL в триггерах базы данных
PL/SQL в SQL*Plus
PL/SQL
в ORACLE*Forms
Стандартные пакеты
Повторение. Ключевые компоненты PL/SQL
Слайд 6Язык программирования PL/SQL
Что такое PL/SQL ?
процедурное расширение языка SQL
полноценный процедурный
язык
не самостоятельный продукт
технология, включающая механизм PL/SQL
этот механизм встраивается в ядро RDBMS (СУБД) или в любое инструментальное средство Oracle
Слайд 7Язык программирования PL/SQL
анонимный блок
хранимую процедуру (функцию) в RDBMS
процедуру (функцию) в хранимом
пакете
триггер базы данных
библиотечную процедуру (функцию)
триггер в инструментальном средстве ORACLE
PL/SQL - программа может представлять собой:
Слайд 8Язык программирования PL/SQL
История PL/SQL
v 1.0. - Oracle 6 (SQL*Plus и SQL*Forms)
v
1.1.-Developer/2000
v 2.0.-Oracle 7.0
и Developer/2000 r.2.1
v 2.1.-Oracle 7.1
v 2.2.-Oracle 7.2
v 2.3.-Oracle 7.3
v 3.0 - Oracle 8 !
Слайд 10Язык программирования PL/SQL
DECLARE
CURSOR curs IS
SELECT A,B,C FROM
SQRTS ORDER BY A;
D NUMBER;
Z NUMBER;
X01 NUMBER;
X02 NUMBER;
STR VARCHAR2(55);
BEGIN
FOR K IN curs LOOP
D := K.B*K.B - 4*K.A*K.C;
Z := 2*K.A;
STR := 'A='||TO_CHAR(K.A,'09.99')’||
’, B='||TO_CHAR(K.B,'09.99')||
', C='||TO_CHAR(K.C,'09.99')||' : ';
X01 := (-K.B - SQRT(D))/Z;
X02 := (-K.B + SQRT(D))/Z;
INSERT INTO TEMP
(NUM_COL1,NUM_COL2,CHAR_COL)
VALUES (X01,X02,STR);
COMMIT;
END LOOP;
EXCEPTION
WHEN ZERO_DIVIDE THEN
STR := STR||'Это не квадратное уравнение';
INSERT INTO TEMP (CHAR_COL) VALUES (STR);
WHEN VALUE_ERROR THEN
STR := STR||'Действительных корней нет';
INSERT INTO TEMP (CHAR_COL) VALUES (STR);
END;
Слайд 11Язык программирования PL/SQL
Блочная структура
[DECLARE
]
BEGIN
[EXCEPTION
]
END;
Слайд 12Язык программирования PL/SQL
Переменные и константы
Объявление переменных:
X01 NUMBER(9);
X02 NUMBER DEFAULT 5.1;
STR VARCHAR(55);
PI
CONSTANT REAL := 3.14158265;
Слайд 13Язык программирования PL/SQL
Переменные и константы
2 способа присвоить значение переменной:
1) x02 :=
x01 * 10;
2) SELECT a*10.3 INTO x02
FROM sqrts WHERE b = 0;
Слайд 14Язык программирования PL/SQL
Атрибуты переменных
%TYPE
%ROWTYPE
DECLARE
x01 NUMBER(9);
x02 x01%TYPE;
str scott.temp.char_col%TYPE;
CURSOR c1 IS SELECT a,b,c FROM sqrts;
c_emp c1%ROWTYPE;
...
Слайд 15Язык программирования PL/SQL
Управляющие структуры
IF-THEN-ELSE;
FOR-LOOP;
WHILE-LOOP;
EXIT-WHEN;
GOTO
Слайд 16Язык программирования PL/SQL
Понятие курсора
ORACLE использует
рабочую приватную
область
для выполнения
SQL -
оператора
Курсор - механизм,
позволяющий
манипулировать
информацией
из этой области
Слайд 17Язык программирования PL/SQL
Понятие курсора
CLOSE
Слайд 18Язык программирования PL/SQL
Обработка ошибок
PL/SQL позволяет легко обнаруживать и обрабатывать как
предопределенные, так и определенные пользователем ошибочные условия, которые называются исключениями
Слайд 19Язык программирования PL/SQL
Обработка ошибок
Исключения:
предопределенные (возбуждаются неявно)
определенные пользователем (должны быть определены явно
и возбуждаются оператором RAISE)
Слайд 20Язык программирования PL/SQL
Модульность PL/SQL
2 типа подпрограмм PL/SQL:
процедуры
функции
возможность объединения в пакет
Слайд 21Язык программирования PL/SQL
Модульность PL/SQL
PROCEDURE имя_процедуры
(параметр1 ТИП,
параметр2 ТИП...) IS
BEGIN
[EXCEPTION
исключений>]
END;
Слайд 22Язык программирования PL/SQL
Архитектура PL/SQL
В ORACLE - server:
Слайд 23Язык программирования PL/SQL
Архитектура PL/SQL
В ORACLE - tools:
Слайд 25Язык программирования PL/SQL
Набор символов
В PL/SQL можно использовать:
буквы A .. Z, a
.. z
цифры 0 .. 9
табуляцию, пробел, символ возврата каретки
символы ( ) + - * / < > = ! ~ ; : . ‘ @ % , “ # $ ^ & _ | { } ? [ ]
в символьных строках допускается использование кириллицы (русские буквы)
Слайд 26Язык программирования PL/SQL
Лексические единицы
Разделители:
простые
составные
Идентификаторы
Литералы
Комментарии
Слайд 27Язык программирования PL/SQL
Зарезервированные слова PL/SQL:
ABORT COLAUTH
ELSE LEVEL PRIVATE SQLERRM
ACCEPT COLUMNS ELSIF LIKE PROCEDURE START
ACCESS COMMIT END LIMITED PUBLIC STATEMENT
ADD COMPRESS ENTRY LOOP RAISE STDDEV
ALL CONNECT EXCEPTION MAX RANGE SUBTYPE
ALTER CONSTANT EXCEPTION_INIT MIN REAL SUM
AND COUNT EXISTS MINUS RECORD TABAUTH
ANY CRASH EXIT MLSLABEL RELEASE TABLE
ARRAY CREATE FALSE MOD REM TABLES
ARRAYLEN CURRENT FETCH NATURAL RENAME TASK
AS CURSOR FLOAT NEW RESOURCE TERMINATE
ASC CURRVAL FOR NEXTVAL RETURN THEN
ASSERT DATABASE FORM NOCOMPRESS REVERSE TO
ASSIGN DATA_BASE FROM NOT REVOKE TRUE
AT DATE FUNCTION NULL ROLLBACK TYPE
AUTHORIZATION DBA GENERIC NUMBER ROWID UNION
AVG DEBUGOFF GOTO NUMBER_BASE ROWLABEL UNIQUE
BASE_TABLE DEBUGON GRANT OF ROWNUM UPDATE
BEGIN DECLARE GROUP ON ROWTYPE USE
BETWEEN DECIMAL HAVING OPEN RUN VALUES
BINARY_INTEGER DEFAULT IDENTIFIED OPTION SAVEPOINT VARCHAR
BODY DEFINITION IF OR SCHEMA VARCHAR2
BOOLEAN DELAY IN ORDER SELECT VARIANCE
BY DELETE INDEX OTHERS SEPARATE VIEW
CASE DELTA INDEXES OUT SET VIEWS
CHAR DESC INDICATOR PACKAGE SIZE WHEN
CHAR_BASE DIGITS INSERT PARTITION SMALLINT WHERE
CHECK DISPOSE INTEGER PCTFREE SPACE WHILE
CLOSE DISTINCT INTERSECT POSITIVE SQL WITH
CLUSTER DO INTO PRAGMA SQLCODE WORK
CLUSTERS DROP IS PRIOR SQLERRM XOR
(~ 200 слов)
Слайд 28Язык программирования PL/SQL
Комментарии
-- это однострочный комментарий
/* это многострочный
комментарий */
Нельзя вкладывать
комментарии
друг в друга !
Слайд 29Язык программирования PL/SQL
Типы данных
специфицируют
формат хранения
констант и переменных
Слайд 30Язык программирования PL/SQL
Предопределенные
типы данных
Слайд 31Язык программирования PL/SQL
Категория NUMBER
Слайд 32Язык программирования PL/SQL
Категория CHARACTER
Слайд 33Язык программирования PL/SQL
Типы данных
Тип DATE:
от 01 января 14712 г. до н.э.
до
31 декабря 314712 г. н.э.
Тип BOOLEAN:
TRUE
FALSE
NULL
Слайд 34Язык программирования PL/SQL
Типы данных
Подтипы
Стандартные:
SUBTYPE POSITIVE IS BINARY_INTEGER RANGE 1..2147483647;
Скалярные подтипы пользователя:
SUBTYPE
My_Typ IS BINARY_INTEGER RANGE 1..50;
SUBTYPE My_Typ IS NUMBER(12,5);
Слайд 35Язык программирования PL/SQL
Преобразование типов данных
Слайд 36Язык программирования PL/SQL
Неявные преобразования типов
позволяет использовать литералы, переменные и параметры одного
типа там, где ожидается другой
Слайд 37Объявления переменных, констант, курсоров
Слайд 38Язык программирования PL/SQL
программа хранит значения в переменных и константах;
значения констант не
могут изменяться;
Все переменные, константы и курсоры должны быть объявлены в декларативной части блока;
при объявлении можно присвоить начальное значение и определить ограничение NOT NULL.
Переменные, константы, курсоры
Слайд 39Язык программирования PL/SQL
Примеры:
birthdate DATE;
emp_count SMALLINT := 0;
sal_ma NUMBER(12.2) DEFAULT
1200.00;
acct_id VARCHAR2(5) NOT NULL:='AP001';
pi CONSTANT REAL := 3.14159;
radius REAL := 1;
area REAL := pi*radius**2;
Слайд 40Язык программирования PL/SQL
Атрибут %TYPE
позволяет ссылаться на:
тип данных ранее объявленной переменной;
существующий столбец
базы данных.
credit REAL(7,2);
debit credit%TYPE;
my_dname scott.dept.dname%TYPE;
balance NUMBER(7,2);
minimum_balance balance%TYPE:=10.00;
Слайд 41Язык программирования PL/SQL
Упражнения
№ 1-1
№ 1-2
№ 1-3
№ 1-4
Слайд 42Язык программирования PL/SQL
Атрибут %ROWTYPE.
определяет тип записи, представляющей строку в таблице,
представлении или в курсоре:
DECLARE
emp_rec emp%ROWTYPE;
CURSOR c1 IS SELECT deptno, dname, loc
FROM dept;
dept_rec c1%ROWTYPE;
...
Слайд 43Язык программирования PL/SQL
DECLARE
dept_rec1 dept%ROWTYPE;
dept_rec2 dept%ROWTYPE;
TYPE DeptRecTyp IS RECORD
(deptno NUMBER(2)
NOT NULL := 20,
dname dept.dname%TYPE,
loc dept.loc%TYPE);
dept_rec3 DeptRecTyp;
CURSOR c1 IS SELECT deptno, dname, loc
FROM dept;
dept_rec4 c1%ROWTYPE;
BEGIN
SELECT deptno, dname, loc
INTO dept_rec1 FROM dept
WHERE rownum=1;
OPEN c1;
FETCH c1 INTO dept_rec3;
CLOSE c1;
dept_rec2 := dept_rec1;
...
END;
Слайд 44Язык программирования PL/SQL
DECLARE
CURSOR my_cursor IS
SELECT sal+NVL(comm,0) wages, ename
FROM emp;
my_rec my_cursor%ROWTYPE;
BEGIN
OPEN my_cursor;
LOOP
FETCH my_cursor INTO my_rec;
EXIT WHEN my_cursor%NOTFOUND;
IF my_rec.wages > 2000 THEN
INSERT INTO temp VALUES
(null,my_rec.wages,my_rec.ename);
END IF;
END LOOP;
CLOSE my_cursor;
END;
Слайд 45Язык программирования PL/SQL
Составной тип RECORD.
%ROWTYPE фактически объявляет переменную типа RECORD;
можно объявить
переменную типа RECORD явно, например:
Слайд 46Язык программирования PL/SQL
Составной тип RECORD.
DECLARE
TYPE Address IS RECORD
(town
VARCHAR2(40),
street VARCHAR2(40,
post_box NUMBER(12));
TYPE DeptRecTyp IS RECORD
(deptno NUMBER(2) NOT NULL := 20,
dname dept.dname%TYPE,
loc dept.loc%TYPE,
adr Address );
dept_rec3 DeptRecTyp;
...
Слайд 47Язык программирования PL/SQL
Составной тип RECORD.
Для обращения к элементам переменной типа RECORD
используются
квалифицированные ссылки, например:
dept_rec3.adr.town := ‘МОСКВА’;
Слайд 48Язык программирования PL/SQL
Область действия переменных
Внешняя переменная x:
Слайд 49Язык программирования PL/SQL
Область действия переменных
Внутренняя переменная x:
Слайд 50Язык программирования PL/SQL
Порядок выполнения операторов
**, NOT
+, -
*, /
+, -,
||
=, !=, <, >, <=, >=, IS NULL, LIKE, BETWEEN, IN
AND
OR
скобки изменяют
порядок вычисления выражений
Слайд 52Язык программирования PL/SQL
Логические выражения и операторы сравнения
В PL/SQL логическая
(булевская)переменная может
принимать
одно из трех значений:
TRUE
FALSE
NULL
Слайд 53Язык программирования PL/SQL
Логические выражения и операторы сравнения
FALSE AND NULL = FALSE
TRUE
OR NULL = TRUE
NOT NULL = NULL
Булевскому значению всегда равен результат операции сравнения.
Кроме обычных операторов сравнения используются
LIKE,
BEETWEN,
IN,
IS NULL
Слайд 54Язык программирования PL/SQL
Условные операторы
IF условие THEN
;
END
Слайд 55Язык программирования PL/SQL
Условные операторы
IF условие THEN
;
ELSE
<последовательность операторов 2>;
END IF;
IF-THEN-ELSE:
Слайд 56Язык программирования PL/SQL
Условные операторы
IF условие 1 THEN
;
ELSIF
условие 2 THEN
<последовательность операторов 2>;
ELSE
<последовательность операторов 3>;
END IF;
IF-THEN-ELSIF:
Слайд 57Язык программирования PL/SQL
Бесконечный цикл:
LOOP
;
END LOOP;
Циклы
Слайд 58Язык программирования PL/SQL
Цикл с предусловием:
WHILE LOOP
;
END LOOP;
Циклы
Слайд 59Язык программирования PL/SQL
Циклы
Цикл FOR:
FOR
IN [REVERSE] ..
LOOP
<последовательность
операторов>;
END LOOP;
Слайд 60Язык программирования PL/SQL
Цикл FOR с курсором
DECLARE
CURSOR [(список параметров)] IS
SELECT ... ;
BEGIN
...
FOR <запись> IN <курсор>[(параметры)] LOOP
...
END LOOP;
END;
Слайд 61Язык программирования PL/SQL
Операторы GOTO и NULL
BEGIN
...
GOTO insert_row;
...
INSERT INTO emp VALUES ...
...
END;
Слайд 62Язык программирования PL/SQL
Упражнения
№ 4-1
№ 4-2
№ 4-3
Слайд 63Язык программирования PL/SQL
Встроенные функции
Все встроенные (built-in) функции, используемые в SQL, за
исключением DECODE, доступны также в PL/SQL
Функции SQLCODE и SQLERRM доступны только в PL/SQL.
Слайд 64Язык программирования PL/SQL
Тип данных RECORD
2 способа объявления переменной типа RECORD:
Использование атрибута
%ROWTYPE
имя_переменной{курсор%ROWTYPE|
таблица%ROWTYPE|
схема.таблица%ROWTYPE };
Слайд 65Язык программирования PL/SQL
Тип данных RECORD
TYPE имя_типа IS RECORD
(имя_поля1 {тип_поля |
переменная%TYPE |
таблица.столбец%TYPE |
таблица%ROWTYPE}
[NOT NULL],...);
имя_переменной имя_типа;
Объявление собственного типа RECORD:
Слайд 66Язык программирования PL/SQL
Новый тип данных PL/SQL - Tables (отличие от v.1.0)
Что
это за тип ?
Объявление таблиц PL/SQL
Обращение к таблицам PL/SQL
Извлечение строк из БД в таблицу PL/SQL и из таблицы PL/SQL в БД
Удаление данных из таблицы PL/SQL
Слайд 67Язык программирования PL/SQL
Тип данных PL/SQL Table
Составной тип данных, моделирующий таблицы БД
Состоит
из одного столбца и одного первичного ключа (индекса)
Столбец может принадлежать любому скалярному типу (для версий ниже 2.3)
Тип первичного ключа всегда BINARY_INTEGER или один из его подтипов
Появился в PL/SQL версии 2.0
Слайд 68Язык программирования PL/SQL
Объявление таблиц PL/SQL
Таблицы PL/SQL объявляются за два шага:-
-- Объявить
тип
-- “Таблица PL/SQL”:
TYPE имя_типа IS TABLE OF
{тип_столбца|переменная%TYPE| таблица.столбец%TYPE }
[NOT NULL] INDEX BY
BINARY_INTEGER;
-- Объявить таблицы PL/SQL
-- этого типа:
имя_переменной имя_типа;
Слайд 69Язык программирования PL/SQL
Объявление таблиц PL/SQL. Пример
DECLARE
TYPE EnameTabTyp
IS TABLE
OF CHAR(10)
INDEX BY BINARY_INTEGER;
ename_tab EnameTabTyp;
Слайд 70Язык программирования PL/SQL
Обращение к таблицам PL/SQL
подобно обращению к элементу массива:
имя_таблицы_plsql(знач_первичн_ключа)
присвоение значения строке таблицы: имя_таблицы_plsql(знач_первичн_ключа) := выражение_plsql;
ename_tab(3)
ename_tab(-5)
sal_tab(5) := salary + increase;
Слайд 71Язык программирования PL/SQL
Извлечение строк из БД в таблицу PL/SQL
удобно использовать цикл
FOR с курсором
Слайд 72Язык программирования PL/SQL
DECLARE
TYPE EnameTabTyp IS TABLE OF emp.ename%TYPE
INDEX BY BINARY_INTEGER;
TYPE SalTabTyp IS TABLE OF emp.sal%TYPE
INDEX BY BINARY_INTEGER;
ename_tab EnameTabTyp;
sal_tab SalTabTyp;
i BINARY_INTEGER := 0;
...
BEGIN
-- загрузить имена и оклады сотрудников
-- в таблицы PL/SQL
FOR emprec IN (SELECT ename, sal FROM emp) LOOP
i := i + 1;
ename_tab(i) := emprec.ename;
sal_tab(i) := emprec.sal;
END LOOP;
-- обработать таблицы
process_sals(ename_tab, sal_tab);
...
END;
Слайд 73Язык программирования PL/SQL
Удаление данных из таблицы PL/SQL
Присвоение пустой таблицы PL/SQL такого
же типа
(для версий 2.3 и выше) - функция DELETE
Слайд 74Язык программирования PL/SQL
Усовершенствования PL/SQL Table
для версии 2.3
В качестве типа столбца
таблицы PL/SQL теперь допускается использование составного типа RECORD
Специально для работы с PL/SQL - таблицами в версию 2.3 включены новые функции.
Слайд 75Язык программирования PL/SQL
Функции v2.3 для PL/SQL Table:
COUNT
DELETE
EXIST
FIRST
LAST
NEXT
PRIOR
Слайд 76Язык программирования PL/SQL
Функции v2.3 для PL/SQL Table:
COUNT
DELETE
EXIST
FIRST
LAST
NEXT
PRIOR
Найти количество определенных
в настоящий
момент элементов :
total_rows := emp_table.COUNT;
Слайд 77Язык программирования PL/SQL
Функции v2.3 для PL/SQL Table:
COUNT
DELETE
EXISTS
FIRST
LAST
NEXT
PRIOR
Удалить один или больше элементов
из PL/SQL - таблицы:
names_tab.DELETE; -- все строки
names_tab.DELETE(85); -- 85-ю стр
-- строки от -120 до 5:
names_tab.DELETE(-120,5);
Слайд 78Язык программирования PL/SQL
Функции v2.3 для PL/SQL Table:
COUNT
DELETE
EXISTS
FIRST
LAST
NEXT
PRIOR
Определить, существует ли
элемент таблицы
с заданным значением индекса:
IF emp_table.EXISTS(5) THEN ...
Слайд 79Язык программирования PL/SQL
Функции v2.3 для PL/SQL Table:
COUNT
DELETE
EXIST
FIRST
LAST
NEXT
PRIOR
Найти наименьшее
значение индекса,для которого
определен элемент таблицы :
first_row := eployee_table.FIRST;
Слайд 80Язык программирования PL/SQL
Функции v2.3 для PL/SQL Table:
COUNT
DELETE
EXIST
FIRST
LAST
NEXT
PRIOR
Найти наибольшее
значение индекса,для которого
определен элемент таблицы :
last_row := eployee_table.LAST;
Слайд 81Язык программирования PL/SQL
Функции v2.3 для PL/SQL Table:
COUNT
DELETE
EXIST
FIRST
LAST
NEXT
PRIOR
Найти индекс
следующего элемента:
next_index :=
eployee_table.NEXT(curr_index);
Слайд 82Язык программирования PL/SQL
Функции v2.3 для PL/SQL Table:
COUNT
DELETE
EXIST
FIRST
LAST
NEXT
PRIOR
Найти индекс предыдущего элемента:
prev_index :=
employee_table.PRIOR(curr_index);
Слайд 83Язык программирования PL/SQL
Упражнения
№№ 3-2, 3-3, 3-4
№ 3-1
Слайд 85Язык программирования PL/SQL
Поддержка SQL
Слайд 86Язык программирования PL/SQL
Управление курсором
Объявление курсора
OPEN - Открыть курсор
(без параметров
или
с параметрами)
FETCH - Извлечь данные
CLOSE - Закрыть курсор
FOR UPDATE - Извлечь
данные для их
изменения
Слайд 87Язык программирования PL/SQL
Атрибуты курсора
%NOTFOUND
%FOUND
%ISOPEN
%ROWCOUNT
Слайд 88Язык программирования PL/SQL
Объявление курсора
БЕЗ ПАРАМЕТРОВ
DECLARE
CURSOR имя_курсора IS
SELECT
... FROM ... WHERE ... ;
...
С ПАРАМЕТРАМИ
CURSOR имя_курсора(param ТИП) IS
SELECT ... FROM ... WHERE col>parаm ;
Слайд 89Язык программирования PL/SQL
Открытие курсора
БЕЗ ПАРАМЕТРОВ:
OPEN имя_курсора;
С ПАРАМЕТРАМИ:
OPEN имя_курсора(значения парам.);
Слайд 90Язык программирования PL/SQL
Извлечение данных из курсора
OPEN имя_курсора;
LOOP
FETCH имя_курсора INTO
приемник;
EXIT WHEN имя_курсора%NOTFOUND;
...
END LOOP;
CLOSE имя_курсора;
Слайд 91Язык программирования PL/SQL
Изменение выбранных из курсора строк
DECLARE
CURSOR c1 IS
SELECT empno, sal FROM emp
WHERE job = 'SALESMAN' AND comm > sal FOR UPDATE;
...
BEGIN
FOR rec IN c1 LOOP
...
UPDATE emp SET sal = new_sal
WHERE CURRENT OF c1;
END LOOP;
...
END;
Слайд 93Язык программирования PL/SQL
Внутренние исключения с предопределенными именами
Внутренние исключения, не имеющие предопределенного
имени
Определенные пользователем исключения
Пользовательский код ошибки
Возбуждение исключения
Порядок распространения исключения
Вторичное возбуждение исключения
Возбуждение исключения в декларативном разделе
Возбуждение исключения при обработке исключений
Использование SQLCODE и SQLERRM
Необработанные исключения
Слайд 94Язык программирования PL/SQL
Обработка исключений
Исключение (EXCEPTION) в PL/SQL - это условие, приведшее
к ошибке или предупреждению.
Исключения могут быть внутренними или определяться пользователем.
Слайд 95Язык программирования PL/SQL
Внутренние исключения с предопределенными именами
Слайд 96Язык программирования PL/SQL
Внутренние исключения, не имеющие предопределенного имени
DECLARE
имя_исключения EXCEPTION;
PRAGMA EXCEPTION_INIT
(имя_исключения,
код_ошибки_ORACLE);
...
Слайд 97Язык программирования PL/SQL
-- Пример: включить собственную обработку ошибки
-- с кодом
-1013 (недостаточно привилегий)
-- в PL/SQL - блок:
DECLARE
insufficient_privileges EXCEPTION;
PRAGMA EXCEPTION_INIT(
insufficient_privileges, -1031);
BEGIN
...
EXCEPTION
WHEN insufficient_privileges THEN
<действия по обработке ошибки ORA-1031>
WHEN OTHERS THEN
<действия по обработке всех неописанных
исключений>
END;
Слайд 98Язык программирования PL/SQL
Исключения, определенные пользователем
DECLARE
имя_исключения EXCEPTION;
...
BEGIN
...
IF ... THEN
RAISE имя_исключения;
END IF;
EXCEPTION
WHEN имя_исключения THEN
...
END;
Слайд 99Язык программирования PL/SQL
Пользовательский код ошибки
Используйте встроенную процедуру
PROCEDURE RAISE_APPLICATION_ERROR(код_ошибки IN NUMBER, строка_сообщения
IN VARCHAR2)
код ошибки - от -20000 до -20999,
Слайд 100Язык программирования PL/SQL
Пользовательский код ошибки
CREATE TRIGGER SAVE_PRESIDENT
BEFORE DELETE ON EMP
FOR EACH
ROW
WHEN (OLD.JOB='ПРЕЗИДЕНТ')
BEGIN
RAISE_APPLICATION_ERROR(-20005,
'НЕ ТАК ПРОСТО УВОЛИТЬ ПРЕЗИДЕНТА');
END;
Слайд 101Язык программирования PL/SQL
Подпрограммы
Общие правила написания процедур и функций
Где используются подпрограммы PL/SQL
Параметры
PL/SQL-подпрограмм
Создание хранимых подпрограмм
Слайд 102Язык программирования PL/SQL
Подпрограммы
поименованные PL/SQL - блоки, могут получать и возвращать параметры:
процедуры
функции
имеют
разделы:
DECLARATION (декларативный)
EXECUTABLE (выполняемый)
EXEPTION-HANDLING (обработчик исключений)
Слайд 103Язык программирования PL/SQL
Процедуры:
PROCEDURE имя [(параметр
[,параметр, ...])]
IS
[локальные объявления]
BEGIN
исполняемые предложения
[EXCEPTION
обработчики исключений]
END [имя];
Слайд 104Язык программирования PL/SQL
Функции:
FUNCTION имя [(параметр
[,параметр, ...])]
RETURN
тип_возвращаемого_
значения
IS
[локальные объявления]
BEGIN
исполняемые предложения
[EXCEPTION
обработчики исключений]
END [имя];
Слайд 105Язык программирования PL/SQL
Параметры PL/SQL - подпрограмм
имя_переменной [IN|OUT|IN OUT]
тип_данных
[{:=|DEFAULT} значение];
Спецификатор типа данных в
заголовке процедуры не может
иметь ограничений
Слайд 106Язык программирования PL/SQL
Создание
хранимых подпрограмм
Чтобы создать хранимую подпрограмму, достаточно перед текстом
подпрограммы вставить команду CREATE или CREATE OR REPLACE, и выполнить полученный скрипт в среде SQL*Plus
Слайд 107Язык программирования PL/SQL
Пакеты
Пакет - это собрание различных PL/SQL - объектов, среди
которых могут быть:
Курсоры
Переменные
Константы
Имена исключений
Описания типов данных (записей и таблиц PL/SQL)
Процедуры
Функции
Слайд 108Язык программирования PL/SQL
Преимущества пакетов:
Принцип перегрузки (возможность создания в одном пакете нескольких
подпрограмм с одинаковыми именами, но разным количеством и/или типами параметров).
Сохранение значений пакетных переменных на протяжении сессии
Слайд 109Язык программирования PL/SQL
Структура пакета
Спецификация содержит определения всех элементов пакета, на
которые можно ссылаться извне пакета:
PACKAGE имя_пакета
IS
[объявления переменных
и типов]
[спецификации курсоров]
[спецификации модулей]
END [имя_пакета];
Слайд 110Язык программирования PL/SQL
Структура пакета
Тело пакета содержит программный код всех элементов
пакета:
PACKAGE BODY имя_пакета
IS
[объявления переменных и типов]
[спецификации
и операторы SELECT курсоров]
[спецификации и текст модулей]
[BEGIN
выполняемые операторы]
[EXCEPTION
обработчики исключений]
END [имя_пакета]
Слайд 111Язык программирования PL/SQL
Обращение к элементам пакета
Для обращения к элементам пакета используются
квалифицированные имена:
sp_timer.show_elapsed
system.sp_timer.show_elapsed
Слайд 112Язык программирования PL/SQL
Хранимые PL/SQL - функции в SQL-операторах
“Одиночные” функции в SQL-операторах
Пакетные
функции в SQL-операторах.
Прагма RESTRICT_REFERENCES
PRAGMA
RESTRICT_REFERENCES (имя_функции,
WNDS [,WNPS] [,RNDS] [,RNPS])
Слайд 113Язык программирования PL/SQL
Пакетные функции в SQL-операторах. Пример
PACKAGE my_package
IS
FUNCTION my_func(
param_1 IN VARCHAR2)
RETURN NUMBER;
PRAGMA RESTRICT_REFERENCES
(my_func, WNDS, RNDS);
END my_package;
Слайд 114Язык программирования PL/SQL
Использование PL/SQL в триггерах базы данных
Параметры триггера
Доступ к значениям
столбцов
Условные предикаты
Обработка ошибок в триггерах
Ограничения
Слайд 115Язык программирования PL/SQL
Синтаксис создания триггера
CREATE [OR REPLACE] TRIGGER имя_триггера
{BEFORE|AFTER}
{[DELETE][OR INSERT][OR UPDATE]}
ON имя_таблицы
[REFERENCING {new|old} AS псевдоним]
[FOR EACH ROW
[WHEN (условие) ]]
DECLARE
<объявления>
BEGIN
<блок PL/SQL>
END;
Слайд 116Язык программирования PL/SQL
Включение/выключение триггеров
ALTER TRIGGER имя_триггера
{DISABLE |
ENABLE};
ALTER TABLE имя_таблицы
{DISABLE | ENABLE}
ALL TRIGGERS;
Слайд 117Язык программирования PL/SQL
Параметры триггера
BEFORE / AFTER
DELETE, INSERT, UPDATE
FOR EACH
ROW
WHEN - (для FOR EACH ROW)
REFERENCING
Слайд 118Язык программирования PL/SQL
Доступ к значениям столбцов
корреляционные имена:
:NEW.имя_столбца - новое значение;
:OLD.имя_столбца -
старое значение.
Слайд 119Язык программирования PL/SQL
Условные предикаты
INSERTING
DELETING
UPDATING
Слайд 120Язык программирования PL/SQL
12 типов триггеров
только команды DML
ограничено использование LONG и
LONG RAW
триггер AFTER … FOR EACH ROW при
создании журнала моментальных копий
при откате не восстанавливаются значения
переменных пакета;
Не пишите триггеров, зависящих от порядка
обработки строк командой SQL;
(Измененная таблица).
(Защищенная таблица).
Обработка ошибок в триггерах
Ограничения