Oracle pl / sql Процедура обновления таблицы - обработка исключений - PullRequest
0 голосов
/ 16 января 2019

Это мой первый запрос на PL / SQL, и я потратил час, пытаясь найти ответы в сети, в любом случае - вот так.

Я пишу процедуру для обновления таблицы, и все работает нормально, однако когда я набрал текст для обновления job_id, который не существует, я ожидал, что моя обработка исключений скажет мне, что job_id неверно, однако я не получил сообщение об ошибке.

Мой код выглядит следующим образом:

CREATE OR REPLACE PROCEDURE UPD_JOB(p_job_id jobs.job_id%TYPE, p_jobnew jobs.job_title%TYPE)
IS
BEGIN
UPDATE JOBS SET job_title =p_jobnew WHERE JOB_ID = p_job_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('No rows have been updated');
END;
/

Затем я попытался обновить job_id, который, как я знал, не существует, чтобы увидеть, работает ли исключение, набрав следующее

EXECUTE UPD_JOB('ABCXXX','WILL FAIL');

1 Ответ

0 голосов
/ 16 января 2019

С «Обработка ошибок PL / SQL» :

NO_DATA_FOUND

Оператор SELECT INTO не возвращает строк, или ваша программа ссылается на удаленный элемент во вложенной таблице или неинициализированный элемент в таблице index-by. Агрегатные функции SQL, такие как AVG и SUM, всегда возвращают значение или ноль. Таким образом, оператор SELECT INTO, который вызывает агрегатную функцию, никогда не вызывает NO_DATA_FOUND. Ожидается, что оператор FETCH в конечном итоге не будет возвращать никаких строк, поэтому, когда это происходит, исключение не вызывается.

Вы не используете оператор, который вызвал бы исключение NO_DATA_FOUND.

Может быть, вы можете использовать SQL%ROWCOUNT. От «Выполнение операций SQL из PL / SQL» :

Чтобы узнать, на сколько строк влияют операторы DML, вы можете проверить значение SQL%ROWCOUNT ...

CREATE OR REPLACE PROCEDURE UPD_JOB (p_job_id jobs.job_id%TYPE,
                                     p_jobnew jobs.job_title%TYPE)
IS
BEGIN
  UPDATE JOBS
         SET job_title = p_jobnew
         WHERE JOB_ID = p_job_id;

  IF SQL%ROWCOUNT = 0 THEN
    DBMS_OUTPUT.PUT_LINE('No rows have been updated');
  END IF;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...