Исключения PL/SQL при обновлении/удалении несуществующей строки

Я изучаю PL/SQL в эти дни и в настоящее время работаю с процедурами и исключениями с использованием схемы HR oracle.

Вот моя простая процедура.

create or replace
PROCEDURE DEL_JOB
(p_jobid jobs.job_id%TYPE)
AS 
sqle NUMBER; 
sqlm VARCHAR2(300);
BEGIN
DELETE FROM JOBS 
WHERE JOB_ID = UPPER(p_jobid);
IF SQL%NOTFOUND THEN
  DBMS_OUTPUT.PUT_LINE('No such record');
END IF;
EXCEPTION
 WHEN OTHERS THEN
  sqle := SQLCODE;
  sqlm := SQLERRM;
  DBMS_OUTPUT.PUT_LINE('There is no job with this id that could be deleted');
  DBMS_OUTPUT.PUT_LINE('Error Code ='||sqle||' Error message =' ||sqlm);
END;

При выполнении этой процедуры вывод

  No such record
  PL/SQL procedure successfully complete. 

Однако, согласно Oracle PDF, он должен выдать исключение, и я должен действительно получить сообщение, которое я ввел в исключение.

То же самое произошло с Update on non existing record. Пожалуйста, порекомендуйте. Благодаря

Ответ 1

Я верю, что SQL%NOTFOUND возвращает true, когда записи не найдены. Ваш IF будет оценивать значение true в этом случае и, следовательно, напишет ваш put_line на терминал. Оператор SQL выполнен успешно. Если вы выполните этот оператор SQL из командной строки, вы получите 0 строк, обновленных/удаленных, а не ошибки Oracle.

Если вы хотите создать исключение, вы можете использовать RAISE внутри вашего IF и указать его на исключение в блоке исключений, который вы хотите выбросить.

Ответ 2

Нет "исключения" - sql успешно выполнен. Он успешно удалил каждую запись, которая соответствовала критериям..., которая составляла 0 записей. То же самое, если аналогичный оператор обновления был выполнен. Вы использовали SQL% NOTFOUND для определения отсутствия записей, которые были затронуты, но это не означает, что существует "исключение".

Возможно, вы думаете об исключении NO_DATA_FOUND Exception, если вы попытаетесь выполнить предложение "select into" и не найдете соответствующих записей.

Ответ 3

чтобы сделать это, вам нужно использовать

IF SQL%ROWCOUNT = 0 THEN
    RAISE no_delete;
END IF;

и определите