Ошибка расчета комиссий ora 01403 данные не найдены

I’ve a SQL query where if output is NULL it should not send warning .

l_sup_id    NUMBER;

begin

SELECT  per_all_assignments_f.supervisor_id
    INTO  l_sup_id
FROM    per_all_assignments_f
WHERE   person_id = p_person_id
    AND     trunc (sysdate) BETWEEN effective_start_date
                    AND     effective_end_date
    AND     primary_flag = 'Y';

elsif (p_person_type = 'APPRAISER' AND  l_sup_id IS NOT NULL) then
        hr_utility.set_message(801, 'HR_51888_APR_APPRAISER_NULL');
        hr_utility.raise_error;
end if;

Whenever l_sup_id is null according to logic

  hr_utility.set_message(801, 'HR_51888_APR_APPRAISER_NULL');

should not be executed

But whenever l_sup_id is null I am getting

ORA-01403: no data found

error in logs

If l_sup_id is not null application working is fine

jarlh's user avatar

jarlh

41.9k8 gold badges45 silver badges63 bronze badges

asked Apr 28, 2015 at 6:52

Pravin Kottawar's user avatar

5

From documentation,

NO_DATA_FOUND

A SELECT INTO statement returns no rows, or your program references a
deleted element in a nested table or an uninitialized element in an
index-by table.

In your PL/SQL code, the SELECT .. INTO statement returns no rows, thus it raises NO_DATA_FOUND error. It never goes to the next line, i.e. your IF-ELSE construct.

If you want to continue the operation, then you need to handle the EXCEPTION gracefully.

For example,

SQL> SET serveroutput ON
SQL>
SQL> DECLARE
  2    o_ename emp.ename%TYPE;
  3    i_empno emp.empno%TYPE;
  4  BEGIN
  5    SELECT ename INTO o_ename FROM emp WHERE empno = i_empno;
  6    -- Handle no_data_found
  7  EXCEPTION
  8  WHEN no_data_found THEN
  9    -- do something
 10    dbms_output.put_line('No records found for employee no '|| i_empno);
 11  END;
 12  /
No records found for employee no

PL/SQL procedure successfully completed.

SQL>

answered Apr 28, 2015 at 7:11

Lalit Kumar B's user avatar

Lalit Kumar BLalit Kumar B

47.3k13 gold badges96 silver badges123 bronze badges

As the error suggests its pointing to NO DATA for the condition, to handle that you need to use «Exception Handling», Please see the code for the changes,

declare
l_sup_id    NUMBER;

begin

SELECT  per_all_assignments_f.supervisor_id
    INTO  l_sup_id
FROM    per_all_assignments_f
WHERE   person_id = p_person_id
    AND     trunc (sysdate) BETWEEN effective_start_date
                    AND     effective_end_date
    AND     primary_flag = 'Y';

elsif (p_person_type = 'APPRAISER' AND  l_sup_id IS NOT NULL) then
        hr_utility.set_message(801, 'HR_51888_APR_APPRAISER_NULL');
        hr_utility.raise_error;
end if;
--changes start
exception
when no_Data_found then
dbms_output.put_line('No data exists for lsup '|| l_sup_id)

--changes end
end;

Edit:

   SQL> SELECT * FROM TESTEMP WHERE EMPNO=6677;

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      6677 JUPITER    CLERK           7902 17-DEC-80        800                    20

SQL>
SQL>  declare
  2   l_count number;
  3   begin
  4   select comm into l_count from testemp where empno=6677 ;
  5   DBMS_OUTPUT.PUT_LINE('lcount is'||l_count);
  6   if (l_count IS NULL) then
  7   dbms_output.put_line('no data');
  8   else
  9   dbms_output.put_line('data');
 10   end if;
 11   end;
 12  /

lcount is
no data

PL/SQL procedure successfully completed.

Your condition wont go into the if at all if you compare to NULL or how ever you want to use it according to your specification

answered Apr 28, 2015 at 6:55

anudeepks's user avatar

anudeepksanudeepks

1,0801 gold badge12 silver badges22 bronze badges

2

Thank you for all the responses.
Instead of plain sql I created the following cursor

cursor csr_supervisor_id 
                    is
        SELECT  supervisor_id
        FROM    per_all_assignments_f
        WHERE   person_id = p_person_id
            AND     trunc (sysdate) BETWEEN effective_start_date
                    AND     effective_end_date
            AND     primary_flag = 'Y';

and fetched it in l_sup_id

open csr_supervisor_id;
fetch csr_supervisor_id into l_sup_id;

Now no data received error is not coming.

answered Apr 28, 2015 at 7:55

Pravin Kottawar's user avatar

dykee

0 / 0 / 0

Регистрация: 28.04.2015

Сообщений: 53

1

