- НЕТ_ДАННЫХ_FOUND:
Представьте, что у вас есть запрос, который извлекает данные из таблицы, но набор результатов пуст. В таких случаях Oracle генерирует исключение NO_DATA_FOUND. Вы можете справиться с этим, используя простой оператор IF-THEN-ELSE:
BEGIN
SELECT column_name INTO variable_name FROM table_name WHERE condition;
-- If the query returns no data, handle the exception
IF variable_name IS NULL THEN
-- Your exception handling code here
ELSE
-- Process the retrieved data
END IF;
END;
- DUP_VAL_ON_INDEX:
При вставке данных в таблицу с уникальным индексом Oracle генерирует исключение DUP_VAL_ON_INDEX, если вы нарушаете ограничение уникальности. Вот пример того, как с этим справиться:
BEGIN
INSERT INTO table_name(column1, column2) VALUES(value1, value2);
EXCEPTION
-- If the unique constraint is violated, handle the exception
WHEN DUP_VAL_ON_INDEX THEN
-- Your exception handling code here
END;
- TOO_MANY_ROWS:
Исключение Too_MANY_ROWS возникает, когда запрос возвращает несколько строк вместо одной. Вы можете справиться с этим, используя курсор и оператор FETCH:
DECLARE
CURSOR cur_name IS SELECT column_name FROM table_name WHERE condition;
variable_name table_name.column_name%TYPE;
BEGIN
OPEN cur_name;
FETCH cur_name INTO variable_name;
-- If more than one row is fetched, handle the exception
IF cur_name%FOUND THEN
-- Your exception handling code here
ELSE
-- Process the retrieved data
END IF;
CLOSE cur_name;
END;
- INVALID_CURSOR:
Если вы попытаетесь выполнить операцию с недопустимым или закрытым курсором, Oracle выдаст исключение INVALID_CURSOR. Вот как с этим можно справиться:
DECLARE
CURSOR cur_name IS SELECT column_name FROM table_name WHERE condition;
variable_name table_name.column_name%TYPE;
BEGIN
OPEN cur_name;
-- If the cursor is not open, handle the exception
IF cur_name%ISOPEN THEN
FETCH cur_name INTO variable_name;
-- Your code to process the data here
ELSE
-- Your exception handling code here
END IF;
CLOSE cur_name;
END;
- ZERO_DIVIDE:
Исключение ZERO_DIVIDE возникает при попытке разделить число на ноль. Вы можете справиться с этим, используя блок исключений:
DECLARE
numerator NUMBER := 10;
denominator NUMBER := 0;
result NUMBER;
BEGIN
-- If a division by zero occurs, handle the exception
BEGIN
result := numerator / denominator;
EXCEPTION
WHEN ZERO_DIVIDE THEN
-- Your exception handling code here
END;
END;
- TIMEOUT_ON_RESOURCE:
Когда во время ожидания ресурса происходит тайм-аут, Oracle вызывает исключение TIMEOUT_ON_RESOURCE. Вы можете справиться с этим, используя предложение TIMEOUT в инструкции SELECT FOR UPDATE:
DECLARE
variable_name table_name.column_name%TYPE;
BEGIN
SELECT column_name INTO variable_name FROM table_name WHERE condition
FOR UPDATE WAIT timeout_value;
-- If a timeout occurs, handle the exception
EXCEPTION
WHEN TIMEOUT_ON_RESOURCE THEN
-- Your exception handling code here
END;
- INVALID_NUMBER:
Исключение INVALID_NUMBER возникает при попытке преобразовать нечисловое значение в числовой тип данных. Вот пример того, как с этим справиться:
DECLARE
variable_name NUMBER;
BEGIN
variable_name := TO_NUMBER('abc');
-- If an invalid number conversion occurs, handle the exception
EXCEPTION
WHEN INVALID_NUMBER THEN
-- Your exception handling code here
END;
- TOO_MANY_VALUES:
Исключение Too_MANY_VALUES возникает, когда вы пытаетесь присвоить несколько значений одной переменной. Вы можете справиться с этим, используя тип записи:
DECLARE
TYPE record_name IS RECORD (
column1 table_name.column1%TYPE,
column2 table_name.column2%TYPE
);
variable_name record_name;
BEGIN
SELECT column1, column2 INTO variable_name FROM table_name WHERE condition;
-- If more than one value is fetched, handle the exception
IF variable_nameIS NULL THEN
-- Your exception handling code here
ELSE
-- Process the retrieved data
END IF;
END;
- PROGRAM_ERROR:
Исключение PROGRAM_ERROR возникает, когда в блоке PL/SQL возникает необработанное исключение. Вы можете справиться с этим, используя прагму EXCEPTION_INIT:
DECLARE
variable_name EXCEPTION;
PRAGMA EXCEPTION_INIT(variable_name, -6502);
BEGIN
-- Your code here
EXCEPTION
-- If a program error occurs, handle the exception
WHEN variable_name THEN
-- Your exception handling code here
END;
- STORAGE_ERROR:
Исключение STORAGE_ERROR возникает, когда недостаточно памяти для завершения операции. С этим можно справиться, высвободив ресурсы или увеличив выделение памяти:
DECLARE
variable_name VARCHAR2(32767);
BEGIN
-- Allocate a large amount of memory
variable_name := RPAD('A', 100000000);
-- If a storage error occurs, handle the exception
EXCEPTION
WHEN STORAGE_ERROR THEN
-- Your exception handling code here
END;
В этой статье мы рассмотрели десять распространенных исключений Oracle и предоставили примеры кода, позволяющие эффективно их обрабатывать. Понимая и правильно обрабатывая эти исключения, вы можете гарантировать, что ваши приложения на базе Oracle будут надежными и безошибочными. Помните, обработка исключений — важный аспект разработки надежного и эффективного программного обеспечения.