0

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

我敢打赌,当我试图捕捉异常并且我使用EXCEPTION WHEN OTHERS THEN 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;
4

1 回答 1

3

1) 打开一个 SQL*Plus 会话(会话 A)。获取该会话的SIDSERIAL#. 写下这些数字。

SELECT sid, serial#
  FROM v$session
 WHERE sid = (select distinct sid from v$mystat);

2) 打开第二个 SQL*Plus 会话(会话 B)连接到与 A 相同的数据库。

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

这将向您显示SID持有该过程锁定的会话。或者,dba_waiters应该有类似的信息。

SELECT waiting_session,
       holding_session,
       lock_type,
       mode_held,
       mode_requested
  FROM dba_waiters
 WHERE waiting_session = <<sid from step 1>>

5) 一旦你确定了哪个会话持有锁,你可以要求 DBA 终止会话。

于 2012-05-15T21:05:37.160 回答