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-更新了我的答案。谢谢!这就是我要找的。同时也要按照你的建议去做。