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) を開きます。そのセッションのSIDと を取得しSERIAL#ます。それらの数字を書き留めてください。

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

2) A と同じデータベースに接続する 2 番目の 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>>

これ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 に答える