无法编译PLSQL过程

无法编译PLSQL过程,plsql,oracle10g,infinite-loop,Plsql,Oracle10g,Infinite Loop,这个过程更新了一个表,在这个表中我记录了一个(非常基本的)历史工作。问题是我不能再修改或编译它了。我不知道我是否在这个过程中犯了错误,一个无限循环正在进行。我的DBA已经检查了这个过程,似乎一切正常,但我仍然无法更改它,请使用它 我敢打赌,当我试图捕获异常时,当其他异常为NULL时,我使用异常,循环被卡住 有什么建议吗 干杯 create or replace PROCEDURE DOACTUALIZARHISTORIALEM ( QUSUARIO IN VARCHAR2 , QARC

这个过程更新了一个表,在这个表中我记录了一个(非常基本的)历史工作。问题是我不能再修改或编译它了。我不知道我是否在这个过程中犯了错误,一个无限循环正在进行。我的DBA已经检查了这个过程,似乎一切正常,但我仍然无法更改它,请使用它

我敢打赌,当我试图捕获异常时,当其他异常为NULL时,我使用
异常,循环被卡住

有什么建议吗

干杯

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-如果会话拥有锁,那么您的会话将立即被授予锁。您无法将自己的会话锁定在外。您的代码完全可能实现无限循环,因此,对过程的调用永远不会返回。但那将是另一个错误。谢谢,我们找到了阻塞的对象,它现在可以工作了。