개요
SQL 문을 반복 수행하는 쉘 스크립트를 두 가지 방식으로 작성해보겠습니다.
첫 번째 방식
아래 스크립트는 정해진 횟수만큼 SQL 문을 반복 수행합니다. SQL 문을 수행할 때마다 DB에 접속하는 방식입니다.
$ cat loop1.sh
#!/bin/bash
iteration=${1:-86400}
sleep=${2:-1}
for ((i=1; i<=iteration; i++)); do
sqlplus -s tuna/tuna << 'EOF'
SET FEEDBACK OFF
SET PAGESIZE 0
SET TIMING OFF
SELECT TO_CHAR (SYSDATE, 'YYYY-MM-DD HH24:MI:SS') || ',' || SYS_CONTEXT ('USERENV', 'SID')
FROM DUAL;
EXIT
EOF
sleep $sleep
done
아래는 쉘 스크립트의 실행 결과입니다.
$ sh loop1.sh 5 1
2022-01-01 00:00:01,1000
2022-01-01 00:00:02,1000
2022-01-01 00:00:03,2000
2022-01-01 00:00:04,2000
2022-01-01 00:00:05,1000
두 번째 방식
아래 스크립트도 정해진 횟수만큼 SQL 문을 반복 수행합니다. 첫 번째 방식과 달리 DB에 한번만 접속하며 처음에 01.sql 파일을 한 번 실행하고, 그 이후부터 02.sql 파일을 반복 실행합니다.
$ cat loop2.sh
#!/bin/bash
iteration=${1:-86400}
sleep=${2:-1}
loop_sql() {
for ((i=1; i<=iteration; i++)); do
((i==1)) && echo "@01" || echo "@02"
sleep $sleep
done
echo "exit"
}
loop_sql | sqlplus -s tuna/tuna
아래와 같이 01.sql, 02.sql 파일을 생성하겠습니다.
-- 01.sql
SET FEEDBACK OFF
SET PAGESIZE 0
SET TIMING OFF
SELECT '01' || ',' || TO_CHAR (SYSDATE, 'YYYY-MM-DD HH24:MI:SS') || ',' || SYS_CONTEXT ('USERENV', 'SID')
FROM DUAL;
-- 02.sql
SET FEEDBACK OFF
SET PAGESIZE 0
SET TIMING OFF
SELECT '02' || ',' || TO_CHAR (SYSDATE, 'YYYY-MM-DD HH24:MI:SS') || ',' || SYS_CONTEXT ('USERENV', 'SID')
FROM DUAL;
아래는 쉘 스크립트의 실행 결과입니다.
$ sh loop2.sh 1 5
01,2022-01-01 00:00:01,1000
02,2022-01-01 00:00:02,1000
02,2022-01-01 00:00:03,1000
02,2022-01-01 00:00:04,1000
02,2022-01-01 00:00:05,1000