sql >> データベース >  >> RDS >> Oracle

PL/SQL出力をリアルタイムで実現

    これは私が使用する種類のものです(出力はv$sessionとv$session_longopsで確認できます)...

    DECLARE
       lv_module_name   VARCHAR2(48);
       lv_action_name   VARCHAR2(32);
    
       gc_MODULE   CONSTANT   VARCHAR2(48) := 'MY_PROC';
    
       -- For LONGOPS
       lv_rindex BINARY_INTEGER;
       lv_slno   BINARY_INTEGER;
    
       lc_OP_NAME   CONSTANT   VARCHAR2(64)   :=   '['||gc_MODULE||']';
       lv_sofar   NUMBER;
    
       -- This is a guess as to the amount of work we will do
       lv_totalwork   NUMBER;
       lc_TARGET_DESC   CONSTANT VARCHAR2(64) := 'Tables';
       lc_UNITS   CONSTANT VARCHAR2(64) := 'Rows';
    
       CURSOR tab_cur
       IS
          SELECT owner, table_name
            FROM all_tables;
    
    BEGIN
       <<initialisation>>
       BEGIN
          -- To preserve the calling stack, read the current module and action
          DBMS_APPLICATION_INFO.READ_MODULE( module_name => lv_module_name
                                           , action_name => lv_action_name );
    
          -- Set our current module and action
          DBMS_APPLICATION_INFO.SET_MODULE( module_name => gc_MODULE
                                          , action_name => NULL );
       END initialisation;
    
       <<main>>
       BEGIN
          DBMS_APPLICATION_INFO.SET_ACTION( action_name => 'Part 01' );
          NULL;
    
          DBMS_APPLICATION_INFO.SET_ACTION( action_name => 'Part 02' );
          FOR tab_rec IN tab_cur
          LOOP
             DBMS_APPLICATION_INFO.SET_CLIENT_INFO( client_info => 'Rows = ['||TO_CHAR( tab_cur%ROWCOUNT, '999,999,999' )||']' );
             NULL;
          END LOOP;
    
          DBMS_APPLICATION_INFO.SET_ACTION( action_name => 'Part 03' );
    
          --Initialising longops
          lv_rindex := DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS_NOHINT;
          lv_sofar := 0;
          lv_totalwork := 5000; -- This is a guess, but could be actual if the query is quick
    
          FOR tab_rec IN tab_cur
          LOOP
             DBMS_APPLICATION_INFO.SET_CLIENT_INFO( client_info => 'Rows = ['||TO_CHAR( tab_cur%ROWCOUNT, '999,999,999' )||']' );
    
             lv_sofar := lv_sofar + 1;
    
             -- Update our totalwork guess
             IF lv_sofar > lv_totalwork
             THEN
                lv_totalwork := lv_totalwork + 500;
             END IF;
    
             DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS( rindex      => lv_rindex
                                                      , slno        => lv_slno
                                                      , op_name     => lc_OP_NAME
                                                      , sofar       => lv_sofar
                                                      , totalwork   => lv_totalwork
                                                      , target_desc => lc_TARGET_DESC
                                                      , units       => lc_UNITS
                                                      );
          END LOOP;
    
          -- Clean up longops
          DBMS_APPLICATION_INFO.SET_SESSION_LONGOPS( rindex      => lv_rindex
                                                   , slno        => lv_slno
                                                   , op_name     => lc_OP_NAME
                                                   , sofar       => lv_sofar
                                                   , totalwork   => lv_sofar
                                                   , target_desc => lc_TARGET_DESC
                                                   , units       => lc_UNITS
                                                   );
       END main;
    
       <<finalisation>>
       BEGIN
          -- Reset the module and action to the values that may have called us
          DBMS_APPLICATION_INFO.SET_MODULE( module_name => lv_module_name
                                          , action_name => lv_action_name );
    
          -- Clear the client info, preventing any inter process confusion for anyone looking at it
          DBMS_APPLICATION_INFO.SET_CLIENT_INFO( client_info => NULL );
       END finalisation;
    END;
    /
    


    1. T-SQLを使用して一時テーブルを一覧表示する5つの方法

    2. MySQLで過去15日間のレコードを取得する方法

    3. SQL Server(T-SQL)で10進数を16進数に変換する3つの方法

    4. SQLServerのロックを使用してトランザクションの同時実行性を管理する