PL/SQLプロシージャへのジョブ実行ステータスの受渡し

通知システムは、event_typeがjob_status_changeと等しいevent_msg.event_payloadオブジェクトを介してPL/SQLプロシージャにジョブ・ステータス変更情報を渡します。このオブジェクトのインスタンスは、ステータス変更ごとに作成されます。ジョブがステータスを変更すると、通知システムはインシデント・ルールに関連付けられているPL/SQL p(event_msg IN gc$notif_event_msg)プロシージャをコールして、移入されたオブジェクトをプロシージャに渡します。これにより、プロシージャは渡されたevent_msg.event_payloadオブジェクトのフィールドにアクセスできます。

表6-15に、受渡し可能なすべての修正処理ステータス変更の属性を示します。

表6-15 ジョブ・ステータス属性

属性 データ型 詳細情報

event_msg.event_payload.source.source_name

VARCHAR2(128)

ジョブの名前。

event_msg.event_payload.source.source_owner

VARCHAR2(256)

ジョブの所有者。

event_msg.event_payload.source.source_sub_type

VARCHAR2(32)

ジョブのタイプ。

event_attrs(i).name=' execution_status'のevent_msg.event_payload. event_attrs(i).value

NUMBER

ジョブの新しいステータス。

event_attrs(i).name='state_change_guid'のevent_msg.event_payload. event_attrs(i).value

RAW(16)

状態変更レコードのGUID。

event_msg.event_payload.source.source_guid

RAW(16)

ジョブの一意のID。

event_attrs(i).name=' execution_id'のevent_msg target.event_payload. event_attrs(i).value

RAW(16)

実行の一意のID。

event_msg.event_payload.target

gc$notif_target

ターゲット情報オブジェクト。

event_msg.msg_info.rule_owner

VARCHAR2(64)

通知の送信を誘発する通知ルールの名前。

event_msg.msg_info.rule_name

VARCHAR2(132)

通知の送信を誘発する通知ルールの所有者。

event_msg.event_payload. reported_date

DATE

ステータス変更が発生した日時。

ジョブのジョブ・ステータス変更が発生すると、通知システムはevent_attrs(i).name=' execution_status'のevent_msg.event_payload. event_attrs(i).valueオブジェクトのインスタンスを作成し、ステータス変更の値を移入します。次のステータス・コードは、MGMT_JOBSパッケージに定数として定義され、event_attrs(i).name=' execution_status'のevent_msg.event_payload. event_attrs(i).valueオブジェクトのjob_statusフィールドのステータス・タイプを判断するために使用できます。

表6-16 ジョブ・ステータス・コード

名前 データ型

SCHEDULED_STATUS

NUMBER(2)

1

EXECUTING_STATUS

NUMBER(2)

2

ABORTED_STATUS

NUMBER(2)

3

FAILED_STATUS

NUMBER(2)

4

COMPLETED_STATUS

NUMBER(2)

5

SUSPENDED_STATUS

NUMBER(2)

6

AGENTDOWN_STATUS

NUMBER(2)

7

STOPPED_STATUS

NUMBER(2)

8

SUSPENDED_LOCK_STATUS

NUMBER(2)

9

SUSPENDED_EVENT_STATUS

NUMBER(2)

10

SUSPENDED_BLACKOUT_STATUS

NUMBER(2)

11

STOP_PENDING_STATUS

NUMBER(2)

12

SUSPEND_PENDING_STATUS

NUMBER(2)

13

INACTIVE_STATUS

NUMBER(2)

14

QUEUED_STATUS

NUMBER(2)

15

FAILED_RETRIED_STATUS

NUMBER(2)

16

WAITING_STATUS

NUMBER(2)

17

SKIPPED_STATUS

NUMBER(2)

18

REASSIGNED_STATUS

NUMBER(2)

20

例6-16 ステータス・コード(Job)を使用するPL/SQLプロシージャ

CREATE  TABLE job_log (jobid RAW(16), status_code NUMBER(2), occured DATE);
 
CREATE OR REPLACE PROCEDURE LOG_JOB_STATUS_CHANGE(event_msg IN GC$NOTIF_EVENT_MSG)
IS
  l_attrs gc$notif_event_attr_array;
  exec_status_code NUMBER(2) := NULL;
  occured_date DATE := NULL;
  job_guid RAW(16) := NULL;
 
BEGIN
  IF event_msg.event_payload.event_type = 'job_status_change'
  THEN
    l_attrs := event_msg.event_payload.event_attrs;
    IF l_attrs IS NOT NULL
    THEN
      FOR i IN 1..l_attrs.COUNT
      LOOP
        IF l_attrs(i).name = 'exec_status_code'
        THEN
          exec_status_code := TO_NUMBER(l_attrs(i).value);
        END IF;
      END LOOP;
    END IF;
 
    occured_date := event_msg.event_payload.reported_date;
    job_guid := event_msg.event_payload.source.source_guid;
    -- Log all jobs' status
    BEGIN
      INSERT INTO job_log (jobid, status_code, occured)
      VALUES (job_guid, exec_status_code, occured_date);
    EXCEPTION
    WHEN OTHERS
    THEN
      -- If there are any problems then get the notification retried
      RAISE_APPLICATION_ERROR(-20000, 'Please retry');
    END;
    COMMIT;
 
  ELSE
    null; -- it is not a job_status_change event, ignore
  END IF; 
END LOG_JOB_STATUS_CHANGE;
/