Введение в язык запросов PL/SQL. Способы работы с языком PL/SQL. Пользовательские и системные функции языка, выражения, идентификаторы, ключевые слова, страница 3

Метки

Метка 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;

  • Увеличение скорости выполнения: вместо передачи параметров, возврата управления и результатов
  • Включение/выключение подстановки в коде

Права создателя и права вызывающего

  • Definer rights – права создателя – программа выполняется от имени владельца программы и с его привилегиями
  • Invoker rights – права вызывающего – процедура вызывается с привилегиями пользователя, от которого идёт вызов программы

Пример программы, которая выполняется с правами вызывающего:

CREATE OR REPLACE PROCEDURE runddl (p_ddl_in IN VARCHAR2) AUTHID CURRENT_USER IS BEGIN EXECUTE IMMEDIATE p_ddl_in; END;

Рекомендуемая литература:

  • С. Фейерштейн, Б. Прибыл Oracle PL/SQL для профессионалов

Контакты:

СПАСИБО ЗА ВНИМАНИЕ!