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

  1. НЕТ_ДАННЫХ_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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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;
  1. 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 будут надежными и безошибочными. Помните, обработка исключений — важный аспект разработки надежного и эффективного программного обеспечения.