0% found this document useful (0 votes)
95 views

Hana SQL Statement

This SQL command provides an overview of ABAP batch jobs by querying the TBTCO table. It allows filtering batch jobs by start and end time, job name, user, status, and other parameters. The output aggregates data on the number of jobs, total duration, and average duration within the specified time interval.

Uploaded by

wangwww
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
95 views

Hana SQL Statement

This SQL command provides an overview of ABAP batch jobs by querying the TBTCO table. It allows filtering batch jobs by start and end time, job name, user, status, and other parameters. The output aggregates data on the number of jobs, total duration, and average duration within the specified time interval.

Uploaded by

wangwww
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 7

SELECT

/*

[NAME]

- HANA_ABAP_BatchJobs

[DESCRIPTION]

- Overview of ABAP batch jobs

[SOURCE]

- SAP Note 1969700

[DETAILS AND RESTRICTIONS]

- Table TBTCO only available in SAP ABAP environments


- You have to be connected to the SAP<sid> schema otherwise the following error is
issued:

[259]: invalid table name: Could not find table/view TBTCO in schema

- If access to ABAP objects is possible but you cannot log on as ABAP user, you can
switch the default schema before executing the command:

SET SCHEMA SAP<sid>

[VALID FOR]

- Revisions: all
- Statistics server type: all
- Client application: ABAP

[SQL COMMAND VERSION]

- 2018/10/24: 1.0 (initial version)


- 2018/12/03: 1.1 (shortcuts for BEGIN_TIME and END_TIME like 'C', 'E-S900' or
'MAX')
- 2019/01/23: 1.2 (WP_PID included)

[INVOLVED TABLES]

- TBTCO

[INPUT PARAMETERS]

- BEGIN_TIME

Begin time

'2018/12/05 14:05:00' --> Set begin time to 5th of December 2018, 14:05
'C' --> Set begin time to current time
'C-S900' --> Set begin time to current time minus 900 seconds
'C-M15' --> Set begin time to current time minus 15 minutes
'C-H5' --> Set begin time to current time minus 5 hours
'C-D1' --> Set begin time to current time minus 1 day
'C-W4' --> Set begin time to current time minus 4 weeks
'E-S900' --> Set begin time to end time minus 900 seconds
'E-M15' --> Set begin time to end time minus 15 minutes
'E-H5' --> Set begin time to end time minus 5 hours
'E-D1' --> Set begin time to end time minus 1 day
'E-W4' --> Set begin time to end time minus 4 weeks
'MIN' --> Set begin time to minimum (1000/01/01 00:00:00)

- END_TIME

End time

'2018/12/08 14:05:00' --> Set end time to 8th of December 2018, 14:05
'C' --> Set end time to current time
'C-S900' --> Set end time to current time minus 900 seconds
'C-M15' --> Set end time to current time minus 15 minutes
'C-H5' --> Set end time to current time minus 5 hours
'C-D1' --> Set end time to current time minus 1 day
'C-W4' --> Set end time to current time minus 4 weeks
'B+S900' --> Set end time to begin time plus 900 seconds
'B+M15' --> Set end time to begin time plus 15 minutes
'B+H5' --> Set end time to begin time plus 5 hours
'B+D1' --> Set end time to begin time plus 1 day
'B+W4' --> Set end time to begin time plus 4 weeks
'MAX' --> Set end time to maximum (9999/12/31 23:59:59)

- JOB_NAME

Batch job name

'EU_REORG' --> Batch job EU_REORG


'%' --> No restriction related to batch job name

- USER_NAME

Batch job scheduling user

'SAPADM' --> User SAPADM


'%' --> No restriction related to batch job scheduling user

- MIN_DURATION_S

Threshold for minimum batch job duration

3600 --> Only consider batch jobs with a runtime of at least 3600
seconds
-1 --> No restriction related to batch job duration

- STATUS

Batch job status (check "Modification section" for all possible values)

'CANCELLED' --> Only display cancelled batch jobs


'%' --> No restriction related to batch job user

- AGGREGATE_BY

Aggregation criteria (possible values can be found in comment)

'TIME' --> Aggregation by time


'HOST, PORT' --> Aggregation by host and port
'NONE' --> No aggregation

- TIME_AGGREGATE_BY

Aggregation criteria (possible values can be found in comment)

'HOUR' --> Aggregation by hour


'YYYY/WW' --> Aggregation by calendar week
'TS<seconds>' --> Time slice aggregation based on <seconds> seconds
'NONE' --> No aggregation

- ORDER_BY

Sort criteria (available values are provided in comment)

'SIZE' --> Sorting by size


'TABLE' --> Sorting by table name

[OUTPUT PARAMETERS]

- START_TIME: Start time of considered time interval


- JOB_NAME: Batch job name
- USER_NAME: Scheduling user name
- STATUS: Batch job status
- WP_PID: Process ID of work process
- NUM_JOBS: Number of batch jobs
- TOT_DUR_S: Total duration (s)
- AVG_DUR_S: Average duration (s)

[EXAMPLE OUTPUT]

-----------------------------------------------------------------------------------
--------------
|START_TIME |JOB_NAME |USER_NAME|STATUS |NUM_JOBS|
TOT_DUR_S |AVG_DUR_S |
-----------------------------------------------------------------------------------
--------------
|2018/12/19 12:15:22|BI_PROCESS_ABAP |MAESTRO |CANCELLED| 1|
182546| 182546.00|
|2018/12/20 04:03:20|BIDTPR_2738970_1 |ALEREMOTE|CANCELLED| 1|
125654| 125654.00|
|2018/12/20 04:03:22|BIDTPR_2738970_1 |ALEREMOTE|CANCELLED| 1|
125648| 125648.00|
|2018/12/20 06:32:34|BIDTPR_2738970_1 |ALEREMOTE|CANCELLED| 1|
116714| 116714.00|
|2018/12/20 07:46:57|BIDTPR_2740096_1 |ALEREMOTE|CANCELLED| 1|
112251| 112251.00|
|2018/12/20 07:54:06|BIDTPR_2740126_1 |ALEREMOTE|CANCELLED| 1|
111822| 111822.00|
|2018/12/20 07:54:05|BIDTPR_2740126_1 |ALEREMOTE|CANCELLED| 1|
111805| 111805.00|
|2018/12/20 08:00:27|BIDTPR_2740126_1 |ALEREMOTE|CANCELLED| 1|
111423| 111423.00|
|2018/12/20 08:29:31|BIDTPR_2740217_1 |ALEREMOTE|CANCELLED| 1|
109697| 109697.00|
|2018/12/20 08:29:33|BIDTPR_2740217_1 |ALEREMOTE|CANCELLED| 1|
109677| 109677.00|
|2018/12/20 08:59:15|BIDTPR_2740217_1 |ALEREMOTE|CANCELLED| 1|
107913| 107913.00|
|2018/12/20 09:29:30|BIDTPR_2740314_1 |ALEREMOTE|CANCELLED| 1|
106098| 106098.00|
|2018/12/20 09:31:42|BIDTPR_2740314_1 |ALEREMOTE|CANCELLED| 1|
105948| 105948.00|
|2018/12/20 09:38:48|BIDTPR_2740329_1 |ALEREMOTE|CANCELLED| 1|
105522| 105522.00|
|2018/12/20 09:55:53|BI_WRITE_PROT_TO_APPLLOG|ABCDEF |CANCELLED| 1|
104497| 104497.00|
|2018/12/22 12:15:10|BI_PROCESS_ABAP |MAESTRO |RUNNING | 1|
93905| 93905.00|
-----------------------------------------------------------------------------------
--------------

*/

