Задать вопрос

Как исключить ошибку пустого запроса в ORACLE?

в процедуре имеется следующий запрос:
AS 
  INSERTED VARCHAR(200);
  ID_ NUMBER;
...
SELECT ID_MATERIAL INTO INSERTED FROM SOURCE WHERE SHORTNAME_MATERIAL=SHORT_NAME;

В случае, когда селект должен вернуть пустую запись, оракл выдает ошибку

ORA-01403: no data found
ORA-06512: at "********************", line 11
ORA-06512: at line 12

как исправить? процедура должна работать дальше после этого запроса, и в зависимости от результата (null или не null) сделать другие операции.
  • Вопрос задан
  • 6127 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@Oraclist
Простейший способ, таки, обработать ошибку no_data_found.
Ориентировочный скрипт такой
AS 
  INSERTED VARCHAR(200);
  ID_ NUMBER;
BEGIN
...
BEGIN
SELECT ID_MATERIAL INTO INSERTED FROM SOURCE WHERE SHORTNAME_MATERIAL=SHORT_NAME;
EXCEPTION
WHEN NO_DATA_FOUND THEN NULL ; (или INSERTED := NULL)
END;
...
IF INSERTED IS NULL THEN
...
ELSE
...
END IF ;
...
END <PROCEDURE_NAME> ;

А вообще, по приведенному примеру можно сказать, что над оформлением кода (стандартом оформления) надо работать. Имена переменных и таблиц такими делать не принято. Используют преффиксы VAR_, V_, GV_, LV_ для переменных и преффиксы TBL_, T_ или суффикс _TBL для таблиц. Вместо VARCHAR должен быть VARCHAR2. Обязательно указывать тип размерности для строковых - BYTE or CHAR. Алиасы для таблиц являются хорошим тоном даже в таких простых запросах. Невозможно понять условие SHORTNAME_MATERIAL=SHORT_NAME - это сравнение полей картежа, двух скалярных внутренних или внешних переменных, или констант, или сравнение поля с переменной/константой.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Draconian
Oracle Developer
Простейший способ - сделать этот запрос курсором и там уже проверять наличие или отсутствие строк.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы