2012-01-03 5 views
1

QueryPL/SQL ошибка компиляции во время обновления

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: 

ответ

2

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

В качестве личного правила я никогда не использую BEGIN В 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; 
+0

Dan: Я попытался заменить LOOP, но это не помогло. Я обновляю ошибку, а также запрос. –

+1

Хорошо, я обновил свой ответ. У меня больше нет Oracle, поэтому это предположение. Но в основном «ИСКЛЮЧЕНИЕ КОГДА» - это функция масштаба блока, поэтому вам нужно создать внутренний блок вокруг _only_ этих операторов (в вашем случае, одного оператора), где вы хотите отловить исключения. – Dan

Смежные вопросы