Узнайте, как обрабатывать исключения в PL / SQL

Эта статья представляет собой исчерпывающее руководство по выполнению обработки исключений в PL / SQL, в котором обсуждаются различные типы исключений, предлагаемые в PL / SQL.

Если вы программист, возможно, вы знакомы с концепцией обработки исключений, которая является неотъемлемой частью любого . Поскольку ошибки неизбежны и даже самые умные из нас могут ошибаться при написании кода, мы должны знать, как с ними справляться. В этой статье мы узнаем, в частности, об обработке исключений в PL / SQL.



Обработка исключений SQL в PL / SQL-EdurekaНиже приведены темы, затронутые в этой статье:



Что такое исключение?

Любое ненормальное состояние или событие, которое прерывает нормальный поток инструкций нашей программы во время выполнения или, говоря простыми словами, исключение, является ошибкой.

Синтаксис обработки исключений в PL / SQL

ОБЪЯВИТЬ НАЧАЛО ИСКЛЮЧЕНИЯ КОГДА исключение1 ТОГДА операторы обработки исключения1 КОГДА исключение2 ТОГДА операторы обработки исключения2 КОГДА исключение3 ТОГДА операторы обработки исключения3 ........ КОГДА другие ТО ТОГДА операторы обработки исключения3 КОНЕЦ

Здесь мы можем перечислить столько исключений, сколько хотим обработать. Исключение по умолчанию будет обрабатываться с использованием 'WHEN others THEN'.



Пример обработки исключений в PL / SQL

В приведенной ниже программе отображается имя и адрес учащегося, чей идентификатор указан. Поскольку в нашей базе данных нет ученика со значением ID 8, программа вызывает исключение времени выполнения NO_DATA_FOUND, которое фиксируется в блоке EXCEPTION.

DECLARE s_id studentS.id% type: = 8 s_name studentS.Name% type s_loc studentS.loc% type BEGIN SELECT name, loation INTO s_name, s_loc FROM student WHERE id = s_id DBMS_OUTPUT.PUT_LINE ('Name:' || s_name) DBMS_OUTPUT .PUT_LINE ('Location:' || s_loc) ИСКЛЮЧЕНИЕ, КОГДА no_data_found THEN dbms_output.put_line ('Нет такого ученика!') КОГДА другие THEN dbms_output.put_line ('Oops, Error!') END

Вывод

Нет такого студента! Процедура PL / SQL успешно завершена.

Здесь мы можем перечислить столько исключений, сколько хотим обработать. Исключение по умолчанию будет обрабатываться с помощью ‘ КОГДА другие ТО '

Типы исключений в PL / SQL

  • Система определена
  • Пользователь бросил вызов

Далее в этой статье об обработке исключений в PL / SQL , давайте подробно обсудим оба этих типа.



Система определена

Эти исключения определяются и поддерживаются неявно сервером Oracle, но в основном они определены в стандартном пакете Oracle. Всякий раз, когда внутри программы возникает исключение, сервер Oracle сопоставляет и идентифицирует соответствующее исключение из доступного набора исключений, доступного в стандартном пакете oracle. В основном эти исключения предопределены в PL / SQL который поднимается КОГДА нарушается конкретное правило базы данных .

В Системные исключения делятся на две категории:

  • Именованные системные исключения
  • Системные исключения без названия

Именованные системные исключения

Именованные исключения PL / SQL: назван в стандартном пакете PL / SQL , следовательно, разработчику не нужно определять исключения PL / SQL в своем коде. PL / SQL предоставляет множество заранее определенных именованных исключений, которые выполняются, когда какое-либо правило базы данных нарушается программой. В следующей таблице перечислены некоторые из важных предопределенных исключений и минус

Исключение Ошибка Oracle SQLCODE Описание
ACCESS_INTO_NULL06530-6530Он возникает, когда нулевому объекту автоматически присваивается значение.
CASE_NOT_FOUND06592-6592Он возникает, когда ни один из вариантов в предложении WHEN Заявление CASE выбрано, и предложения ELSE нет.
COLLECTION_IS_NULL06531-6531Он возникает, когда программа пытается применить методы сбора, отличные от EXISTS, к неинициализированной вложенной таблице или varray, или когда программа пытается присвоить значения элементам неинициализированной вложенной таблицы или varray.
DUP_VAL_ON_INDEX00001-одинОн возникает, когда повторяющиеся значения пытаются сохранить в столбце с уникальным индексом.
INVALID_CURSOR01001-1001Он возникает, когда предпринимаются попытки выполнить недопустимую операцию с курсором, такую ​​как закрытие неоткрытого курсора.
НЕПРАВИЛЬНЫЙ НОМЕР01722-1722Он возникает, когда преобразование строки символов в число не удается, потому что строка не представляет допустимое число.
LOGIN_DENIED01017-1017Он возникает, когда программа пытается войти в базу данных с недопустимым именем пользователя или паролем.
ДАННЫЕ НЕ НАЙДЕНЫ01403+100Он возникает, когда инструкция SELECT INTO не возвращает строк.
NOT_LOGGED_ON01012-1012Он возникает при вызове базы данных без подключения к базе данных.
PROGRAM_ERROR06501-6501Он возникает, когда в PL / SQL возникает внутренняя проблема.
ROWTYPE_MISMATCH06504-6504Он возникает, когда курсор выбирает значение в переменной с несовместимым типом данных.
SELF_IS_NULL30625-30625Он возникает, когда вызывается метод члена, но экземпляр типа объекта не был инициализирован.
STORAGE_ERROR06500-6500Он возникает, когда PL / SQL не хватает памяти или память повреждена.
TOO_MANY_ROWS01422-1422Он возникает, когда инструкция SELECT INTO возвращает более одной строки.
VALUE_ERROR06502-6502Он возникает при возникновении арифметической ошибки, ошибки преобразования, усечения или ограничения размера.
ZERO_DIVIDE014761476Он возникает при попытке разделить число на ноль.

