0

plsql パッケージを介してロードされた AN_REMEDIATION_MATRIX という名前のテーブルがあります。

以下の構造を持つログテーブル MD_RUNS_STEP があります。

STEP_ID       NOT NULL NUMBER        
RUN_TYPE               VARCHAR2(10)  
RUN_START              DATE          
RUN_END                DATE          
RUN_SUCCESS            NUMBER        
USERNAME               VARCHAR2(30)  
RUN_ID        NOT NULL NUMBER        
RUN_ROLLBACK           NUMBER        
STEP_ID_PREV           NUMBER        
SYSID                  VARCHAR2(9)   
PROGRESS               VARCHAR2(500) 
STAT_RECS              NUMBER        
STAT_CPU               NUMBER        
STAT_TIME              NUMBER        
STAT_SEQ_READ          NUMBER        
STAT_SCT_READ          NUMBER

ここで、パッケージが実行されているときに、このログ テーブルに上記の値をロードする必要があります。
これはどのように行うことができますか?私はオラクルが初めてなので、それがどのように機能するのかわかりません。

返信をお待ちしております。

ありがとうございました

4

2 に答える 2

2

このログ テーブルに自動的に入力する Oracle 固有の方法/設定はありません。これはアプリケーションに固有であるため、これらの列の意味を理解したら、pl/sql プロシージャにコードを追加して、必要に応じてログを取得できます。一部の列は簡単で、通常はこのようにコードが表示されます。

現在のプロシージャ current が次のようになっているとしましょう..

create or replace procedure p_INS_AN_REMEDIATION_MATRIX
as
BEGIN
  insert into p_INS_AN_REMEDIATION_MATRIX(.....) values (.....);
  update p_INS_AN_REMEDIATION_MATRIX set... where ...;
  commit;
END;
/

いくつかのログ列を見てみましょう..(STEP_ID、RUN_START、RUN_END、RUN_SUCCESS)。変更後、コードは次のようになります

create or replace procedure p_INS_AN_REMEDIATION_MATRIX
as
  procedure add_new_log (i_step_id) is
    pragma autonomous_transaction;
  begin
    insert into MD_RUNS_STEP (i_step_id, run_start) 
        values (i_step_id, sysdate);
     commit;
  end;

  procedure update_status (i_step_id, i_status) 
  .....
  end;

  v_step_id number;

BEGIN

  select run_step_id_seq.nextval into v_step_id from dual;

  add_new_log(v_step_id);

  insert into p_INS_AN_REMEDIATION_MATRIX(.....) values (.....);
  update p_INS_AN_REMEDIATION_MATRIX set... where ...;
  commit;

  update_status(i_step_id,'SUCCESS'); --will set the load finish time as well.

EXCEPTION
  WHEN OTHERS THEN
     update_status(i_step_id,'FAILURE');  
     --RAISE, SEND ERROR EMAIL Based on your logic.
END;
/

@DCookie が (+1) を指摘したように、自律型トランザクションはこのようなロギングの完璧なユースケースです。メイン トランザクションは影響を受けず、いつでも実行の最新の状態を確認できます。

通常、このすべての更新を行う既存のパッケージがあり、おそらくこれらの API を呼び出すだけで済みます。周囲に尋ねるか、現在実行中の負荷の 1 つを調べます。

于 2012-05-08T17:50:58.917 に答える
1

パッケージの実行中にこのテーブルに定期的に挿入を実行する必要があり、別のセッションからの進行状況を確認する機能が必要ですか?

その場合は、 PRAGMAAUTONOMOUS_TRANSACTIONステートメントを調べることができます。このPRAGMAで定義された関数に挿入ステートメントを挿入すると、パッケージから独立して挿入をコミットできます。パッケージ内の必要に応じて関数を呼び出します。

于 2012-05-08T17:36:38.800 に答える