Метки
Метка PL/SQL – это способ наименования некоторого фрагмента программы
Формат метки - <<идентификатор>>
С помощью метки можно указать имя анонимного блока (на время его выполнения):
<<outerblock>> DECLARE v_counter integer:=0; BEGIN … DECLARE v_cunter INTEGER:=1; BEGIN IF v_counter =outoblock.v_counter THEN … END IF; END; END;
<<insert_but_ignore_dups>> BEGIN INSERT INTO catalog VALUES (…); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN NULL; END;
Без метки невозможно различить переменные с одинаковым именем.
Оператор GOTO
Оператор GOTO позволяет переходить к месту метки, но нельзя производить переход из предшествующих блоков, условных операторов в последующий блок
DECLARE v_Status NUMBER := 1; BEGIN IF v_Status = 1 THEN GOTO mybranch; ELSE v_Status := 1; END IF; <<mybranch>> NULL; END;
BEGIN ... GOTO insert_row; ... <<insert_row>> INSERT INTO EMPLOYEES VALUES ... END;
Оператор EXIT
Оператор EXIT - Позволяет выйти из цикла или перейти в целевую точку выхода обозначенную меткой.
BEGIN <<outer_loop>> LOOP LOOP EXIT outer_loop WHEN …; END LOOP; END LOOP; END;
CREATE OR REPLACE FUNCTION exitfunc(p_pass_string VARCHAR2) RETURN NUMBER IS v_len Number := 1; BEGIN WHILE len <= LENGTH(p_PASS_STRING) LOOP v_len := v_len + 1; EXIT WHEN SUBSTR(p_PASS_STRING,v_len,1) = ' '; END LOOP; RETURN v_len ; END;
Обработка исключений
В языке PL/SQL ошибки всех видов интерпретируются как исключения, к ним относятся:
PL/SQL перехватывает ошибки и реагирует на них при помощи обработчиков исключений. Механизм функционирования обработчиков исключений позволяет чётко определить код обработки ошибок от исполняемых операторов, позволяющему реализовать обработку ошибок управляемую событием.
Пример вызова исключения
DECLARE v_lname VARCHAR2(15); BEGIN SELECT cust_last_name INTO v_lname FROM customers WHERE cust_first_name=‘Мария’; DBMS_OUTPUT.PUT_LINE(‘Фамилия Марии : ’||v_lname); EXCEPTION WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE(‘Возвращается слишком много значений.’) END;
Когда происходит ошибка, выполнение исполняемого блока прерывается и управление передаётся отдельному разделу исключения в текущем блоке.
Исключение может быть вызвано из кода программы: RAISE TOO_MANY_ROWS; Выполнение кода прервётся и управление перейдёт в блок исключений.
Ошибки предопределённые сервером ORACLE
Директивы компилятора
Псевдоинструкция, которая передаёт некоторую информацию компилятору и при трансляции не включается в исполняемый код.
Синтаксис – PRAGMA директива:
Создание имени для исключений
Пользователь может задать имя для встроенного исключения при помощи директивы exeption_init
Пример:
DECLARE e_no_such_sequence EXEPTION; PRAGMA EXCEPTION_INIT(e_no_such_sequence,-2289); BEGIN … … EXCEPTION WHEN e_no_such_sequence THEN … END;
Автономные транзакции
Автономные транзакции – это возможность выполнять и затем сохранять или отменять инструкции DML (Data Manipulation Language – язык манипулирования данными) INSERT, UPDATE и DELETE безотносительно к основной транзакции сеанса.
Пример – механизм регистрации ошибок
PROCEDURE write_log( p_code IN INTEGER, p_text IN VARCHAR2) IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO log VALUES(p_code, p_text, USER, SYSDATE); COMMIT; END;
Inline-подстановка в PL/SQL
На этапе выполнения кода происходит подстановка тела функции вместо вызова
BEGIN PRAGMA INLINE(my_func, 'YES'); -- включаем подстановку for f in (select * from employees) loop x:= my_func(f.Name, f.amount) + 17; -- не вызов, а тело -- функции! end loop; PRAGMA INLINE(my_func, 'NO'); -- выключаем подстановку … END;
Права создателя и права вызывающего
Пример программы, которая выполняется с правами вызывающего:
CREATE OR REPLACE PROCEDURE runddl (p_ddl_in IN VARCHAR2) AUTHID CURRENT_USER IS BEGIN EXECUTE IMMEDIATE p_ddl_in; END;
Рекомендуемая литература:
Контакты:
СПАСИБО ЗА ВНИМАНИЕ!
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.