2012-04-19 173 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