START_TIME,
JOB_NAME,
USER_NAME,
STATUS,
LPAD(WP_PID, 7) WP_PID,
LPAD(NUM_JOBS, 8) NUM_JOBS,
LPAD(DURATION_S, 10) TOT_DUR_S,
LPAD(TO_DECIMAL(MAP(NUM_JOBS, 0, 0, DURATION_S / NUM_JOBS), 10, 2), 10) AVG_DUR_S
FROM
( SELECT
CASE
WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TIME') != 0 THEN
CASE
WHEN BI.TIME_AGGREGATE_BY LIKE 'TS%' THEN
TO_VARCHAR(ADD_SECONDS(TO_TIMESTAMP('2014/01/01 00:00:00', 'YYYY/MM/DD
HH24:MI:SS'), FLOOR(SECONDS_BETWEEN(TO_TIMESTAMP('2014/01/01 00:00:00',
'YYYY/MM/DD HH24:MI:SS'), J.BEGIN_TIME) / SUBSTR(BI.TIME_AGGREGATE_BY,
3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)), 'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(J.BEGIN_TIME, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END START_TIME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'JOB') != 0
THEN J.JOB_NAME ELSE MAP(BI.JOB_NAME, '%', 'any', BI.JOB_NAME)
END JOB_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'USER') != 0
THEN J.USER_NAME ELSE MAP(BI.USER_NAME, '%', 'any', BI.USER_NAME)
END USER_NAME,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'STATUS') != 0
THEN J.STATUS ELSE MAP(BI.STATUS, '%', 'any', BI.STATUS)
END STATUS,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WP_PID') != 0
THEN TO_VARCHAR(J.WPPROCID) ELSE MAP(BI.WP_PID, -1, 'any',
TO_VARCHAR(BI.WP_PID)) END WP_PID,
COUNT(*) NUM_JOBS,
SUM(J.DURATION_S) DURATION_S,
BI.ORDER_BY
FROM
( SELECT
CASE
WHEN BEGIN_TIME = 'C' THEN CURRENT_TIMESTAMP
WHEN BEGIN_TIME LIKE 'C-S%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-S'))
WHEN BEGIN_TIME LIKE 'C-M%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-M') * 60)
WHEN BEGIN_TIME LIKE 'C-H%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-H') * 3600)
WHEN BEGIN_TIME LIKE 'C-D%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-D') * 86400)
WHEN BEGIN_TIME LIKE 'C-W%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(BEGIN_TIME, 'C-W') * 86400 * 7)
WHEN BEGIN_TIME LIKE 'E-S%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-S'))
WHEN BEGIN_TIME LIKE 'E-M%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-M') * 60)
WHEN BEGIN_TIME LIKE 'E-H%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-H') * 3600)
WHEN BEGIN_TIME LIKE 'E-D%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-D') * 86400)
WHEN BEGIN_TIME LIKE 'E-W%' THEN
ADD_SECONDS(TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS'),
-SUBSTR_AFTER(BEGIN_TIME, 'E-W') * 86400 * 7)
WHEN BEGIN_TIME = 'MIN' THEN
TO_TIMESTAMP('1000/01/01 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
WHEN SUBSTR(BEGIN_TIME, 1, 1) NOT IN ('C', 'E', 'M') THEN
TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS')
END BEGIN_TIME,
CASE
WHEN END_TIME = 'C' THEN CURRENT_TIMESTAMP
WHEN END_TIME LIKE 'C-S%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-S'))
WHEN END_TIME LIKE 'C-M%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-M') * 60)
WHEN END_TIME LIKE 'C-H%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-H') * 3600)
WHEN END_TIME LIKE 'C-D%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-D') * 86400)
WHEN END_TIME LIKE 'C-W%' THEN
ADD_SECONDS(CURRENT_TIMESTAMP, -SUBSTR_AFTER(END_TIME, 'C-W') * 86400 * 7)
WHEN END_TIME LIKE 'B+S%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+S'))
WHEN END_TIME LIKE 'B+M%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+M') * 60)
WHEN END_TIME LIKE 'B+H%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+H') * 3600)
WHEN END_TIME LIKE 'B+D%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+D') * 86400)
WHEN END_TIME LIKE 'B+W%' THEN
ADD_SECONDS(TO_TIMESTAMP(BEGIN_TIME, 'YYYY/MM/DD HH24:MI:SS'),
SUBSTR_AFTER(END_TIME, 'B+W') * 86400 * 7)
WHEN END_TIME = 'MAX' THEN
TO_TIMESTAMP('9999/12/31 00:00:00', 'YYYY/MM/DD HH24:MI:SS')
WHEN SUBSTR(END_TIME, 1, 1) NOT IN ('C', 'B', 'M') THEN
TO_TIMESTAMP(END_TIME, 'YYYY/MM/DD HH24:MI:SS')
END END_TIME,
JOB_NAME,
USER_NAME,
MIN_DURATION_S,
WP_PID,
STATUS,
AGGREGATE_BY
AGGREGATE_BY,
MAP(TIME_AGGREGATE_BY,
'NONE', 'YYYY/MM/DD HH24:MI:SS',
'HOUR', 'YYYY/MM/DD HH24',
'DAY', 'YYYY/MM/DD (DY)',
'HOUR_OF_DAY', 'HH24',
TIME_AGGREGATE_BY ) TIME_AGGREGATE_BY,
ORDER_BY
FROM
( SELECT /* Modification section */
'1000/10/18 07:58:00' BEGIN_TIME, /* YYYY/MM/DD HH24:MI:SS
timestamp, C, C-S<seconds>, C-M<minutes>, C-H<hours>, C-D<days>, C-W<weeks>, E-
S<seconds>, E-M<minutes>, E-H<hours>, E-D<days>, E-W<weeks>, MIN */
'9999/10/18 08:05:00' END_TIME, /* YYYY/MM/DD HH24:MI:SS
timestamp, C, C-S<seconds>, C-M<minutes>, C-H<hours>, C-D<days>, C-W<weeks>,
B+S<seconds>, B+M<minutes>, B+H<hours>, B+D<days>, B+W<weeks>, MAX */
'%' JOB_NAME,
'%' USER_NAME,
86400 MIN_DURATION_S,
-1 WP_PID,
'%' STATUS, /* CANCELLED, FINISHED, SCHEDULED, RUNNING,
RELEASED, UNKNOWN, READY, PUT_ACTIVE */
'NONE' AGGREGATE_BY, /* TIME, JOB, USER, STATUS, WP_PID or
comma separated combinations, NONE for no aggregation */
'NONE' TIME_AGGREGATE_BY, /* HOUR, DAY, HOUR_OF_DAY or database
time pattern, TS<seconds> for time slice, NONE for no aggregation */
'DURATION' ORDER_BY /* TIME, JOB, USER, STATUS,
DURATION, COUNT */
FROM
DUMMY
)
) BI,
( SELECT
BEGIN_TIME,
END_TIME,
SECONDS_BETWEEN(BEGIN_TIME, IFNULL(END_TIME, CURRENT_TIMESTAMP)) DURATION_S,
STATUS,
JOB_NAME,
USER_NAME,
WPPROCID
FROM
( SELECT
MAP(STRTDATE, '00000000', NULL, TO_TIMESTAMP(STRTDATE || STRTTIME,
'YYYYMMDDHH24MISS')) BEGIN_TIME,
MAP(ENDDATE, '00000000', NULL, TO_TIMESTAMP(ENDDATE || ENDTIME,
'YYYYMMDDHH24MISS')) END_TIME,
MAP(STATUS, 'A', 'CANCELLED', 'F', 'FINISHED', 'P', 'SCHEDULED', 'R',
'RUNNING', 'S', 'RELEASED', 'X', 'UNKNOWN', 'Y', 'READY', 'Z', 'PUT_ACTIVE')
STATUS,
JOBNAME JOB_NAME,
SDLUNAME USER_NAME,
WPPROCID
FROM
TBTCO
WHERE
STRTDATE != '00000000'
)
) J
WHERE
J.JOB_NAME LIKE BI.JOB_NAME AND
J.BEGIN_TIME <= BI.END_TIME AND
( J.END_TIME = '' OR J.END_TIME >= BI.BEGIN_TIME ) AND
J.STATUS LIKE BI.STATUS AND
J.USER_NAME LIKE BI.USER_NAME AND
( BI.WP_PID = -1 OR J.WPPROCID = BI.WP_PID ) AND
( BI.MIN_DURATION_S = -1 OR J.DURATION_S >= BI.MIN_DURATION_S )
GROUP BY
CASE
WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'TIME') != 0 THEN
CASE
WHEN BI.TIME_AGGREGATE_BY LIKE 'TS%' THEN
TO_VARCHAR(ADD_SECONDS(TO_TIMESTAMP('2014/01/01 00:00:00', 'YYYY/MM/DD
HH24:MI:SS'), FLOOR(SECONDS_BETWEEN(TO_TIMESTAMP('2014/01/01 00:00:00',
'YYYY/MM/DD HH24:MI:SS'), J.BEGIN_TIME) / SUBSTR(BI.TIME_AGGREGATE_BY,
3)) * SUBSTR(BI.TIME_AGGREGATE_BY, 3)), 'YYYY/MM/DD HH24:MI:SS')
ELSE TO_VARCHAR(J.BEGIN_TIME, BI.TIME_AGGREGATE_BY)
END
ELSE 'any'
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'JOB') != 0
THEN J.JOB_NAME ELSE MAP(BI.JOB_NAME, '%', 'any', BI.JOB_NAME)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'USER') != 0
THEN J.USER_NAME ELSE MAP(BI.USER_NAME, '%', 'any', BI.USER_NAME)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'STATUS') != 0
THEN J.STATUS ELSE MAP(BI.STATUS, '%', 'any', BI.STATUS)
END,
CASE WHEN BI.AGGREGATE_BY = 'NONE' OR INSTR(BI.AGGREGATE_BY, 'WP_PID') != 0
THEN TO_VARCHAR(J.WPPROCID) ELSE MAP(BI.WP_PID, -1, 'any',
TO_VARCHAR(BI.WP_PID)) END,
BI.ORDER_BY
)
ORDER BY
MAP(ORDER_BY, 'JOB', JOB_NAME, 'USER', USER_NAME, 'STATUS', STATUS),
MAP(ORDER_BY, 'DURATION', DURATION_S, 'COUNT', NUM_JOBS) DESC,
START_TIME DESC

You might also like