#!/bin/bash
#==============================================================================
# ora-burger (버거원 POS) 데이터 적재 — 한 번에, 그리고 누가 돌려도 같은 데이터로
#
#   사용 (Git Bash, 이 폴더에서) :  bash 00_적재_한번에.sh
#   전제 : README 「1. 기동 + 권한」 을 마쳤다 (ora-burger 가 떠 있고 dev 에 권한이 있다)
#   소요 : 약 5분.  끝에 검증표가 찍힌다
#
#   원본 생성기(오라클튜닝에센셜/*.sql)는 한 글자도 고치지 않는다. 흘려 넣을 때 세 가지만 덧붙인다.
#     ① SET SQLBLANKLINES ON   — 원본의 CREATE TABLE 안에 빈 줄이 있다. 이게 없으면 테이블이 안 생기고 0행이 된다
#     ② 15000000 → 1000000     — 원본 건수(1,500만)는 Free 의 12GB 한도를 넘긴다
#     ③ DBMS_RANDOM.SEED(20120101) — 4.sql·5.sql 이 난수로 주문을 만든다. 시드를 고정해야
#        내 화면의 행수·CF·Buffers 가 04화 본문과 한 자리까지 같다
#==============================================================================
set -e
cd "$(dirname "$0")/오라클튜닝에센셜"
C=${C:-ora-burger}      # 다른 이름으로 지을 때만 C=이름 bash 00_적재_한번에.sh
SEED=20120101
LOG="${TMPDIR:-/tmp}/ora-burger_적재"; mkdir -p "$LOG"

feed() {   # feed <파일> [시드]
  { echo "SET SQLBLANKLINES ON"
    [ -n "$2" ] && echo "EXEC DBMS_RANDOM.SEED($2)"
    sed 's/15000000/1000000/g' "$1"
    echo; echo "EXIT"
  } | docker exec -i $C sqlplus -s dev/dev@localhost/FREEPDB1 > "$LOG/$1.log" 2>&1
  echo "  [$(date +%T)] $1 완료 (로그: $LOG/$1.log)"
}

echo "ora-burger 적재 시작 — 약 5분"
feed 2.sql            # 테이블
feed 3.sql            # 생성 프로시저
feed 4.sql $SEED      # 주문 100만 + 주문상품 약 247만 + 인덱스

# ★ 주문상품을 (주문번호, 상품) 순서로 다시 쌓는다.
#   4.sql 은 주문상품을 주문마다 일반 INSERT 로 넣는데, 그때 어느 블록에 들어가는지가 설치마다 조금 다르다.
#   그러면 5.sql 의 무작위 복사본(ORD_ITEM_RANDOM)이 받는 순서까지 달라져서 14화의 숫자가 안 맞는다.
docker exec -i $C sqlplus -s dev/dev@localhost/FREEPDB1 > "$LOG/정돈.log" 2>&1 <<'SQL'
CREATE TABLE ORD_ITEM_TMP NOLOGGING AS SELECT * FROM ORD_ITEM;
TRUNCATE TABLE ORD_ITEM;
INSERT /*+ APPEND */ INTO ORD_ITEM SELECT * FROM ORD_ITEM_TMP ORDER BY ORD_NO, ITEM_ID;
COMMIT;
DROP TABLE ORD_ITEM_TMP PURGE;
EXIT
SQL
echo "  [$(date +%T)] 주문상품 정돈 완료"
feed 5.sql $SEED      # ORD_RANDOM · ORD_ITEM_RANDOM (무작위 순서 복사본)

docker exec -i $C sqlplus -s dev/dev@localhost/FREEPDB1 > "$LOG/stats.log" 2>&1 <<'SQL'
EXEC DBMS_STATS.GATHER_SCHEMA_STATS('DEV', method_opt=>'FOR ALL COLUMNS SIZE 1', cascade=>TRUE, no_invalidate=>FALSE);
EXIT
SQL
echo "  [$(date +%T)] 통계 수집 완료"

echo
echo "=== 검증 — 아래 기대값과 한 자리까지 같아야 한다 ==="
docker exec -i $C sqlplus -s dev/dev@localhost/FREEPDB1 <<'SQL'
SET LINESIZE 120 PAGESIZE 50 FEEDBACK OFF
COL index_name FORMAT A16
COL item FORMAT A16
SELECT (SELECT COUNT(*) FROM ORD) ord, (SELECT COUNT(*) FROM ORD_RANDOM) ord_random,
       (SELECT COUNT(*) FROM ORD_ITEM) ord_item FROM dual;
SELECT index_name, clustering_factor cf, leaf_blocks FROM user_indexes
 WHERE index_name IN ('ORD_X01','ORD_RANDOM_X01') ORDER BY 1;
SELECT ITEM_NM AS item FROM ITEM WHERE ITEM_ID = 1;
PROMPT 기대: ORD 1000000 · ORD_RANDOM 1000000 · ORD_ITEM 2472717
PROMPT       ORD_RANDOM_X01 CF 999958 · ORD_X01 CF 22223 · LEAF 둘 다 3774
PROMPT       ITEM_ID 1 = 한우불고기버거   (??? 로 나오면 PowerShell 인코딩 문제 — 02_접속과_실행_방법.md 4절)
EXIT
SQL
