Stored procedures 处理异常PLSQL时的程序流

Stored procedures 处理异常PLSQL时的程序流,stored-procedures,exception-handling,plsql,oracle10g,Stored Procedures,Exception Handling,Plsql,Oracle10g,我的存储过程如下所示: 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 idArchiv

我的存储过程如下所示:

  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
子句之前复制粘贴相同的代码块,只是为了让它像我期望的那样工作。有没有办法做到这一点?可能使用嵌套的
开始。。。结束
block?或者我必须制定一个单独的过程来重用代码

干杯

更新

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_ 
错误(32,3):PLS-00103:Se ha encontrado el símbolo“SQLQUERY”

错误(33,48):PLS-00103:Se ha encontrado el símbolo“;“s esperaba uno de los siguientes:),*&=-+在模块剩余部分不是rem或!=或者~=>=我怀疑您的更新代码中缺少了一个额外的
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块中删除然后立即重新创建索引似乎有些奇怪。如果这与你的问题有关,恐怕你误解了我的答案。在我之前的回答中,我指出删除索引、加载1000万行数据,然后重新创建索引可能更有效。假设加载发生在您在此代码中进行的存储过程调用中,您希望在加载完成后重新创建索引。

Ok。这解释了很多。我真的误解了。我必须纠正它。不管怎样,让我们说,出于某种原因,我需要这样做。我用你的建议更新了我的问题,但有一些错误。@BRabbit27-更新了我的答案。谢谢!这就是我要找的。同时也要按照你的建议去做。