Моя хранимая процедура выглядит следующим образом:потока программы при обработке исключений PLSQL
sqlQuery := 'DROP INDEX idArchivoIndex';
EXECUTE IMMEDIATE sqlQuery;
EXCEPTION --En caso de que no exista el índice capturamos la excepcion
WHEN index_not_exists THEN NULL; --y la ignoramos
sqlQuery := 'CREATE INDEX idArchivoIndex'||
' ON '||qusuario||' (id_archivo)';
EXECUTE IMMEDIATE sqlQuery;
doresetvalidacion(qusuario, idarchivo);
IF (tipoDependencia = 'PEC') THEN
dovalidapec(qusuario,qaniofiscal,idarchivo,imprimirMensajes);
COMMIT;
ELSIF (tipoDependencia = 'SAGARPA') THEN
dovalidacionpec(qusuario,qaniofiscal,idarchivo,imprimirMensajes);
COMMIT;
END IF;
Если исключение не вызывается процедура просто падает индекс, но индекс не воссоздан! Я думал, что эта часть кода
EXCEPTION
WHEN index_not_exists THEN NULL;
Обработано сообщение об ошибке, а затем продолжите код под ним. Теперь, когда я вижу результаты, что после того, как EXCEPTION
выполняется в том и только в том случае, если было создано исключение.
Я хочу, чтобы упростить мой код, я не хочу копировать один и тот же блок кода перед предложением EXCEPTION
, чтобы заставить его работать так, как я ожидаю. Есть ли способ достичь этого? Может быть, с вложенным блоком BEGIN ... END
? Или мне придется сделать отдельную процедуру для повторного использования кода?
Cheers.
UPDATE
create or replace
PROCEDURE DOVALIDAINFORMACION
(
QARCHIVO IN VARCHAR2
, QUSUARIO IN VARCHAR2
, QANIOFISCAL IN VARCHAR2
) AS
imprimirMensajes CHAR;
tipoDependencia VARCHAR2(25);
idArchivo NUMBER;
sqlQuery VARCHAR2(100);
index_not_exists EXCEPTION;
PRAGMA EXCEPTION_INIT(index_not_exists, -1418);
BEGIN
sqlQuery := 'DROP INDEX idArchivoIndex';
EXECUTE IMMEDIATE sqlQuery;
----------------------
EXCEPTION --En caso de que no exista el índice capturamos la excepcion
WHEN index_not_exists THEN --y la ignoramos
NULL;
END;
----------------------
sqlQuery := 'CREATE INDEX idArchivoIndex'||
' ON '||qusuario||' (id_archivo)';
EXECUTE IMMEDIATE sqlQuery;
doresetvalidacion(qusuario, idarchivo);
IF (tipoDependencia = 'PEC') THEN
dovalidapec(qusuario,qaniofiscal,idarchivo,imprimirMensajes);
COMMIT;
ELSIF (tipoDependencia = 'SAGARPA') THEN
dovalidacionpec(qusuario,qaniofiscal,idarchivo,imprimirMensajes);
COMMIT;
END IF;
END DOVALIDAINFORMACION;
Но не может скомпилировать процедуру.
Error(32,3): PLS-00103: Se ha encontrado el símbolo "SQLQUERY"
Error(33,48): PLS-00103: Se ha encontrado el símbolo ";" cuando se esperaba uno de los siguientes: ) , * & = - + </> at in is mod remainder not rem <an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_ LIKE4_ LIKEC_ between || member SUBMULTISET_
Хорошо. Это многое объясняет. Я действительно неправильно понял. Я должен это исправить. Во всяком случае, допустим, по какой-то причине мне нужно это сделать. Я обновляю свой вопрос тем, что вы предложили, но есть некоторые ошибки. – BRabbit27
@ BRabbit27 - Обновлен мой ответ. –
Спасибо! Это то, что я искал. А также следуйте советам по другой теме. – BRabbit27