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

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

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

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, это должно вызвать исключение, и я действительно должен получить сообщение, которое я ввел в исключении,

То же самое произошло с обновлением несуществующей записи.Пожалуйста, порекомендуйте.Спасибо

Ответы [ 3 ]

12 голосов
/ 13 января 2012

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

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

10 голосов
/ 13 января 2012

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

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

2 голосов
/ 04 апреля 2014

для этого нужно использовать

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

и определите свой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...