2012-04-19 104 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块?或者我将不得不做一个单独的过程来重用代码?

干杯。

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总是与BEGINEND匹配。在您发布的代码中,EXCEPTION与过程的BEGIN相匹配。您需要它来匹配嵌套的PL/SQL块的BEGIN

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的问题有某种关系,恐怕你可能误解了我的答案。在我之前的回答中,我指出删除索引,加载1000万行数据,然后重新创建索引可能更有效。假设负载发生在您在此代码中进行的存储过程调用中,您会希望在负载完成后之后重新创建索引

+0

好的。这解释了很多。我其实误解了。我得纠正它。无论如何,让我们说出于某种原因,我需要这样做。我用你的建议更新我的问题,但有一些错误。 – BRabbit27 2012-04-19 21:21:03

+0

@ BRabbit27 - 更新了我的答案。 – 2012-04-19 21:25:46

+0

谢谢!这就是我一直在寻找的。并按照您的建议在其他线程。 – BRabbit27 2012-04-19 21:39:29