Я понимаю, что на этот вопрос уже был дан ответ, и я затронул этот вопрос. Однако, когда я пытаюсь скомпилировать следующий код, в котором я пытаюсь пройти через 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 окончательного инстанциируемого порядка переопределении статического член конструктора карты
Высоко ценит ваш помочь
Благодаря
Если вы не знаете, существует именованное исключение DUP_VAL_ON_INDEX, вы можете напрямую поймать вместо того, чтобы ловить ДРУГИЕ, а затем проверять SQLCODE: http://www.techonthenet.com/oracle/exceptions/named_system.php – Ben