I am getting ORA-01403: no data found
exception for the following query. What are the possibilities of this error?
SELECT trim(name)
INTO fullname
FROM ( SELECT n.name
FROM directory dir, store n
WHERE dir.name = n.name
AND dir.status NOT IN ('F', 'L', 'M')
ORDER BY n.imp, dir.date)
WHERE rownum <= 1;
How can I handle this error?
diziaq
7,00116 gold badges55 silver badges99 bronze badges
asked Jan 17, 2014 at 12:47
4
Although you have put a WHERE condition, a better way would be to handle case of record not found or ‘No Data Found’ error. I would write above code with wrapping the SELECT
statement with it’s own BEGIN/EXCEPTION/END
block.
Code could be something like this:
BEGIN
SELECT trim(name)
INTO fullName
FROM (
SELECT n.name
FROM directory dir, store n
WHERE dir.name = n.name
AND dir.STATUS NOT IN ('F','L','M')
ORDER BY n.imp, dir.date
)
WHERE rownum <= 1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
fullName := NULL;
END;
answered Jan 17, 2014 at 12:59
SandeepSandeep
5685 silver badges7 bronze badges
4
If the standard exception handling described by Sandeep seems to much overhead (like in my case) and you’re fine with a NULL
or some individual <not found> value), you might just transform it like this:
select col into v_foo from bar where 1=0 -- would provoke ORA-01403
=> no ORA-01403 raised:
-- if NULL would be fine:
select (select col from bar where 1=0) into v_foo from dual
-- if individual "NOT_FOUND" value should be set to avoid standard exception handling:
-- (it depends on your col type, so it could e.g. be 'NOT_FOUND' or -1
-- or to_date( 'yyyy-mm-dd', '2100-01-01') )
select nvl( (select col from bar where 1=0), 'NOT_FOUND' ) into v_foo from dual
answered Feb 23, 2017 at 12:12
Andreas CovidiotAndreas Covidiot
4,3365 gold badges51 silver badges97 bronze badges
1
Probably because your Query
SELECT n.name
FROM directory dir,
store n
WHERE dir.name = n.name
AND dir.STATUS NOT IN ('F','L','M')
ORDER BY n.imp,
dir.date
is not returning any rows
answered Jan 17, 2014 at 12:53
A Nice GuyA Nice Guy
2,6764 gold badges30 silver badges54 bronze badges
If dir.status
has any nulls in your table, then not in
is probably not doing what you think it is. You may get zero rows even though you think you should get one or more rows. You can switch to and not (dir.status in ('F,'L','M'))
instead of dir.status not in ('F','L','M')
.
See this for reference.
answered Jan 17, 2014 at 15:40
GriffeyDogGriffeyDog
8,2063 gold badges23 silver badges34 bronze badges
forget the exceptions… just use the dual table:
select (
SELECT trim(name)
FROM ( SELECT n.name
FROM directory dir, store n
WHERE dir.name = n.name
AND dir.status NOT IN ('F', 'L', 'M')
ORDER BY n.imp, dir.date)
WHERE rownum <= 1
) into fullname
from dual;
B-) that way if your query don’t return anything the variable will be populated with null.
answered Sep 26, 2022 at 16:07
Learn the cause and how to resolve the ORA-01403 error message in Oracle.
Description
When you encounter an ORA-01403 error, the following error message will appear:
- ORA-01403: no data found
Cause
You tried one of the following:
- You executed a SELECT INTO statement and no rows were returned.
- You referenced an uninitialized row in a table.
- You read past the end of file with the UTL_FILE package.
Resolution
The option(s) to resolve this Oracle error are:
Option #1
Terminate processing of the data.
Уровень сложности
Средний
Время на прочтение
17 мин
Количество просмотров 5.3K
Предисловие
Убедительная просьба, рассматривать данный текст только как продолжение к статье о “Событийной модели логирования”. Эта статья будет полезна тем, у кого уже реализовано логирование событий в БД и кто хотел бы осуществлять сбор статистики и начать проводить аналитику этих событий. Только представьте, что ваша БД сможет информировать вас о критичных сбоях системы, накапливать информацию о событиях в БД (кол-во повторений, период повторений и т.д.). И всё это без использования стороннего ПО силами одного PL/SQL.
Введение
В этом цикле статей будет показано как реализованный функционал «логирования» позволяет фиксировать факт возникновения не только ошибок (сообщение с типом «Error»), но и сообщений с предупреждением (тип «Warning»), информативных сообщений (с типом «Info») и т.д., поэтому, в рамках данных статей введём термин – «Модель логирования событий» (далее по тексту – “модель”) или коротко «Логирование событий», где под “событием” подразумевается некоторое ожидаемое действие, возникшее в ходе штатной/внештатной работы алгоритма.
Модель логирования позволяет реализовать:
-
Единый подход в обработке и хранении событий (статья)
-
Собственную нумерацию и идентификацию событий происходящих в БД
-
Единый мониторинг событий (статья в разработке)
-
Анализ событий происходящих в БД (статья в разработке)
Описанные выше характеристики указаны в порядке нумерации и каждый следующий пункт (шаг) есть улучшение и усложнение существующей модели. Описание этой модели будет сложно выполнить в рамках одной статьи, поэтому опишем их последовательно. В этой (второй) статье создадим собственную нумерацию кодов для событий, а также создадим функционал идентификации событий происходящих в БД.
Для чего это нужно?
Для начала давайте рассмотрим пример. Вы реализовали логирование ошибок в вашей БД. С течением времени в ваш лог «прилетают» самые разнообразные ошибки. Предположим, имеются две ошибки вида «no_data_found» возникшие в двух разных процедурах при двух разных запросах (select). Первая ошибка возникла при попытке найти «email» клиента, что в принципе не является критичной ошибкой. Вторая ошибка возникла при попытке найти номер лицевого счета клиента, что вполне может являться критичной ошибкой. При этом если мы посмотрим в таблицу лога (из статьи), то увидим, что указанные ошибки будут храниться с одинаковым кодом 1403 (ORA-01403) в столбце msgcode. Более того, текст указанных ошибок будет практически аналогичным (текст полученный с помощью функции SQLERRM) за исключением имен объектов, на которых произошла ошибка. Для того чтобы понять является ли критичной конкретная ошибка, разработчику необходимо вникать в текст ошибки, смотреть в каком объекте возникла ошибка и на основе этой информации сделать вывод о срочности исправления. При этом, если мы сможем задать более четкое описание ошибки отличное от текста Oracle (SQLERRM), то это позволит упростить понимание причин возникновения и способов решения ошибки.
Ошибка |
Как сейчас |
Как должно быть (в идеале) |
Не найдена запись в таблице содержащей адреса электронной почты клиентов |
ORA-01403: данные не найдены |
USR0001: Не найден адрес электронной почты клиента id = *** (идентификатор клиента) |
Не найдена запись в таблице содержащей лицевые счета клиентов |
ORA-01403: данные не найдены |
USR0002: Не найден лицевой счет клиента id = *** (идентификатор клиента) |
Из этого примера видно, что одна и та же ошибка «no_data_found» (ORA-01403: данные не найдены) может иметь совершенно разное значение с точки зрения бизнес логики, а значит нам необходимо разработать механизм, который позволит идентифицировать каждое событие происходящее в БД как отдельное событие с нашим внутренним уникальным кодом и текстом события (отличную от Oracle). Таким образом мы решаем две проблемы:
1) В месте возникновения ошибки мы устанавливаем уникальный код ошибки. В будущем это позволяет достаточно быстро найти место возникновения ошибки. Также, наличие уникальных кодов позволяет нам произвести точечный подсчет повторений и на основании этой информации принять решение об устранении данной ошибки.
2) Дополнительный “читаемый” текст позволяет сильно упростить понимание ошибки. В таблице выше показано, как одна и та же ошибка может запутать или разъяснить пользователю сведения об ошибке.
Надеюсь мне удалось объяснить зачем необходимо кодировать события в таблице логов. Далее по тексту, будут введены термины «Архитектурный лог» и «Пользовательский лог». На примере процедуры поиска активного номера телефона клиента будет показано как и зачем создано разделение на архитектурный и пользовательский лог.
Архитектурное логирование событий
Давайте рассмотрим пример, имеется процедура поиска активного номера телефона принадлежащего конкретному клиенту (для примера его id = 43). Предположим, что при постановке задачи для разработчика не было описания каких-либо особых условий т.е. по условиям задачи предполагалось, что для конкретного пользователя (id = 43, идентификатор передается в качестве параметра) в таблице client_telnumbers всегда будет хотя бы одна запись с номером телефона клиента и признаком «активный» (значение поля enddate равно дате 31.12.5999 23:59:59, что означает что номер используется клиентом. В случае, любой другой даты в указанном поле означает, что номер перестал быть активным и более не используется), поэтому наша процедура будет выглядеть примерно так:
Исходный код демонстрационной процедуры
procedure p_get_telnumber(p_userid in number,
p_telnumber out number,
p_errcode out number,
p_errtext out varchar2)
is
v_objname varchar2(60) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
v_telnumber client_telnumbers.telnumber%type;
begin
select telnumber
into v_telnumber
from client_telnumbers
where id = p_userid
and enddate = to_date('31.12.5999 23:59:59', 'dd.mm.yyyy hh24:mi:ss');
p_telnumber := v_telnumber;
p_errcode := 1;
exception
when others then
pkg_msglog.p_log_err(p_objname => v_objname,
p_msgcode => SQLCODE,
p_msgtext => SQLERRM,
p_paramvalue => 'p_userid = '||p_userid,
p_backtrace => dbms_utility.format_error_backtrace);
raise;
end p_get_telnumber;
Важно! Представленный код является примерным (примитивным) и служит только для демонстрации логирования в рамках данной статьи. В своих статьях я не выкладываю текст кода из реально действующих БД. Надеюсь, вы понимаете, что в реальности указанная процедура написана гораздо сложнее.
*Исходный код других используемых объектов смотрите в Git
Если мы будем использовать логирование ошибок как показано в предыдущей статье, то с течением времени обнаружим, что идентифицировать ошибки из данной процедуры будет сложно. Поэтому для всех ошибок попадающих в обработку исключения «WHEN OTHERS» реализована процедура pkg_msglog.p_log_archerr, которая при первом возникновении ошибки автоматически присваивает ей уникальный код и сохраняет ошибку в таблице лога. В дальнейшем, при повторении данной ошибки процедура найдет ранее созданный код и использует его при логировании в таблице лога.
В итоге, после добавления блока «архитектурного» логирования (строки с 18 по 24), наша процедура будет выглядеть следующим образом:
Исходный код демонстрационной процедуры
procedure p_get_telnumber(p_userid in number,
p_telnumber out number,
p_errcode out number,
p_errtext out varchar2)
is
v_objname varchar2(60) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
v_telnumber client_telnumbers.telnumber%type;
begin
select telnumber
into v_telnumber
from client_telnumbers
where id = p_userid
and enddate = to_date('31.12.5999 23:59:59', 'dd.mm.yyyy hh24:mi:ss');
p_telnumber := v_telnumber;
p_errcode := 1;
exception
-- Архитектурное логирование
when others then
pkg_msglog.p_log_archerr(p_objname => v_objname,
p_msgcode => SQLCODE,
p_msgtext => SQLERRM,
p_paramvalue => 'p_userid = '||to_char(p_userid),
p_backtrace => dbms_utility.format_error_backtrace);
raise;
end p_get_telnumber;
*Исходный код других используемых объектов смотрите в Git
На этапе написания текста процедуры разработчик не всегда может предугадать возникновение той или иной ошибки (если честно, не всегда есть на это время), поэтому на начальном этапе ему достаточно «отлавливать» абсолютно все ошибки возникающие в данной процедуре с помощью оператора «WHEN OTHERS». Таким образом мы можем ввести новый термин (в рамках данного цикла статей), «Архитектурные логирование» – это логирование всех ошибок, возникновение которых не предполагается при штатной работе алгоритма. Для функционала «Архитектурных ошибок» были созданы объекты: отдельный справочник ошибок messagecodes_arch и процедура pkg_msglog.p_log_archerr создания записи в таблице лога для указанного типа ошибок.
Исходный код таблицы
create table messagecodes_arch(objectname varchar2(120) not null,
sqlerrcode number not null,
msgcode varchar2(10) not null,
insertdate date default sysdate,
constraint pk_msgcode_arch_id primary key (objectname,sqlerrcode));
Ограничение в таблице на комбинацию (Имя объекта, код ошибки SQLCODE). При первом появлении ошибки создается запись в таблице и генерируется код ошибки “SYS0000” + счетчик ошибок. При повторном появлении указанной ошибки будет взят уже сгенерированный ранее код ошибки.
*Исходный код других используемых объектов смотрите в Git
Обратите внимание, что при использовании описанной модели «архитектурного» логирования у вас появляется функционал позволяющий максимально быстро реагировать на первое появление ошибки (в конкретной функции/процедуре). Для этого необходимо реализовать отдельный мониторинг архитектурных ошибок, который постараюсь продемонстрировать в следующей (третьей) статье. Использование процедуры pkg_msglog.p_log_archerr не требует каких-либо действий кроме описания входных параметров.
Таким образом мы можем создать базовый шаблон процедуры (функции), использование которого позволит вам гарантированно отлавливать все архитектурные ошибки в вашем коде.
Шаблон процедуры/функции с архитектурным логированием
-- Шаблон процедуры/функции для построения Событийной модели логирования
-- Обратите внимание, что каждый блок "begin ... end" содержит исключение вида "when others",
-- который осуществляет логирование Архитектурных ошибок.
-- Все остальные исключения вида "no_data_found", "too_many_rows" и др.
-- будут осуществлять логирование Пользовательских ошибок
procedure p_procedure_name(p_param1 in number,
p_param2 in varchar2,
p_param3 in date,
/* others param */
p_errcode out number,
p_errtext out varchar2)
is
v_objname varchar2(60) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
/* variable */
v_msgcode messagelog.msgcode%type;
v_msgtext messagelog.msgtext%type;
begin
/* code */
begin
/* code */
exception
-- Пользовательское логирование
when no_data_found then
v_msgcode := 'USR0000'; -- внутренний код
v_msgtext := pkg_msglog.f_get_errcode(v_msgcode);
pkg_msglog.p_log_wrn(p_objname => v_objname,
p_msgcode => v_msgcode,
p_msgtext => v_msgtext,
p_paramvalue => 'p_param1 = '||to_char(p_param1)
||', p_param2 = '||p_param2
||', p_param3 = '||to_char(p_param3,'dd.mm.yyyy hh24:mi:ss'));
p_errcode := -1;
p_errtext := v_msgtext;
end;
/* code */
/* result */
p_errcode := 1;
exception
-- Пользовательское логирование
when no_data_found or too_many_rows then
v_msgcode := 'USR0000'; -- внутренний код
v_msgtext := pkg_msglog.f_get_errcode(v_msgcode);
pkg_msglog.p_log_wrn(p_objname => v_objname,
p_msgcode => v_msgcode,
p_msgtext => v_msgtext,
p_paramvalue => 'p_param1 = '||to_char(p_param1)
||', p_param2 = '||p_param2
||', p_param3 = '||to_char(p_param3,'dd.mm.yyyy hh24:mi:ss'));
p_errcode := -1;
p_errtext := v_msgtext;
-- Архитектурное логирование
when others then
pkg_msglog.p_log_archerr(p_objname => v_objname,
p_msgcode => SQLCODE,
p_msgtext => SQLERRM,
p_paramvalue => 'p_param1 = '||to_char(p_param1)
||', p_param2 = '||p_param2
||', p_param3 = '||to_char(p_param3,'dd.mm.yyyy hh24:mi:ss'),
p_backtrace => dbms_utility.format_error_backtrace);
raise;
end p_procedure_name;
Рекомендую использовать данный шаблон для построения “Событийной модели логирования”.
*Исходный код других используемых объектов смотрите в Git
В рамках событийной модели логирования, предполагается, что все архитектурные ошибки будут исправляться отдельной задачей т.е. основная цель это устранить повторное появление ошибок с кодом “SYS****” в таблице лога. В указанной задаче вам необходимо либо устранить причины возникновения данной ошибки, либо добавить отдельную обработку ошибки отличную от «when others», которую в дальнейшем будем назвать «пользовательское» логирование (в рамках данного цикла статей).
Пользовательское логирование событий
Предположим, что однажды в нашей процедуре get_telnumber произошла «архитектурная ошибка». В частности, для конкретного пользователя в таблице client_telnumbers хранится два номера телефона с признаком «активный». В таком случае, процедура «упадёт» с ошибкой «ORA-01422: too_many_rows». При этом, наш функционал архитектурного логирования сгенерировал новый код ошибки «SYS0061» и создал запись в таблице лога.
Самое важно в такой ситуации это не откладывать «на потом» исправление архитектурных ошибок. В идеале, необходимо создать отдельную задачу (баг) и в рамках неё устранить ошибку.
Предположим ,что была создана отдельная задача для устранения ошибки и назначена разработчику. В рамках этой задачи, разработчик совместно с технологом, аналитиком и др. коллегами пришел к выводу, что указанная ошибка носит систематический характер, является некорректной работой системы и требует исправления. В качестве мер исправления было решено добавить обработку события «too_many_rows» с последующим логированием события в таблице лога и выводом текста ошибки для пользователя.
Для этого в процедуре get_telnumber добавлено исключение (exception) «too_many_rows» пользовательского логирования. Также, был создан справочник пользовательских ошибок отличный от архитектурного справочника, тем что в него все записи добавляются разработчиком “вручную”. Наверное это самое слабое место во всей архитектуре логирования. Предполагается, что разработчик должен описать исключение (exception) и создать для него уникальный код ошибки. Также, желательно к указанной ошибке сформулировать читаемый текст ошибки (для своих коллег, пользователя, техподдержки и т.д.), что бывает иногда очень сложным (из личного опыта).
Таблица пользовательских ошибок и процедура их “регистрации” будет выглядеть следующим образом:
Исходный код таблицы пользовательских ошибок и процедуры регистрации
create table messagecodes(msgcode varchar2(10) not null,
rustext varchar2(500) not null,
msgpriority number(1) default 1,
insertdate date default sysdate,
lastupdate date default null,
constraint pk_messagecodes_id primary key (msgcode));
Регистрация пользовательских ошибок производится процедурой p_insert_msgcode. На вход подается код и текст ошибки. В случае, если по указанному коду нет записей в справочнике messagecodes, то создается новая запись (производится регистрация). В случае, если по коду ошибки найдена запись, то производится сравнение текстов ошибки, в случае расхождений производится обновление текста, иначе работа процедуры завершается без изменений. Таким образом мы всегда можем корректировать текст ошибок.
-- Пример регистации пользовательских ошибок
begin
pkg_msglog.p_insert_msgcode('USR0001','Не найден адрес электронной почты клиента id = $1!',1);
pkg_msglog.p_insert_msgcode('USR0002','Не найден лицевой счет клиента id = $1!',5);
pkg_msglog.p_insert_msgcode('USR0003','Для клиента id = $1 найдено два и более активных номеров телефона!',1);
pkg_msglog.p_insert_msgcode('USR0004','Номер мобильного телефона не соответствует маске (clientid = $2)',1);
commit;
end;
Обратите внимание, что текст ошибок имеет параметризацию т.е. для ошибки в тексте имеются специальные символы $1, $2, $3 и т.д. Например, рассмотрим ошибку “USR0003” с текстом “Для клиента id = $1 найдено два и более активных номеров телефона!” при вызове функции f_get_errcode на вход подаётся код ошибки и параметры ошибки. Далее, функция по коду ошибки найдет строку, в тексте ошибки заменит подстроку “$1” на значение параметра to_char(p_userid) т.е. подставит значение to_char(p_userid).
v_msgcode := 'USR0003'; -- внутренний код
v_msgtext := pkg_msglog.f_get_errcode(p_msgcode => v_msgcode,
p_msgparam => to_char(p_userid));
В случае если в тексте ошибки будут два и более спецсимвола $1, $2, $3 и т.д., то параметры передаются с использованием символа-разделителя “;”.
Итого, содержимое справочника пользовательских ошибок будет выглядеть следующим образом:
*Исходный код других используемых объектов смотрите в Git
После того, как мы “зарегистрировали” пользовательскую ошибку “USR0003” и добавив отдельную обработку пользовательского логирования (строки с 19 по 28), наша процедура get_telnumber будет выглядеть следующим образом:
Исходный код демонстрационной процедуры
procedure p_get_telnumber(p_userid in number,
p_telnumber out number,
p_errcode out number,
p_errtext out varchar2)
is
v_objname varchar2(60) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
v_telnumber client_telnumbers.telnumber%type;
v_msgcode messagelog.msgcode%type;
v_msgtext messagelog.msgtext%type;
begin
select telnumber
into v_telnumber
from client_telnumbers
where id = p_userid
and enddate = to_date('31.12.5999 23:59:59', 'dd.mm.yyyy hh24:mi:ss');
p_telnumber := v_telnumber;
p_errcode := 1;
exception
-- Пользовательское логирование
when too_many_rows then
v_msgcode := 'USR0003'; -- внутренний код
v_msgtext := pkg_msglog.f_get_errcode(v_msgcode,to_char(p_userid));
pkg_msglog.p_log_wrn(p_objname => v_objname,
p_msgcode => v_msgcode,
p_msgtext => v_msgtext,
p_paramvalue => 'p_userid = '||to_char(p_userid));
p_errcode := -1;
p_errtext := v_msgtext;
-- Архитектурное логирование
when others then
pkg_msglog.p_log_archerr(p_objname => v_objname,
p_msgcode => SQLCODE,
p_msgtext => SQLERRM,
p_paramvalue => 'p_userid = '||to_char(p_userid),
p_backtrace => dbms_utility.format_error_backtrace);
raise;
end p_get_telnumber;
*Исходный код других используемых объектов смотрите в Git
При повторном возникновении ошибки «too_many_rows» обработка события пройдет по нашему сценарию «пользовательского» логирования. Таким образом мы можем ввести второй термин (в рамках данного цикла статей), «Пользовательские логирование» – это логирование всех ошибок, возникновение которых предполагается и ожидается при нештатной работе алгоритма. В итоге, пользователь получит читаемый текст ошибки с кодом «USR0003», также, мы же всегда сможем подсчитать количество ошибок с указанным кодом. В случае большого количества ошибок у нас на руках будет «живая» статистика частоты возникновения ошибки и их количества, что позволит нам выйти на руководство с предложением по доработке/оптимизации процесса.
Давайте рассмотрим еще один пример (кейс из реального случая), в момент когда процедура get_telnumber по id клиента находит один “активный” номер телефона иногда возникает ситуация, что номер телефона не принадлежит мобильному оператору. Ситуации бывают разные иногда указанный номер мог быть номером городской телефонной сети, иногда номером международного оператора, а иногда вообще набор из нескольких цифр и т.д. Основным требованием от бизнес-заказчика было использование номера телефона российских операторов мобильной связи. Поэтому было решено добавить проверку соответствия найденного номера некому “корректному” шаблону (строки с 18 по 29). В случае обнаружения некорректного номера, логировать данное событие отдельным кодом “USR0004” и типом “WRN”. Добавим функцию проверки корректности номера телефона, если номер соответствует шаблону (требованиям), то вернем номер телефона, иначе пустое значение.
Исходный код демонстрационной процедуры
procedure p_get_telnumber(p_userid in number,
p_telnumber out number,
p_errcode out number,
p_errtext out varchar2)
is
v_objname varchar2(60) := utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
v_telnumber client_telnumbers.telnumber%type;
v_newtelnumber client_telnumbers.telnumber%type;
v_msgcode messagelog.msgcode%type;
v_msgtext messagelog.msgtext%type;
begin
select telnumber
into v_telnumber
from client_telnumbers
where id = p_userid
and enddate = to_date('31.12.5999 23:59:59', 'dd.mm.yyyy hh24:mi:ss');
v_newtelnumber := f_check_telnumber(v_telnumber);
if v_newtelnumber is not null then
p_telnumber := v_telnumber;
p_errcode := 1;
else
-- Пользовательское логирование
v_msgcode := 'USR0004'; -- внутренний код
v_msgtext := pkg_msglog.f_get_errcode(v_msgcode,to_char(p_userid));
pkg_msglog.p_log_wrn(p_objname => v_objname,
p_msgcode => v_msgcode,
p_msgtext => v_msgtext,
p_paramvalue => 'p_userid = '||to_char(p_userid));
p_errcode := -1;
p_errtext := v_msgtext;
end if;
exception
-- Пользовательское логирование
when too_many_rows then
v_msgcode := 'USR0003'; -- внутренний код
v_msgtext := pkg_msglog.f_get_errcode(v_msgcode,to_char(p_userid));
pkg_msglog.p_log_wrn(p_objname => v_objname,
p_msgcode => v_msgcode,
p_msgtext => v_msgtext,
p_paramvalue => 'p_userid = '||to_char(p_userid));
p_errcode := -1;
p_errtext := v_msgtext;
-- Архитектурное логирование
when others then
pkg_msglog.p_log_archerr(p_objname => v_objname,
p_msgcode => SQLCODE,
p_msgtext => SQLERRM,
p_paramvalue => 'p_userid = '||to_char(p_userid),
p_backtrace => dbms_utility.format_error_backtrace);
raise;
end p_get_telnumber;
*Исходный код других используемых объектов смотрите в Git
После сбора статистических данных по конкретной ошибке с кодом “USR0004”, руководству стало понятно, что ошибка актуальна и количество ошибок с течением времени не только не уменьшается, а наоборот растет с линейной прогрессией. В дальнейшем, были выявлены источники “кривых” данных и были установлены внутренние требования по первичной обработке номера телефона клиентов. В итоге, со временем количество ошибок уменьшилось до нуля. И этого нельзя было добиться до тех пор, пока у всех участвующих лиц не возникло понимание о масштабе проблемы.
Выполняя самый банальный запрос в таблицу лога с группировкой по типу сообщения (msgtype), имени объекта (objname) и вашему внутреннему коду ошибки (msgcode) за отдельный квартал, вы сможете увидеть реальную картинку частоты возникновения той или иной ошибки. Как только в вашей БД появляется ошибка с большим количеством повторений вы всегда сможете выявить это событие и принять решение об устранении.
Исходный код запроса
select msgtype,
objname,
msgcode,
count(*)
from messagelog
where insertdate between to_date('01.01.2021', 'dd.mm.yyyy') and to_date('31.03.2021', 'dd.mm.yyyy')
group by msgtype, objname, msgcode
order by 4 desc
Результат запроса:
*Исходный код других используемых объектов смотрите в Git
Заключение
В заключении наверное скажу банальную вещь, о том что ваша БД является сложным механизмом ежесекундно выполняющая рутинные операции. Прямо сейчас в БД могут происходить различные ошибки. Критичные, которые вы исправляете практически сразу или некритичные, о которых вы можете вообще не знать. И если у вас нет информации о подобных ошибках, то возникает вопрос: “Нужно ли их вообще исправлять? Или можно подождать до тех пор, пока проблема не всплывёт?”. Вопрос наверное “риторический”.
Я же данной статьёй хотел показать один из способов ведения логирования с кодированием отдельных событий. Данный метод требует некоторых “обязательств” от разработчика и в нынешнее время этого тяжело добиться. В следующей статье постараюсь показать один из способов мониторинга ошибок основанный напрямую по кодам ошибок созданных в текущей статье.
Спасибо за внимание.
Ошибка Ora 01403 no data found (или ORA-01403) — одна из наиболее распространенных ошибок, с которой сталкиваются разработчики при работе с базой данных Oracle. Она возникает, когда оператор SELECT не находит ни одной строки, удовлетворяющей условию запроса. Эта ошибка может возникать в различных ситуациях, и понимание ее причин и умение ее решать является важной задачей для эффективной работы с базой данных Oracle.
Одной из частых причин появления ошибки Ora 01403 no data found является неправильное написание условия запроса. При написании оператора SELECT необходимо учитывать все возможные комбинации значений полей, чтобы быть уверенным, что в базе данных есть данные, удовлетворяющие условию. Также важно проверять наличие значений в необходимых таблицах и связи между ними.
Еще одной возможной причиной ошибки может быть изменение данных в базе данных после написания запроса. Если данные были удалены или изменены другими пользователями, то результат запроса может быть пустым, что приведет к ошибке Ora 01403 no data found. Чтобы избежать таких ситуаций, необходимо учитывать актуальность данных и проводить обновление запросов при изменении данных в базе.
Для решения ошибки Ora 01403 no data found можно использовать различные подходы. Один из способов — использовать операторы условия и проверки данных, чтобы предотвратить попытку обработки пустого результата запроса. Также можно использовать обработку исключений, чтобы предусмотреть возможность отсутствия данных и выполнить необходимые действия при возникновении ошибки. Знание основных причин и решений ошибки позволит более эффективно работать с базой данных Oracle и минимизировать риск возникновения ошибок.
Содержание
- Как обойти ошибку Ora 01403 no data found: простые способы решения
- Ошибки при работе с базой данных, ведущие к Ora 01403 no data found
- Ora 01403 no data found: какие возникают проблемы и как их исправить
- Ошибка ORA-01403 no data found: способы предотвращения ошибки при разработке
- Как улучшить производительность в работе с базой данных и избежать ошибки Ora 01403 no data found
- Примеры ошибок Ora 01403 no data found: в реальных проектах и их решения
Как обойти ошибку Ora 01403 no data found: простые способы решения
Ошибка Ora 01403 no data found возникает, когда в базе данных не найдены данные, удовлетворяющие заданным условиям запроса. Эта ошибка может возникать при использовании операторов SELECT INTO или FETCH INTO, если не найдено ни одной строки, соответствующей заданным критериям.
К счастью, существуют простые способы обойти данную ошибку и обработать случай, когда не найдено никаких данных.
1. Использование блока TRY-CATCH
Один из способов обработки ошибки Ora 01403 no data found — использовать блок TRY-CATCH в своем коде. В блоке TRY выполните нужный запрос, а в блоке CATCH обработайте исключение, которое будет возникать при отсутствии данных.
BEGIN
SELECT column INTO variable FROM table WHERE condition;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- обработка ошибки
END;
2. Использование переменной для проверки наличия данных
Еще один простой способ обойти ошибку Ora 01403 no data found — использовать переменную для проверки наличия данных перед выполнением операции.
variable_found := 0;
SELECT COUNT(*) INTO variable_found FROM table WHERE condition;
IF variable_found > 0 THEN
-- выполнение операций с данными
ELSE
-- обработка ошибки
END IF;
3. Использование оператора EXISTS
Еще один способ обойти проблему отсутствия данных — использовать оператор EXISTS для проверки наличия хотя бы одной строки, удовлетворяющей заданным условиям.
IF EXISTS(SELECT column FROM table WHERE condition) THEN
-- выполнение операций с данными
ELSE
-- обработка ошибки
END IF;
4. Использование умолчательных значений
В некоторых случаях можно предусмотреть установку умолчательных значений для переменных в запросе, чтобы избежать возникновения ошибки в случае отсутствия данных.
SELECT column INTO variable FROM table WHERE condition;
IF variable IS NULL THEN
variable := default_value;
END IF;
Заключение
Зная простые способы обхода ошибки Ora 01403 no data found, вы можете эффективно обрабатывать случаи отсутствия данных в своих SQL запросах. Используйте подходящий способ в зависимости от конкретной ситуации и требований вашей системы.
Ошибки при работе с базой данных, ведущие к Ora 01403 no data found
При работе с базой данных Oracle, разработчики могут столкнуться с ошибкой Ora 01403 no data found. Эта ошибка возникает, когда выполняется операция получения данных (через операторы SELECT, FETCH, INTO), но результирующий набор пуст. Проблемы с базой данных или некорректные запросы могут быть причиной данной ошибки.
Существует несколько распространенных причин, которые могут привести к возникновению ошибки Ora 01403:
- Отсутствие данных в базе данных для выполнения операции запроса.
- Неверное условие в операторе WHERE, которое не соответствует ни одной записи в базе данных.
- Некорректное использование оператора INTO при попытке извлечения данных в переменную.
- Использование некорректного или устаревшего синтаксиса запроса.
Для избежания ошибки Ora 01403 no data found, можно принять следующие меры:
- Проверить наличие данных в базе данных перед выполнением операции запроса. Это можно сделать с помощью подзапросов или использования условий проверки на наличие данных перед выполнением операции.
- Внимательно проверить условия оператора WHERE, чтобы гарантировать соответствие записи в базе данных.
- Проверить правильность использования оператора INTO при извлечении данных в переменные. Обратите внимание на тип данных переменной и соответствующие этому типу значения.
- Обновить синтаксис запроса, если он устарел или некорректен. Рекомендуется проверить документацию Oracle для правильного использования операторов и синтаксиса.
В случае возникновения ошибки Ora 01403 no data found, необходимо внимательно проверить и исправить возможные проблемы в коде. Также рекомендуется использовать блоки обработки исключений для гибкого управления ошибками и предотвращения прерывания работы программы.
Ora 01403 no data found: какие возникают проблемы и как их исправить
Ora 01403 no data found — это ошибка, которую может выдать база данных Oracle при выполнении SQL-запроса, когда не находит ни одной строки, удовлетворяющей условию запроса. Это может возникнуть по разным причинам и может вызвать проблемы в работе приложений, которые используют базу данных Oracle.
Проблема может возникнуть, когда приложение ожидает получить минимум одну строку данных в результате выполнения запроса, а база данных не находит таких данных. В результате возникает ошибка Ora 01403 no data found. Это может быть вызвано ошибкой в коде приложения, неправильным запросом или отсутствием данных, которые ожидалось получить.
Для исправления ошибки Ora 01403 no data found необходимо идентифицировать причину возникновения ошибки и принять соответствующие меры. Вот несколько способов исправления этой ошибки:
- Проверьте правильность запроса: убедитесь, что запрос написан правильно и содержит необходимые условия для поиска данных. Проверьте, что все имена таблиц и столбцов указаны правильно, а условия запроса соответствуют требуемым критериям.
- Проверьте наличие данных: убедитесь, что в базе данных присутствуют данные, которые ожидалось получить. Проверьте таблицы, столбцы и значения, чтобы удостовериться, что данные, которые вы ищете, существуют.
- Используйте операторы условия с NULL: если запрос содержит условия, которые сравнивают значения со значением NULL, то может возникнуть ошибка Ora 01403 no data found. В этом случае используйте операторы условия с NULL, такие как IS NULL или IS NOT NULL, чтобы правильно обрабатывать значение NULL в запросе.
- Обработайте ошибку: если ошибка Ora 01403 no data found все еще возникает, несмотря на проверку запроса и наличие данных, то необходимо обработать эту ошибку в коде приложения. Предусмотрите соответствующее сообщение об ошибке и уведомление пользователей о возникшей проблеме.
Избежать ошибки Ora 01403 no data found возможно, следуя правилам хорошей практики программирования и проверяя условия запросов и наличие данных перед их выполнением. Также стоит уделить внимание обработке ошибок и предусмотреть соответствующие механизмы для уведомления пользователей о возникших проблемах.
Ошибка ORA-01403 no data found: способы предотвращения ошибки при разработке
Ошибка ORA-01403 no data found возникает в Oracle при запросе SELECT, когда не находится ни одна запись, удовлетворяющая условиям запроса. Вот несколько способов предотвратить данную ошибку при разработке:
- Проверьте, что запрос выборки правильно сформулирован и содержит корректные условия. Убедитесь, что вы исключили возможность появления пустых результатов.
- Используйте операторы IF и THEN для проверки наличия записей перед выполнением операций с данными, если необходимо обрабатывать отсутствие данных. Это поможет избежать возникновения ошибки ORA-01403.
- Используйте блоки исключений (EXCEPTIONS) для обработки ошибки ORA-01403 и выполнения альтернативных действий, если запрос не возвращает ни одной записи. Это позволит избежать прерывания выполнения программы.
- Используйте функции агрегации (например, COUNT, MAX, MIN) при выполнении запросов, чтобы получить значения null вместо ошибки ORA-01403, если нет данных, удовлетворяющих условиям запроса.
- Правильно управляйте транзакциями в вашем приложении, чтобы избежать возможных проблем с блокировкой данных и одновременного доступа к ним. Это поможет предотвратить ошибку ORA-01403, вызванную отсутствием данных в результате транзакции другого пользователя.
Используя эти способы, вы сможете предотвратить ошибку ORA-01403 no data found и обеспечить более надежное функционирование вашей программы или системы на основе Oracle.
Как улучшить производительность в работе с базой данных и избежать ошибки Ora 01403 no data found
При работе с базой данных Oracle можно столкнуться с ошибкой Ora 01403 no data found. Данная ошибка возникает, когда в результате выполнения запроса база данных не находит требуемых данных. Чтобы улучшить производительность работы с базой данных и избежать эту ошибку, следует учесть несколько важных моментов:
- Оптимизация запросов: При написании запросов следует обращать внимание на их оптимизацию. Использование индексов, правильная структура таблицы и выбор нужных операций при запросе помогут ускорить выполнение запросов и избежать ошибки Ora 01403 no data found.
- Использование правильных условий: При составлении условий для запроса следует быть внимательным и убедиться, что они отражают необходимые данные. Неправильные условия могут привести к некорректным результатам запроса или его отсутствию, что приведет к ошибке Ora 01403 no data found.
- Проверка наличия данных: Перед выполнением операций с данными следует проверять их наличие. Для этого можно использовать операторы IF, COUNT или EXISTS. Это позволит избежать ошибки Ora 01403 no data found при попытке обработки отсутствующих данных.
- Обработка исключений: При использовании операций, которые могут привести к ошибке Ora 01403 no data found, следует предусмотреть обработку исключений. Это позволит корректно отреагировать на отсутствие данных и выполнить дополнительные действия, например, вывести предупреждение или выполнить альтернативные действия.
- Мониторинг и профилирование: Для улучшения производительности работы с базой данных следует проводить мониторинг и профилирование запросов. Это поможет определить узкие места и провести оптимизацию кода, что снизит вероятность возникновения ошибки Ora 01403 no data found.
Соблюдение данных рекомендаций поможет улучшить производительность в работе с базой данных Oracle и избежать ошибки Ora 01403 no data found. Берегите свои данные и следите за качеством запросов!
Примеры ошибок Ora 01403 no data found: в реальных проектах и их решения
Ошибка Ora 01403 no data found возникает, когда в процессе выполнения SQL-запроса не найдены данные, соответствующие заданным условиям.
Рассмотрим несколько примеров ошибок Ora 01403 no data found, которые могут возникнуть в реальных проектах и возможные способы их решения:
-
Пример 1: Запрос SELECT INTO
При выполнении запроса SELECT INTO для присваивания значения переменной, может возникнуть ошибка Ora 01403 no data found, если запрос не возвращает результатов.
Пример кода Решение
DECLARE
v_employee_name employees.first_name%TYPE;
BEGIN
SELECT first_name INTO v_employee_name FROM employees WHERE employee_id = 1000;
DBMS_OUTPUT.PUT_LINE('Employee Name: 'Оцените статью
Вам также может понравиться
Эксель 2020: где найти настройки
Microsoft Excel 2020 является одним из самых популярных
0
Настройка интерфейса Word: как изменить внешний вид программы
Microsoft Word является одним из самых популярных текстовых
0
Лучшие плагины для развертки в Blender
Blender — это мощный инструмент для 3D моделирования
0
Установка стилей в SketchUp
SketchUp — это мощный инструмент для создания
0
Ошибка ORA-01403 «no data found» является одной из самых распространенных ошибок при работе с базами данных Oracle. Эта ошибка возникает, когда запрос возвращает пустой набор данных, то есть не было найдено ни одной записи, удовлетворяющей условиям запроса. В данной статье мы рассмотрим причины возникновения ошибки ORA-01403 и покажем способы ее решения.
Одной из причин возникновения ошибки ORA-01403 является неправильно составленный запрос. Например, если вы делаете выборку данных из таблицы с использованием условия, которое не может быть выполнено, то вы получите ошибку ORA-01403. Также ошибка может возникнуть, если вы пытаетесь обратиться к несуществующей таблице или колонке.
Другой причиной возникновения ошибки ORA-01403 может быть использование оператора извлечения данных, такого как SELECT INTO или FETCH, без описания обработки исключения. Если в результате выполнения такого оператора не будет найдено ни одной записи, произойдет ошибка ORA-01403. Чтобы избежать этой ошибки, необходимо добавить блок try-catch или использовать обработку исключений.
Помимо причин, указанных выше, ошибку ORA-01403 может вызывать ряд других факторов, таких как неправильно установленные привилегии пользователя, некорректная настройка базы данных, неправильно заданные параметры соединения и т.д. Чтобы решить эту проблему, можно попробовать обновить базу данных, установить правильные привилегии, проверить параметры соединения и т.д.
Ошибки ORA-01403 «no data found» могут быть не только раздражающими, но и затруднять нормальную работу с базами данных Oracle. Однако, путем правильной настройки запросов и обработки исключений можно избежать этих ошибок и обеспечить более стабильную работу с базой данных.
Содержание
- Что такое ошибка ORA-01403 «no data found»?
- Причины возникновения ошибки ORA-01403 «no data found»
- Как определить причину ошибки ORA-01403 «no data found»?
- Способы решения ошибки ORA-01403 «no data found»
- Использование условного оператора для обработки ошибки ORA-01403 «no data found»
Что такое ошибка ORA-01403 «no data found»?
Ошибки ORA-01403 «no data found» может возникать в различных ситуациях, например, когда:
- Запрос не находит строки в таблице, которые соответствуют заданным критериям.
- Попытка прочитать данные из курсора, который не содержит ни одной строки.
- При обращении к значение столбца, который равен NULL.
Эта ошибка может привести к нерабочему коду или непредсказуемому поведению программы, поэтому нужно быть внимательным при обработке этой ошибки.
Для решения ошибки ORA-01403 «no data found» можно использовать следующие подходы:
- Проверить правильность написания запроса и условий поиска.
- Использовать конструкцию блока обработки исключений EXCEPTION WHEN NO_DATA_FOUND для корректной обработки случаев, когда запрос не нашел никаких данных.
- Использовать функции агрегации, такие как MIN() или MAX(), чтобы избежать ошибки при обращении к столбцу со значением NULL.
Важно помнить, что ошибка ORA-01403 «no data found» может быть индикатором проблемы в данных или ошибки в коде запроса. Поэтому важно тщательно проверять и исправлять возможные причины ошибки, чтобы избежать проблем в работе базы данных или программы.
Причины возникновения ошибки ORA-01403 «no data found»
Ошибка ORA-01403 «no data found» в базе данных Oracle возникает, когда запрос выполняет поиск данных в таблице и не находит ни одной строки, удовлетворяющей условию запроса.
Существует несколько причин, по которым может возникать данная ошибка:
1. Неправильное условие запроса: часто ошибка возникает из-за неправильно заданного условия в запросе. В таком случае необходимо проверить правильность написания условия и убедиться, что оно соответствует требуемым критериям.
2. Несуществующие данные в таблице: ошибка может возникнуть, если таблица не содержит данных, которые соответствуют условию запроса. Необходимо убедиться, что в таблице существуют данные, удовлетворяющие условию запроса.
3. Отсутствие записей в таблице: также ошибка может возникнуть, если таблица существует, но не содержит ни одной записи. В таком случае необходимо добавить данные в таблицу, чтобы удовлетворить условие запроса.
4. Проблемы с доступом к данным: ошибка может также возникнуть, если у пользователя нет прав доступа к таблице или столбцам, используемым в запросе. Необходимо проверить права доступа пользователя и убедиться, что он имеет необходимые привилегии для выполнения операции.
Исправление ошибки ORA-01403 «no data found» зависит от конкретной ситуации и может варьироваться. Необходимо анализировать условие запроса, данные в таблице и права доступа пользователя для определения и устранения причины ошибки.
Как определить причину ошибки ORA-01403 «no data found»?
Ошибка ORA-01403 «no data found» возникает в базе данных Oracle, когда выполняется оператор SELECT, и запрос не возвращает никаких данных. Это может произойти по разным причинам, таким как отсутствие записей, неправильные условия поиска или проблемы в самих данных.
Чтобы определить причину ошибки ORA-01403 «no data found», можно выполнить следующие действия:
- Проверьте правильность запроса. Убедитесь, что вы корректно задали условия поиска и используете правильные имена таблиц и столбцов.
- Проверьте наличие данных в таблице. Выполните запрос SELECT с более широкими условиями поиска или без них, чтобы проверить, есть ли вообще данные, удовлетворяющие вашему запросу. Если данных нет, то ошибка возникает из-за отсутствия данных.
- Проверьте правильность ввода данных. Если ваш запрос содержит значения, введенные пользователем, убедитесь, что введенные данные корректны и соответствуют типу данных столбцов.
- Проверьте наличие индексов на таблицах. Индексы помогают ускорить выполнение запросов, но их отсутствие или неправильное использование также может быть причиной ошибки «no data found».
- Проверьте наличие прав доступа. Убедитесь, что у вас достаточно прав доступа для выполнения оператора SELECT и чтения данных.
Если причина ошибки ORA-01403 «no data found» все еще не ясна, рекомендуется обратиться к администратору базы данных или к специалистам Oracle для получения дополнительной помощи и анализа проблемы.
Способы решения ошибки ORA-01403 «no data found»
Ошибка ORA-01403 «no data found» возникает в Oracle Database, когда запрос не возвращает никаких данных. Это может произойти по разным причинам, но в большинстве случаев это связано с неправильным запросом или отсутствием данных в базе данных.
Для решения ошибки ORA-01403 «no data found» можно применить следующие подходы:
- Проверить правильность запроса. Убедитесь, что ваш запрос корректно написан и соответствует структуре базы данных. Проверьте синтаксис и правильность указания таблицы, столбцов и условий.
- Проверить наличие данных в базе данных. Проверьте, есть ли в базе данных нужные вам данные. Убедитесь, что указанные в запросе условия соответствуют данным в базе.
- Использовать условную обработку ошибок. В случае возникновения ошибки ORA-01403 «no data found», можно использовать конструкцию TRY-CATCH или блок обработки исключений, чтобы обработать ошибку и выполнить альтернативные действия. Например, можно вывести сообщение об ошибке или выполнить другой запрос.
- Проверить наличие индексов. Иногда отсутствие индексов на таблицах может приводить к ошибке ORA-01403 «no data found». Убедитесь, что в нужных таблицах присутствуют необходимые индексы для оптимального выполнения запросов.
- Консультироваться с администратором базы данных. Если вы не можете самостоятельно решить проблему, обратитесь за помощью к администратору базы данных. Он сможет провести более глубокий анализ проблемы и предложить оптимальное решение.
Помните, что ошибка ORA-01403 «no data found» может быть вызвана разными причинами, и каждая ситуация требует индивидуального подхода к решению. Используйте вышеперечисленные способы как основу для поиска решения проблемы, однако не забывайте адаптировать их под свою конкретную ситуацию.
Использование условного оператора для обработки ошибки ORA-01403 «no data found»
Для обработки этой ошибки можно использовать условный оператор, который проверяет наличие результатов запроса и предпринимает соответствующие действия.
Пример использования условного оператора для обработки ошибки ORA-01403:
-- Объявление переменной для хранения результата запроса
var_result VARCHAR2(100);
BEGIN
-- Выполнение запроса
SELECT column_name
INTO var_result
FROM table_name
WHERE condition;
-- Если запрос вернул результат, то выполняются нужные действия с результатом
DBMS_OUTPUT.PUT_LINE('Результат запроса: '