2013-02-20 2 views
0

Я понимаю, что на этот вопрос уже был дан ответ, и я затронул этот вопрос. Однако, когда я пытаюсь скомпилировать следующий код, в котором я пытаюсь пройти через LOOP, который содержит инструкцию INSERT, если оператор insert не работает, мне нужно проверить, является ли ошибка, вызванная сбой DML-вставки, ограничением UNIQUE или нет, если это уникальная ошибка ограничения (-1), тогда мне нужно выполнить инструкцию update и продолжить цикл.Продолжение цикла из блока исключений

Oracle Версия: 11g

CREATE OR REPLACE PROCEDURE "TESTSAMPLE" AS 



type array_test IS TABLE OF NUMBER; 

test_arr array_test := array_test(1, 2, 3); 

v_key NUMBER; 
dup_chk NUMBER; 
v_excp_error_code varchar2(25); 


BEGIN 

    FOR i IN test_arr.FIRST .. test_arr.LAST 

    LOOP 

    DBMS_OUTPUT.PUT_LINE(i || ' = ' || test_arr(i)); 
    dup_chk := test_arr(i); 
    INSERT 
    INTO trig_test 
    VALUES('TEST324', test_arr(i), 'Y', 'Y') returning KEY 
    INTO v_key; 

    IF v_key IS NOT NULL THEN 
     DBMS_OUTPUT.PUT_LINE(' commiting insert ' || v_key || ' ' || dup_chk); 
     COMMIT; 
    END IF; 

    EXCEPTION 
    WHEN OTHERS THEN 
    v_excp_error_code := SQLCODE; 
    DBMS_OUTPUT.PUT_LINE('ERROR CODE = ' || v_excp_error_code); 

    IF v_excp_error_code = '-1' THEN 
     DBMS_OUTPUT.PUT_LINE('entered unique constraint exception ' || v_key); 

     IF v_key = dup_chk OR v_key IS NULL THEN 

     UPDATE trig_test 
     SET status = 'tstsample' 
     WHERE KEY = v_key; 
     DBMS_OUTPUT.PUT_LINE('updated '); 
     COMMIT; 

     END IF; 

    ELSE 
     RAISE; 
    END IF; 
    END; 

    END LOOP; 

END testsample; 

выше хранимая процедура бросает следующую ошибку компиляции,

Ошибка (33,3): PLS-00103: Встречающиеся символ "исключение", когда ожидают одно из следующего: (начало case declare end exit для goto if loop mod null pragma raise return select update while with < < продолжить закрыть текущий удалить выборка блокировка вставка открыть rollback сохранить точку set sql выполнить commit forall merge очистить трубку

Ошибка (56,7): PLS-00103: встречается символ «LOOP» при ожидании одного из следующих:;

Error (59): PLS-00103: Обнаружен символ «конец файла», когда ожидает одно из следующих действий: конца не Pragma окончательного инстанциируемого порядка переопределении статического член конструктора карты

Высоко ценит ваш помочь

Благодаря

+0

Если вы не знаете, существует именованное исключение DUP_VAL_ON_INDEX, вы можете напрямую поймать вместо того, чтобы ловить ДРУГИЕ, а затем проверять SQLCODE: http://www.techonthenet.com/oracle/exceptions/named_system.php – Ben

ответ

2

вы пропускаете begin после вашего цикла. то есть:

loop 

    begin -- ADD THIS 
    dbms_output.put_line(i || ' = ' || test_arr(i)); 
    dup_chk := test_arr(i); 
    insert into trig_test 
    values 
     ('TEST324', test_arr(i), 'Y', 'Y') 
    returning key into v_key; 

    if v_key is not null 
    then 
     dbms_output.put_line(' commiting insert ' || v_key || ' ' || dup_chk); 
     commit; 
    end if; 

    exception 

вместо захвата others, хотя, как ваш заинтересован только в ORA-00001 вы можете просто ловушку when dup_val_on_index вместо этого и не проверять SQLCODE.

+0

Привет, Dazzal , blooper с моей стороны ... извините и очень спасибо за предложение. – chebus

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