1

我的存储过程如下所示:

  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块?还是我必须制定一个单独的程序来重用代码?

干杯。

更新

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_ 
4

1 回答 1

2

我怀疑这只是BEGIN在您更新的代码中遗漏了一个额外的内容。EXCEPTION子句始终与 aBEGIN和 an匹配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 块中删除然后立即重新创建索引似乎很奇怪。如果这与您关于在 load 后重新创建索引的问题有关,恐怕您可能误解了我的回答。在我之前的回答中,我指出删除索引、加载 1000 万行数据然后重新创建索引可能更有效。假设加载发生在您在此代码中进行的存储过程调用中,您可能希望在加载完成重新创建索引。

于 2012-04-19T21:12:29.360 回答