无法编译PLSQL过程
这个过程更新了一个表,在这个表中我记录了一个(非常基本的)历史工作。问题是我不能再修改或编译它了。我不知道我是否在这个过程中犯了错误,一个无限循环正在进行。我的DBA已经检查了这个过程,似乎一切正常,但我仍然无法更改它,请使用它 我敢打赌,当我试图捕获异常时,当其他异常为NULL时,我使用无法编译PLSQL过程,plsql,oracle10g,infinite-loop,Plsql,Oracle10g,Infinite Loop,这个过程更新了一个表,在这个表中我记录了一个(非常基本的)历史工作。问题是我不能再修改或编译它了。我不知道我是否在这个过程中犯了错误,一个无限循环正在进行。我的DBA已经检查了这个过程,似乎一切正常,但我仍然无法更改它,请使用它 我敢打赌,当我试图捕获异常时,当其他异常为NULL时,我使用异常,循环被卡住 有什么建议吗 干杯 create or replace PROCEDURE DOACTUALIZARHISTORIALEM ( QUSUARIO IN VARCHAR2 , QARC
异常,循环被卡住
有什么建议吗
干杯
create or replace
PROCEDURE DOACTUALIZARHISTORIALEM
(
QUSUARIO IN VARCHAR2
, QARCHIVO IN VARCHAR2
, QANIOFISCAL IN VARCHAR2
, QFECHAPROCESAMIENTO IN DATE
) AS
cursorEstatus SYS_REFCURSOR;
sqlQueryA VARCHAR2(200);
sqlQueryB VARCHAR2(200);
idArchivo INTEGER;
idPrograma VARCHAR2(10);
idComponente VARCHAR2(10);
sumaSolicitado DECIMAL;
sumaAprobado DECIMAL;
sumaPagado DECIMAL;
BEGIN
idArchivo := getidarchivo(qarchivo,getidusuario(qusuario),qaniofiscal);
sqlQueryA := 'SELECT programa, componente'||
' FROM '||qusuario||
' WHERE id_archivo = :1';
OPEN cursorEstatus FOR sqlQueryA USING idArchivo;
LOOP
FETCH cursorEstatus INTO idPrograma, idComponente;
EXIT WHEN cursorEstatus%NOTFOUND;
BEGIN
sqlQueryB := 'SELECT sum(monto_federal) '||
' FROM '||qusuario||
' WHERE programa = :1'||
' AND componente = :2'||
' AND estatus_monto = 1'||
' AND status = 1';
EXECUTE IMMEDIATE sqlQueryB
INTO sumaSolicitado
USING idPrograma, idComponente;
INSERT INTO src_historialem VALUES (idArchivo,
qfechaprocesamiento,
idPrograma,
idComponente,
1,
sumaSolicitado);
COMMIT;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
BEGIN
sqlQueryB := 'SELECT sum(monto_federal) '||
' FROM '||qusuario||
' WHERE programa = :1'||
' AND componente = :2'||
' AND estatus_monto = 2'||
' AND status = 1';
EXECUTE IMMEDIATE sqlQueryB
INTO sumaAprobado
USING idPrograma, idComponente;
INSERT INTO src_historialem VALUES (idArchivo,
qfechaprocesamiento,
idPrograma,
idComponente,
2,
sumaSolicitado);
COMMIT;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
BEGIN
sqlQueryB := 'SELECT sum(monto_federal) '||
' FROM '||qusuario||
' WHERE programa = :1'||
' AND componente = :2'||
' AND estatus_monto = 3'||
' AND status = 1';
EXECUTE IMMEDIATE sqlQueryB
INTO sumaPagado
USING idPrograma, idComponente;
INSERT INTO src_historialem VALUES (idArchivo,
qfechaprocesamiento,
idPrograma,
idComponente,
3,
sumaSolicitado);
COMMIT;
EXCEPTION
WHEN OTHERS THEN NULL;
END;
END LOOP;
CLOSE cursorEstatus;
END DOACTUALIZARHISTORIALEM;
1) 打开SQL*Plus会话(会话a)。获取该会话的SID
和SERIAL
。把那些数字写下来
SELECT sid, serial#
FROM v$session
WHERE sid = (select distinct sid from v$mystat);
2) 打开与a连接到同一数据库的第二个SQL*Plus会话(会话B)
3) 在会话A中,尝试编译代码
4) 在会话B中,运行该查询
SELECT blocking_session_status,
blocking_instance,
blocking_session
FROM v$session
WHERE sid = <<sid from step 1>>
AND serial# = <<serial# from step 1>>
5) 一旦确定哪个会话持有锁,就可以要求DBA终止该会话。1)打开SQL*Plus会话(会话a)。获取该会话的SID
和SERIAL
。把那些数字写下来
SELECT sid, serial#
FROM v$session
WHERE sid = (select distinct sid from v$mystat);
2) 打开与a连接到同一数据库的第二个SQL*Plus会话(会话B)
3) 在会话A中,尝试编译代码
4) 在会话B中,运行该查询
SELECT blocking_session_status,
blocking_instance,
blocking_session
FROM v$session
WHERE sid = <<sid from step 1>>
AND serial# = <<serial# from step 1>>
5) 一旦确定哪个会话持有锁,您就可以要求DBA终止该会话。您不能再编译它是什么意思?你是说当你编译它时你会出错吗?如果是,有哪些错误?你是说这个过程可以编译,但是当你执行它的时候它会永远运行吗?当你执行它时,它会抛出错误?还有什么?当我通过SqlPlus编译它时,没有错误,没有警告,只是在很长一段时间后,它发送超时。当从webApp调用该过程时,将显示相同的结果,没有错误,也没有警告。试图删除它,但同样,在很长一段时间后给出超时,只是不删除它。“发送超时”是什么意思?你有错误吗?如果是,什么错误?第1行错误:ORA-04021:等待锁定对象测试时发生超时。DOACTUALIZARHISTORIALEMOK。所以你得到了一个错误。是否有其他会话正在执行此过程?您不能再编译它是什么意思?你是说当你编译它时你会出错吗?如果是,有哪些错误?你是说这个过程可以编译,但是当你执行它的时候它会永远运行吗?当你执行它时,它会抛出错误?还有什么?当我通过SqlPlus编译它时,没有错误,没有警告,只是在很长一段时间后,它发送超时。当从webApp调用该过程时,将显示相同的结果,没有错误,也没有警告。试图删除它,但同样,在很长一段时间后给出超时,只是不删除它。“发送超时”是什么意思?你有错误吗?如果是,什么错误?第1行错误:ORA-04021:等待锁定对象测试时发生超时。DOACTUALIZARHISTORIALEMOK。所以你得到了一个错误。是否有其他会话正在执行此过程?我将检查它。有一件事,可能是我的过程创建了一个无限循环,因此使用它的会话会无限期地锁定它吗?@BRabbit27-如果会话拥有锁,那么您的会话将立即被授予锁。您无法将自己的会话锁定在外。您的代码完全可能实现无限循环,因此,对过程的调用永远不会返回。但那将是另一个错误。谢谢,我们找到了阻塞的对象,它现在可以工作了。我会检查它。有一件事,可能是我的过程创建了一个无限循环,因此使用它的会话会无限期地锁定它吗?@BRabbit27-如果会话拥有锁,那么您的会话将立即被授予锁。您无法将自己的会话锁定在外。您的代码完全可能实现无限循环,因此,对过程的调用永远不会返回。但那将是另一个错误。谢谢,我们找到了阻塞的对象,它现在可以工作了。