16.09.2015, 21:26. Показов 17983. Ответов 4

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Нужно при выборе людей с 20 отдела(таких людей 4) сделать надбавку к зарплате. Я пошарился по форума и понял что инто только для одного значения делает вывод. Как сделать так что б для 4х?? Покажите реализацию пожалуйста

SQL
1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE PROCEDURE lab3 IS
sum_sal NUMBER;
nadbavka NUMBER;
BEGIN
  SELECT SUM(t.sal) INTO sum_sal FROM emp t;
  SELECT sal+(0.2*7) INTO nadbavka FROM emp WHERE deptno=20;
  dbms_output.put_line(' Всего бабок зарплата в отделах:'||sum_sal);
  dbms_output.put_line(' Надбавка:'||nadbavka);
 
  END lab3;



0



Lorsik

105 / 49 / 26

Регистрация: 01.09.2014

Сообщений: 140

16.09.2015, 23:14

2

ORA- 01403 Данные не найдены
Говорит о том что какой-то из твоих селектов не возвращает ни одной строки. В таких случаях обычно делают

SQL
1
2
3
4
5
6
7
8
DECLARE
....
BEGIN
....
exception 
  WHEN no_data_found THEN чтото_сделать;
  WHEN too_many_rows чтото_сделать;
END;

Если будет несколько строк то ошибка будет to_many_rows.



0



263 / 109 / 26

Регистрация: 16.03.2013

Сообщений: 272

17.09.2015, 03:44

3

dykee, т.е. тебе нужно для каждого сотрудника из 20 отдела вывести его исходную з/п и з/п с прибавкой? Если да, нужна будет группировка, так как тот селект тебе возвращает общую з/п на отдел.
Я бы это делал через курсор. И объединил бы два твоих селекта в 1, ведь данные то из одной и той же таблицы и там и там берутся.



0



StalkerIQ

22 / 20 / 3

Регистрация: 21.05.2013

Сообщений: 408

22.09.2015, 07:13

4

А разве обычный update тут не поможет?

SQL
1
UPDATE emp SET sal=sal+(0.2*7) WHERE deptno=20

????



0



263 / 109 / 26

Регистрация: 16.03.2013

Сообщений: 272

22.09.2015, 07:54

5

Цитата
Сообщение от StalkerIQ
Посмотреть сообщение

А разве обычный update тут не поможет?

Ну если TC не нужны изначальные данные без надбавки, то да. Но я бы так не делал, вдруг завтра формула надбавки изменится, пересчитать её тогда не получится. Если апдейтом — то нужно дополнительную заводить.
А так как TC использует dbms_output.put_line, чтоб меньше переписывать я и предложил курсор.



0



ORA-01403

ORA-01403: данные не найдены

Причина:

Вы пытались выполнить одно из следующих действий:
Вы выполнили SELECT INTO и строки не были возвращены.
Вы ссылались на неинициализированную строку в таблице.

Действие:

Прекратите обработку для данного оператора SELECT.

#oracle #plsql

#Oracle #plsql

Вопрос:

Я хочу обработать данные, которые не найдены. Всякий раз, когда возникает это исключение, я хочу, чтобы программа продолжалась, не останавливаясь при ошибке. Ниже приведен фрагмент кода

 BEGIN
  OPEN C_TABLE_PARTITON_LIST;
  LOOP
    FETCH C_TABLE_PARTITON_LIST INTO TABLE_PARTITION_LIST;
    EXIT WHEN C_TABLE_PARTITON_LIST%NOTFOUND;  
    SELECT COLUMN_NAME INTO PARTITION_COLUMN_NAME from ALL_PART_KEY_COLUMNS 
    sqlstring :='SELECT ( '|| PARTITION_COLUMN_NAME ||'from test';
    EXECUTE IMMEDIATE sqlstring INTO F_RESULT;  
    exception when no_data_found then
      dbms_output.put_line('no data found.');
      DBMS_OUTPUT.put_line( F_RESULT);

  END LOOP;
  CLOSE C_TABLE_PARTITON_LIST;
END;
  

Когда я добавляю исключение, мой код прерывается с приведенной ниже ошибкой

