2012-04-19 3 views
0

Моя хранимая процедура выглядит следующим образом:потока программы при обработке исключений 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_ 

ответ

1

Я подозреваю, что просто не хватает в вашем обновленном коде дополнительный BEGIN. Статья EXCEPTION всегда соответствует BEGIN и END. В коде, который вы опубликовали, EXCEPTION соответствует процедуре BEGIN. Это необходимо для соответствия BEGIN вложенного блока PL/SQL.

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 
    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; 

Как в сторону, кажется странным отказаться, а затем сразу же заново создать индекс в блоке PL/SQL. Если это так или иначе связано с вашим вопросом о recreating an index after a load, я боюсь, что вы, возможно, неправильно поняли мой ответ. В моем более раннем ответе я указывал, что может быть более эффективным отказаться от индекса, загрузить ваши 10 миллионов строк данных, а затем повторно создать индекс. Предполагая, что нагрузки происходят в вызовах хранимой процедуры, которые вы делаете в этом коде, вы хотите, чтобы индекс был заново создан. после загрузки завершены.

+0

Хорошо. Это многое объясняет. Я действительно неправильно понял. Я должен это исправить. Во всяком случае, допустим, по какой-то причине мне нужно это сделать. Я обновляю свой вопрос тем, что вы предложили, но есть некоторые ошибки. – BRabbit27

+0

@ BRabbit27 - Обновлен мой ответ. –

+0

Спасибо! Это то, что я искал. А также следуйте советам по другой теме. – BRabbit27

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