пример

СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПРОЦЕДУРУ add_new_student (студент _id_in В НОМЕРЕ, студент _name_in В VARCHAR2) НАЧИНАЕТ ВСТАВИТЬ INTO студент (идентификатор студента, имя_студента) ЗНАЧЕНИЯ (студент _id_in, студент _name_in) ИСКЛЮЧЕНИЕ, КОГДА DUP_VAL_ON_INDEXATE 'DUP_VAL_ON_INDEXEEN' DUP_VAL_ON_INDEXEN ) КОГДА ДРУГИЕ, ТО Raise_application_error (-20002, 'Произошла ошибка.') END

Продолжая эту статью об обработке исключений в PL / SQL, давайте разберемся, что такое безымянные системные исключения.

Безымянные системные исключения

Системные исключения, для которых Oracle не имеет имени, известны как безымянные системные исключения. Эти исключения возникают не часто и записываются с кодом и связанным сообщением.

Есть два основных способа обработки безымянных системных исключений:

1. Использование обработчика исключений WHEN OTHERS

2. Связывание кода исключения с именем и использование его как именованного исключения.

Для безымянных системных исключений необходимо выполнить следующие действия:

  • Поднимите их неявно.
  • Если они не обрабатываются в «КОГДА другие», они должны обрабатываться явно.
  • Чтобы обработать исключение явным образом, их можно объявить с помощью Pragma EXCEPTION_INIT и обработать путем ссылки на определяемое пользователем имя исключения в разделе исключений.

Пример обработки безымянных исключений с помощью Pragma EXCEPTION_INIT приведен далее в статье. Продолжая эту статью, посвященную обработке исключений в PL / SQL, давайте разберемся с пользовательскими исключениями.

Определяемые пользователем

Как и все другие языки программирования, Oracle также позволяет объявлять реализацию собственных исключений. В отличие от исключений, определенных Системой, эти исключения вызываются явно в блоке PL / SQL.

Шаги по объявлению пользовательских исключений в базе данных Oracle

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

  • Использование переменной типа ИСКЛЮЧЕНИЕ

Здесь мы можем объявить определяемое пользователем исключение, объявив переменную EXCEPTION. тип данных в нашем коде и явно поднять его в нашей программе с помощью оператора RAISE.

  • Использование функции PRAGMA EXCEPTION_INIT

Мы можем определить непредопределенный номер ошибки с помощью переменной типа EXCEPTION.

  • Использование метода RAISE_APPLICATION_ERROR

Используя этот метод, мы можем объявить определяемое пользователем исключение с нашим собственным настроенным номером ошибки и сообщением.

До сих пор вы могли иметь общее представление о том, как мы можем вызывать пользовательские исключения в PL / SQL. Мы узнаем о каждом из вышеупомянутых методов с примерами далее в этой статье об обработке исключений в PL / SQL.

Далее в этой статье давайте продолжим демонстрацию обработки пользовательских исключений.

Демонстрация пользовательских исключений

Продолжая эту статью об обработке исключений в PL / SQL, давайте разберемся, как использовать переменную типа EXCEPTION.

Использование переменной типа ИСКЛЮЧЕНИЕ

Процесс объявления пользовательского исключения разделен на три части:

  • Объявление типа данных исключения переменной
  • Поднимите исключение
  • Обработка исключения

Давайте напишем код, чтобы подробно продемонстрировать вышеуказанные шаги.

ОБЪЯВИТЬ НОМЕР var_dividend: = 10 var_divisor НОМЕР: = 0 var_result НОМЕР ex-DivZero ИСКЛЮЧЕНИЕ

В приведенном выше блоке объявления у нас есть четыре переменных, среди которых первые три являются переменными нормального числового типа, а четвертая, ex_DivZero, - это переменная специального типа исключения. Четвертое - это наше определяемое пользователем исключение.

ОБЪЯВИТЬ НОМЕР var_dividend: = 10 var_divisor НОМЕР: = 0 var_result НОМЕР ex-DivZero ИСКЛЮЧЕНИЕ