PLS-00103: Обнаружен символ «ИСКЛЮЧЕНИЕ» при ожидании одного из следующих действий:
(начальный регистр объявляет конечный выход для goto, если цикл mod null, pragma raise возвращает, выбирает обновление, используя << продолжить закрывать текущее удаление, выборку, блокировку, вставлять открытую точку сохранения отката, установить sql выполнить фиксацию для всей очистки канала слияния json_exists json_value json_query json_object json_array
ORA-06550: строка 29, столбец 3:
ПОЖАЛУЙСТА- 00103: Столкнулся с символом «ЗАКРЫТЬ» при ожидании одного из следующих действий:
end not pragma final instantiable order переопределяет статическую карту конструктора-члена

Ответ №1:

Вы должны поместить нарушающую часть скрипта в его собственный блок BEGIN-EXCEPTION-END, например

 BEGIN
  OPEN C_TABLE_PARTITON_LIST;
  LOOP
    FETCH C_TABLE_PARTITON_LIST INTO TABLE_PARTITION_LIST;
    EXIT WHEN C_TABLE_PARTITON_LIST%NOTFOUND;  

    begin     --> you need this ...

      SELECT COLUMN_NAME INTO PARTITION_COLUMN_NAME from ALL_PART_KEY_COLUMNS 
      sqlstring :='SELECT ( '|| PARTITION_COLUMN_NAME ||'from test';
      EXECUTE IMMEDIATE sqlstring INTO F_RESULT;  
    exception when no_data_found then
      dbms_output.put_line('no data found.');
      DBMS_OUTPUT.put_line( F_RESULT);

    end;      --> ... and this

  END LOOP;
  CLOSE C_TABLE_PARTITON_LIST;
END;
  

Обратите внимание, что я только что показал способ сделать это. Код, который вы опубликовали

  • является неполным (отсутствует раздел ОБЪЯВЛЕНИЯ)
  • недопустимо (в SELECT инструкции отсутствует точка с запятой и, возможно, WHERE предложение
  • SQLSTRING переменная не будет работать; 'from test' должна иметь начальный пробел, иначе это утверждение будет недействительным
  • Я предлагаю вам сначала DBMS_OUTPUT SQLSTRING убедиться, что это правильно; затем выполните это.

Комментарии:

1. Спасибо, добавление бытия и конца вокруг исключения работает.


Почему не найдены данные, хотя они там ЕСТЬ?!!

От:

kto-to

 
Дата:  05.10.04 10:47
Оценка:

есть процедура

CREATE OR REPLACE PROCEDURE FE_SP_FM_CheckOperAcc
  (hdebet RAW, hcredit RAW, icurrency RAW, ctdate date)
is
      debet_iplan RAW(16);           credit_iplan RAW(16);
      debet_priority NUMBER;         credit_priority NUMBER;
      debet_ctdateb date;            credit_ctdateb date;
      debet_ctdatee date;            credit_ctdatee date;
      debet_chblocking number;       credit_chblocking number;
      debet_chend number;            credit_chend number;
      debet_chregister number;       credit_chregister number; -- Основная учетная валюта
      debet_chcurrency number;       credit_chcurrency number; -- другая валюта
      debet_icurrency RAW(16);       credit_icurrency RAW(16);
      user_priority NUMBER;
BEGIN

   SELECT FE_FLD_IPLAN, FE_FLD_CTPRIORITYUSE,FE_FLD_CTDATEB,FE_FLD_CTDATEE,FE_FLD_CHBLOCKING,
            FE_FLD_CHEND,FE_FLD_CHREGISTER,FE_FLD_ICURRENCY,FE_FLD_CHCURRENCY
   INTO  debet_iplan, debet_priority, debet_ctdateb,     debet_ctdatee,    debet_chblocking,
            debet_chend, debet_chregister, debet_icurrency,    debet_chcurrency
   FROM  FE_TBL_ACC c     where c.fe_fld_pkguid = hdebet;
--   Raise_application_error(-20000, hdebet);
END;

1) Если выполнить вручную селект с тем hdebet,
которое туда приходит (проверял), то возвращается 1 строка
(как и должно быть)
2) если выполнить процедуру на клиенте через ADo.ORaOleDB,
то летит ошибка

ORA-01403: no data found
ORA-01403: no data found
ORA-06512: at «FEB_WORK.FE_SP_FM_CHECKOPERACC», line 89
ORA-06512: at «FEB_WORK.FE_SP_FM_INSERTSALDO», line 11
ORA-06512: at «FEB_WORK.FE_T_OPER_IN_CUS», line 2
ORA-04088: error during execution of trigger ‘FEB_WORK.FE_T_OPER_IN_CUS’
ORA-06512: at «FEB_WORK.FE_SP_INSERT», line 33
ORA-06512: at line 1

3) Если раскомментировать raise в конце процедуры,
то просто выводится значение hdebet в ошибке
(причем, чтобы оптимизатор не соптимизировал что-то,
я выводил таку переменную значениекоторой невозможно
определить без выполнения всей процедуры)

ГДЕ ГРАБЛИ ГОСПОДА ?!.. Где они родимые спрятались?

Еще есть такая лажа…

Есть клиент который через ADO.OraOLEDB вызывает хранимую
процедуру на серваке. Если в процедуре дается COMMIT,
то клиент валится по ошибке

ORA-03113 end-of-file on communication channel


Re: Почему не найдены данные, хотя они там ЕСТЬ?!!

От:

Softwarer

http://softwarer.ru
Дата:  05.10.04 11:00
Оценка:

Здравствуйте, kto-to, Вы писали:

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

Этот селект — 89-я строка процедуры?

Протрассируйте сессию с вызовом этой процедуры. Вся ситуация, да и двойной no data found подталкивают к мысли, что втихаря выполняется еще какой-то код, в котором, собственно, и зашита проблема.

Попробуйте эквивалентные изменения, например, перепишите select into на for — увидите возвращаемую (пустую) выборку либо тот же no data found?


Re[2]: Почему не найдены данные, хотя они там ЕСТЬ?!!

От:

kto-to

 
Дата:  05.10.04 13:22
Оценка:

Здравствуйте, Softwarer, Вы писали:
S>Если процедура так же глючит при выполнении с сервера — пройдите ее отладчиком. Если не глючит — смотрите на подключение из Вашей программы, текущего пользователя, настройки FGAC и так далее.
Глючит именно из софтины. Я проверял, что, например, глюка с коммитом нет при выполнении в
PLSQL Developer

S>Этот селект — 89-я строка процедуры?

Сообщения об ошибке отличаются только номером строки,
Который всегда указывает на этот селект.
Я взял одно из этих сообщений.
В тексте процедуры я выкинул лишние комментарии.
В моем варианте сейчас стразу за закомментированным raise идет return;

S>Протрассируйте сессию с вызовом этой процедуры. Вся ситуация, да и двойной no data found подталкивают к мысли, что втихаря выполняется еще какой-то код, в котором, собственно, и зашита проблема.

Я это вижу, но почему на простом SELECT INTO выполняется 2-ной селект?!!

S>Попробуйте эквивалентные изменения, например, перепишите select into на for — увидите возвращаемую (пустую) выборку либо тот же no data found?

Не понял? Это как?


Re[3]: Почему не найдены данные, хотя они там ЕСТЬ?!!

От:

Softwarer

http://softwarer.ru
Дата:  05.10.04 13:31
Оценка:

Здравствуйте, kto-to, Вы писали:

KT>Глючит именно из софтины. Я проверял, что, например, глюка с коммитом нет при выполнении в

KT>PLSQL Developer

Значит, прямо при коннекте Вашей софтины включайте максимально полную трассировку и смотрите, что она делает. Включать можно на системном триггере на событие after logon. Как включать трассировку — недавно была тема на sql.ru в форуме по ораклу; может, уже добавили в FAQ.

S>>Протрассируйте сессию с вызовом этой процедуры. Вся ситуация, да и двойной no data found подталкивают к мысли, что втихаря выполняется еще какой-то код, в котором, собственно, и зашита проблема.

KT>Я это вижу, но почему на простом SELECT INTO выполняется 2-ной селект?!!

Аудит? FGAC? Это и надо выяснить — кто его выполняет. Для этого в первую очередь и делается трассировка — она покажет куда более точную картину происходящего.

S>>Попробуйте эквивалентные изменения, например, перепишите select into на for — увидите возвращаемую (пустую) выборку либо тот же no data found?

KT>Не понял? Это как?

Напишите вместо select into цикл for по курсору, в котором присваивайте полям значения из курсора. Если все равно получите no data found — это железно докажет, что Ваш код тут самым немыслимым боком не при чем.


Re: Почему не найдены данные, хотя они там ЕСТЬ?!!

От:

Sergey Ten

http://www.fastalgo.com
Дата:  05.10.04 14:30
Оценка:

Здравствуйте, kto-to, Вы писали:

KT>1) Если выполнить вручную селект с тем hdebet,

KT>которое туда приходит (проверял), то возвращается 1 строка
KT>(как и должно быть)
KT>2) если выполнить процедуру на клиенте через ADo.ORaOleDB,
KT>то летит ошибка

А как байндится hdebet (RAW) на клиенте? Есть подозрение, что условие «where c.fe_fld_pkguid = hdebet» не выполняется из-за неверной передачи hdebet. Попробуй в том же клиентском коде на ADO, который вызывает процедуру, заменить вызов процедуры на простой

select * from fe_tbl_acc  where fe_fld_pkguid = :bound_hdebet;

и сделай bind переменной bound_hdebet на то же значение, что передается в процедуру.

Можно также попробовать объявить и передать параметр процедуры как VARCHAR2, а в условии поставить
where fe_fld_pkguid = utl_raw.cast_to_raw(hdebet).

Подождите ...

Wait...

  • Переместить
  • Удалить
  • Выделить ветку

Пока на собственное сообщение не было ответов, его можно удалить.

Понравилась статья? Поделить с друзьями:
  • Ошибка расчета в арм фсс
  • Ошибка расчет невозможен внимание вероятность убытка
  • Ошибка растяпы сканворд 6 букв сканворд
  • Ошибка растрового изображения в кореле
  • Ошибка раст память не может быть read