Передача данных, когда запрос возвращает значение и нет «EXCEPTION WHEN NO_DATA_FOUND THEN» (Oracle 11g) - PullRequest
0 голосов
/ 29 января 2019

Я создал процедуру для обновления моей таблицы t_ritm.Сначала я выбираю rrcd_qnty (это количество моего продукта) идентификатора продукта из таблицы t_rrcd.Затем я обновляю значение rrcd_qnty в таблице t_ritm.

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

procedure update_ritm_new_rate(p_oid in varchar2, p_ritm_rate in varchar2, p_euser in varchar2)
is
nrate varchar2(4);
begin
    SELECT rrcd_rate into nrate 
    FROM (select oid, t_rrcd.rrcd_rate 
           from t_rrcd 
           where rrcd_ritm= p_oid 
           ORDER BY oid DESC ) 
    WHERE rownum <= 1 
    ORDER BY rownum DESC ;  
EXCEPTION  
    WHEN NO_DATA_FOUND THEN  nrate := 0; 


    update t_ritm 
    set ritm_rate = nrate, euser = p_euser, edat = sysdate  
    where oid = p_oid;
    commit;
end update_ritm_new_rate;

Часть моего идентификатора продукта Количество было null.поэтому я получаю No_Data_Found ошибку.Но когда и какой идентификатор продукта имеет значение Количество, они были успешно обновлены.Чтобы избежать No_Data_Found, я использовал EXCEPTION WHEN NO_DATA_FOUND THEN nrate := 0;, который решил мою ошибку no_Data_Found.Но когда идентификатор продукта имеет количественное значение, они не обновлялись.

Я много раз искал эту проблему, но не нашел хорошего решения.Что должно быть лучшим способом избежать ошибки No_Data_Found?Могу ли я передать свое значение, если не получаю ошибку No_Data_Found?

заранее благодарю

Ответы [ 2 ]

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

Я исправил проблему, добавив ИСКЛЮЧЕНИЕ, КОГДА NO_DATA_FOUND THEN nrate: = 0; после запроса на обновление.

procedure update_ritm_new_rate(p_oid in varchar2, p_ritm_rate in varchar2, p_euser in varchar2)
is
nrate varchar2(4);
begin
    SELECT rrcd_rate into nrate FROM (select oid, t_rrcd.rrcd_rate  from t_rrcd where rrcd_ritm= p_oid ORDER BY oid DESC ) 
    WHERE rownum <= 1 ORDER BY rownum DESC ;  

    update t_ritm set ritm_rate = nrate, euser = p_euser, edat = sysdate  where oid = p_oid;
    commit;

    EXCEPTION  WHEN NO_DATA_FOUND THEN  nrate := 0;
end update_ritm_new_rate; 
0 голосов
/ 29 января 2019

Это потому, что - если ваш SELECT что-то возвращает, он никогда не достигнет UPDATE, поскольку он скрыт за обработчиком EXCEPTION.

Поэтому заключите его (SELECT) в свой собственный блок BEGIN-END и поместите из него UPDATE, чтобы он выполнялся с любым значением NRATE.

PROCEDURE update_ritm_new_rate (p_oid         IN VARCHAR2,
                                p_ritm_rate   IN VARCHAR2,
                                p_euser       IN VARCHAR2)
IS
   nrate   VARCHAR2 (4);
BEGIN
   BEGIN                                               --> this
        SELECT rrcd_rate
          INTO nrate
          FROM (  SELECT oid, t_rrcd.rrcd_rate
                    FROM t_rrcd
                   WHERE rrcd_ritm = p_oid
                ORDER BY oid DESC)
         WHERE ROWNUM <= 1
      ORDER BY ROWNUM DESC;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         nrate := 0;
   END;                                               --> this

   UPDATE t_ritm
      SET ritm_rate = nrate, euser = p_euser, edat = SYSDATE
    WHERE oid = p_oid;

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