Ошибка компиляции PL / SQL во время обновления - PullRequest
1 голос
/ 03 января 2012

Запрос

DECLARE
  v_vendor_id NUMBER;
BEGIN
  FOR vp_rec IN ( SELECT * FROM vpprocess )
    LOOP
      SELECT i.vendor_id INTO v_vendor_id FROM item i, lineitems l WHERE l.itemid = i.itemid AND l.id = vp_rec.lineitemid;
        EXCEPTION
            WHEN no_data_found THEN SELECT 0 INTO v_vendor_id FROM dual;
      UPDATE vpprocess SET vendorid = v_vendor_id WHERE vpprocessid = vp_rec.vpprocessid;
    END;
  END LOOP;
END;

Сообщение об ошибке

 Error starting at line 1 in command:
DECLARE
  v_vendor_id NUMBER;
BEGIN
  FOR vp_rec IN ( SELECT * FROM vpprocess )
    LOOP
      SELECT i.vendor_id INTO v_vendor_id FROM item i, lineitems l WHERE l.itemid = i.itemid AND l.id = vp_rec.lineitemid;
        EXCEPTION
            WHEN no_data_found THEN SELECT 0 INTO v_vendor_id FROM dual;
      UPDATE vpprocess SET vendorid = v_vendor_id WHERE vpprocessid = vp_rec.vpprocessid;
    END;
  END LOOP;
END;
Error report:
ORA-06550: line 7, column 9:
PLS-00103: Encountered the symbol "EXCEPTION" when expecting one of the following:

   begin case declare end exit for goto if loop mod null pragma
   raise return select update while with <an identifier>
   <a double-quoted delimited-identifier> <a bind variable> <<
   close current delete fetch lock insert open rollback
   savepoint set sql execute commit forall merge pipe
ORA-06550: line 11, column 7:
PLS-00103: Encountered the symbol "LOOP" when expecting one of the following:

   ;
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

1 Ответ

2 голосов
/ 03 января 2012

Вы используете неправильный синтаксис для цикла FOR.Сообщение об ошибке говорит вам, что именно не так.Вместо слова BEGIN PUT LOOP.

Как личное правило, я никогда не использую BEGIN IN PL / SQL с очень немногими исключениями, например, если мне нужно перехватывать исключения только для определенногоблок кода, и этот код уже не является циклом, телом функции или чем-либо еще.

Редактирование на основе редактирования OP: похоже, это один из таких случаев.Попробуйте следующее:

DECLARE
  v_vendor_id NUMBER;
BEGIN
  FOR vp_rec IN ( SELECT * FROM vpprocess )
    LOOP
     BEGIN
       SELECT i.vendor_id INTO v_vendor_id FROM item i, lineitems l WHERE l.itemid = i.itemid AND l.id = vp_rec.lineitemid;
        EXCEPTION
            WHEN no_data_found THEN v_vendor_id := 0;
      END;  
      UPDATE vpprocess SET vendorid = v_vendor_id WHERE vpprocessid = vp_rec.vpprocessid;
    /* END; has been removed */
    END LOOP;
END;
...