SQL*Plus 기반의 배치 실행 결과를 분석하기 위해 SQL 문의 실행 결과를 파싱할 수 있는 간단한 awk 스크립트를 작성합니다.
실행 결과를 생성하기 위해 아래 스크립트를 실행하겠습니다.
SPOOL log.txt
DROP TABLE T1 PURGE;
CREATE TABLE T1 AS SELECT ROWNUM AS C1 FROM XMLTABLE ('1 to 10000');
INSERT INTO T1 SELECT * FROM T1;
UPDATE T1 SET C1 = 1;
DELETE FROM T1 WHERE C1 = 1;
COMMIT;
SPOOL OFF
아래와 같은 실행 결과가 생성됩니다.
SQL>
SQL> DROP TABLE T1 PURGE;
Table dropped.
Elapsed: 00:00:00.04
SQL>
SQL> CREATE TABLE T1 AS SELECT ROWNUM AS C1 FROM XMLTABLE ('1 to 10000');
Table created.
Elapsed: 00:00:00.02
SQL>
SQL> INSERT INTO T1 SELECT * FROM T1;
10000 rows created.
Elapsed: 00:00:00.02
SQL>
SQL> UPDATE T1 SET C1 = 1;
20000 rows updated.
Elapsed: 00:00:01.66
SQL>
SQL> DELETE FROM T1 WHERE C1 = 1;
20000 rows deleted.
Elapsed: 00:00:00.02
SQL>
SQL> COMMIT;
Commit complete.
Elapsed: 00:00:00.00
SQL>
SQL> SPOOL OFF
아래 내용으로 log.awk 파일을 생성하겠습니다.
BEGIN {
result = 0;
}
function f1 (sql, idx) {
split($0, a_sql)
printf "%s,%s,%s,%s,", FILENAME, FNR, sql, a_sql[idx]
result = 1
}
{
if (match($0, /SQL>[[:blank:]]+CREATE[[:space:]]+TABLE/) != 0) f1("CREATE TABLE", 4)
if (match($0, /SQL>[[:blank:]]+INSERT/) != 0) f1("INSERT", 4)
if (match($0, /SQL>[[:blank:]]+UPDATE/) != 0) f1("UPDATE", 3)
if (match($0, /SQL>[[:blank:]]+DELETE/) != 0) f1("DELETE", 4)
if (match($0, /Elapsed:/) != 0 && result) {
split($0, a_elapsed)
printf "%s\n", a_elapsed[2]
result = 0
}
}
아래와 같이 awk 스크립트를 사용할 수 있습니다.
$ awk -f log.awk log.txt
log.txt,8,CREATE TABLE,T1,00:00:00.02
log.txt,14,INSERT,T1,00:00:00.02
log.txt,20,UPDATE,T1,00:00:01.66
log.txt,26,DELETE,T1,00:00:00.02