Вышеупомянутая часть выполнения этого анонимного блока вступит в действие только тогда, когда делитель равен 0. Если делитель равен нулю, как в нашем случае, возникнет ошибка, и управление программой пропустит все следующие шаги и будет искать соответствующий обработчик исключений. В случае, если он найдет любой другой, он выполнит соответствующее действие, в противном случае он либо завершит программу, либо сообщит нам о необработанной системной ошибке.

ИСКЛЮЧЕНИЕ КОГДА ex_DivZero THEN DBMS_OUTPUT.PUT_LINE («ОШИБКА, делитель не может быть равен нулю»)

Это обработчик исключений. Как только пользователь вводит делитель как 0, появится указанная выше строка сообщения.

Окончательный код:

DECLARE var_dividend NUMBER: = 10 var_divisor NUMBER: = 0 var_result NUMBER ex-DivZero EXCEPTION BEGIN IF var_divisor = 0 THEN RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.Var_divisor DBMS_OUTPUT. = 0 THEN RAISE ex-DivZero END IF Var_result: = var_dividend / var_divisor DBMS_OUTPUT.PUT_LINE ('Result =' || var_result) END

Продолжая эту статью об обработке исключений в PL / SQL, давайте разберемся, как использовать метод PRAGMA_EXCEPTION_INIT.

Использование функции PRAGMA EXCEPTION_INIT

в PRAGMA EXCEPTION_INIT, имя исключения связано с номером ошибки Oracle. Это имя можно использовать при разработке обработчика исключений для ошибки.Для огромных проектов с множеством ошибок, определяемых пользователем, PRAGMA EXCEPTION_INIT является наиболее полезным и подходящим методом.

Синтаксис:

PRAGMA EXCEPTION_INIT (имя_исключения, -Oracle_error_number)

пример

DECLARE deadlock_detected EXCEPTION PRAGMA EXCEPTION_INIT (deadlock_detected, -60) BEGIN NULL - некоторая операция, которая вызывает ошибку ORA-00060 EXCEPTION WHEN deadlock_detected THEN NULL - обработать ошибку END

PRAGMA EXCEPTION_INIT сообщает компилятору связать имя исключения с номером ошибки Oracle, как упоминалось ранее. Он позволяет вам ссылаться на любое внутреннее исключение по имени и писать для него специальный обработчик. Когда вы видите стек ошибок или последовательность сообщений об ошибках, то одно из них - это то, что может быть перехвачено и обработано.

Продолжая эту статью об обработке исключений в PL / SQL, давайте разберемся, как использовать метод RAISE_APPLICATION_ERROR.

Использование метода RAISE_APPLICATION_ERROR

Это процедура, встроенная в программное обеспечение Oracle. Используя эту процедуру, мы можем связать номер ошибки с настраиваемым сообщением об ошибке. Комбинируя номер ошибки и пользовательское сообщение об ошибке, можно составить строку ошибки, которая будет похожа на те строки ошибок по умолчанию, которые отображаются Oracle при обнаружении ошибки. Процедура RAISE_APPLICATION_ERROR находится внутри пакета DBMS_STANDARD

Синтаксис

Raise_application_error (номер_ошибки, сообщение [, ИСТИНА])

пример

/ * Создается триггер trg_emp_detail_chk. * / CREATE OR REPLACE TRIGGER trg_emp_detail_chk / * Время триггера объявлено как BEFORE UPDATE в таблице EMPLOYEES. * / Перед UPDATE ON сотрудники DECLARE permission_denied EXCEPTION BEGIN / * Проверка условия начала IF день системного времени - суббота или воскресенье, или нет. * / IF trim (TO_CHAR (sysdate, 'Day')) IN ('суббота', 'воскресенье') THEN raise_application_error (-20000, 'Вы не авторизованы любые изменения в выходные !! ') / * Процедура raise_application_error вызывается со значением первого параметра как -20000 и вторым параметром с текстом по умолчанию, указывающим, что пользователь не имеет права вносить какие-либо изменения в выходные дни. * / КОНЕЦ ЕСЛИ КОНЕЦ

На этом мы подошли к концу статьи «Обработка исключений в PL / SQL». Надеюсь, эту тему хорошо поняли и помогли вам. Попробуйте написать свои собственные коды и использовать методы, описанные в этой статье.

сумма цифр числа в java

Если вы хотите обучаться этой технологии у профессионалов, вы можете выбрать структурированное обучение от edureka! Проверить это от Edureka, надежной компании по онлайн-обучению с сетью из более чем 250 000 довольных учащихся по всему миру. Этот курс знакомит вас с основными концепциями и передовыми инструментами и методами управления данными и администрирования базы данных MySQL. Он включает в себя практическое обучение таким концепциям, как MySQL Workbench, MySQL Server, моделирование данных, коннектор MySQL, дизайн базы данных, командная строка MySQL, функции MySQL и т. Д. По окончании обучения вы сможете создавать и администрировать свою собственную базу данных MySQL и управлять ею. данные.

Есть вопрос к нам? Пожалуйста, укажите это в комментариях к статье «Обработка исключений в PL / SQL», и мы свяжемся с вами как можно скорее.