8.4.1 시퀀스 객체(Sequence Object)

8.4.2 잘못 활용한 시퀀스

8.4.3 최근 데이터를 가져오는 기술

데이터 준비

-- T_CUS_LGN 테이블 생성 및 테스트 데이터 입력
CREATE TABLE T_CUS_LGN
(   
	CUS_ID VARCHAR2(40) NOT NULL,
	LGN_DT DATE NOT NULL,
	SUC_YN VARCHAR2(40) NULL,
	LGN_FAL_CD VARCHAR2(40) NULL
);

CREATE UNIQUE INDEX PK_T_CUS_LGN ON T_CUS_LGN(CUS_ID, LGN_DT);

ALTER TABLE T_CUS_LGN 
	ADD CONSTRAINT PK_T_CUS_LGN PRIMARY KEY(CUS_ID, LGN_DT) USING INDEX;

INSERT INTO T_CUS_LGN (CUS_ID ,LGN_DT ,SUC_YN ,LGN_FAL_CD)
SELECT  T1.CUS_ID ,T2.LGN_DT
		,CASE WHEN T1.CUS_ID = 'CUS_0001' AND RNO >= 4998 THEN 'N' ELSE 'Y' END SUC_YN
		,CASE WHEN T1.CUS_ID = 'CUS_0001' AND RNO >= 4998 THEN 'PW.WRONG' ELSE NULL END LGN_FAL_CD
FROM    M_CUS T1
		,(    SELECT TO_DATE('20170301','YYYYMMDD') + (ROWNUM / 24 / 60 / 30) LGN_DT
					,ROWNUM  RNO
				FROM  DUAL A CONNECT BY ROWNUM <= 5000
		) T2;

결과는 올바르나 성능이 좋지 못한 예

-- 로그인 연속 실패 카운트 – 좋지 못한 방법
SELECT  COUNT(*)
FROM    T_CUS_LGN T1
WHERE   T1.LGN_DT > (
				SELECT  MAX(T1.LGN_DT) LAST_SUC_DT
				FROM    T_CUS_LGN T1
				WHERE   T1.CUS_ID = 'CUS_0001'
				AND     T1.SUC_YN = 'Y')
AND     T1.CUS_ID = 'CUS_0001'
AND     T1.SUC_YN = 'N';

좋은 예