Обработка исключений хранимой процедуры - PullRequest
1 голос
/ 29 сентября 2011
SQL>  DECLARE
2    TotalUpd   NUMBER(36) := 0;
3  BEGIN
4   dbms_output.put_line ('Job Start time............... : ' || to_char(SYSDATE, '             hh24:mi:ss'));
5   UPDATE Asset SET _status = 'PROGRESS' WHERE status is null;
6   TotalUpd := SQL%ROWCOUNT;
7   dbms_output.put_line('Total Records Updated. : ' || TotalUpd);
8    COMMIT;
9   EXCEPTION
10   WHEN NO_DATA_FOUND THEN
11  dbms_output.put_line ('No more data to update.');
12  WHEN OTHERS THEN
13  dbms_output.put_line ('Error while status as SUCCESS ');
14  END ;
15  /

Результат для вышеуказанной процедуры Время начала работы ...............: 04:41:41 Всего записей обновлено. : 0

Но мой ожидаемый результат - «Больше не нужно обновлять строку» должен быть напечатан, так как я усек таблицу Asset. Пожалуйста, скажите, где я ошибся в этом.

Ответы [ 4 ]

3 голосов
/ 29 сентября 2011

Ошибка NO_DATA_FOUND не генерируется в операторах обновления.

Она генерируется в select into операторах, если инструкция выбора ничего не возвращает.

См. Также Таити навыберите в в select_item : * Если инструкция SELECT INTO не возвращает строк, PL / SQL вызывает предопределенное исключение NO_DATA_FOUND. *

Oracle не считает это исключением, если обновлениеоператор ничего не обновляет, следовательно, исключение не выдается.Однако, если оператор выбора в не может заполнить переменные, это считается ошибкой (и, следовательно, в этом случае выбрасывается NO_DATA_EXCEPTION (

3 голосов
/ 29 сентября 2011

это так же просто, как обновление не выдает ошибку, если нет данных.

вам нужно посмотреть значение TotalUpd, если вы хотите контролировать поток вашего кода

 DECLARE 
 TotalUpd   NUMBER(36) := 0;
 BEGIN
    dbms_output.put_line ('Job Start time............... : ' 
        || TO_CHAR(SYSDATE, '             hh24:mi:ss'));
    UPDATE Asset SET _status = 'PROGRESS' WHERE status IS null;
    TotalUpd := SQL%ROWCOUNT; 
    IF TotalUpd = 0 THEN
        dbms_output.put_line ('No more data to update.');
    ELSE
        dbms_output.put_line('Total Records Updated. : '
            || TotalUpd);
    END IF; 
    COMMIT; 
 EXCEPTION 
 WHEN OTHERS THEN
    dbms_output.put_line ('Error while status as SUCCESS '); 
 END; 
1 голос
/ 29 сентября 2011

NO_DATA_FOUND выбрасывается, если select into не возвращает ни одной строки, если не было обновлено ни одной строки после оператора обновления.

Я предлагаю вам перенести логику обработки этого исключения после самого обновления:

IF (SQL%ROWCOUNT = 0) THEN  
  dbms_output.put_line ('No more data to update.');
0 голосов
/ 29 сентября 2011

Думаю, что исключение NO_DATA_FOUND вызывается только оператором SELECT, который вы не используете.Попробуйте протестировать SQL% COUNT и при необходимости вывести результат.

...