1.
http://www.zetswing.com/bbs/board.php?bo_table=db_02&wr_id=2
쿼리를 이용한 자동 채번 쿼리 방법
EXEC SQL
SELECT
VALUE(MAX( SUBSTR(MERCH_ORG_ID, 4, 4) ), '0001') INTO :SVp0052.ROW_NUM
-- 마지막 4자리가 가장 큰값을 가져온다. 정수값이 없는 경우에는 0001로 초기화한다.
FROM
T_MSS_ORG_CODE
WHERE
SUBSTR(MERCH_ORG_ID, 1, 3) = :RVp0052.MERCH_ORG_ID
AND SUBSTR(MERCH_ORG_ID,4,4) BETWEEN '0000' AND '9999'
-- 정수형식의 값만 조회한다.
WITH UR;
※ COUNT() 함수를 이용하면 언젠가는 중복이 발생한다 .그래서 MAX() 함수를 이용해야
한다.
DBMS의 시퀀스(Sequence) 사용
장점
1. Lock이 발생하지 않고 빠르다.
2. 사용하기 간편하다. (insert 문에서 nextval 키워드로 바로 사용 가능)
단점
1. 번호만 따고 사용안하면 그 번호가 비게 된다.
(INSERT, UPDATE가 아닌 SELECT, DELETE에 사용한경우를 말함)
max값 구해서 + 1 하는 방식
PK가 COL1, COL2, SEQ인 경우 :
select
/*+ INDEX_DESC(테이블명 테이블명_PK) */
SEQ+1
FROM 테이블명
WHERE COL1 = 1234
AND COL2 = 5678
AND ROWNUM = 1
FOR UPDATE;
배송 출하항번 :
select /*+ INDEX_DESC(TB_LD_SHP TB_LD_SHP_PK) */ shp_sub_no + 1
FROM TB_LD_SHP
WHERE dc_cd = ?
AND corp_type = ?
AND ord_no = ?
FOR UPDATE;
※ 흔히들 max + 1을 사용하거나, index 힌트를 사용하면서 for update를 사용하지 않고
있는데 그럴 경우 중복 채번될 수 있으므로 이를 방지하기 위해 for update를 사용해야 한다.
그런데 max 함수와 for upate 키워드는 같이 사용할 수 없기 때문에 max 대신 index_desc
힌트를 사용하는 것이다.
장점
1. 사용자가 원하는 형태의 번호를 부여할 수 있다(날짜 + 일련번호, 부서 + 일련번호...).
2. 채번 테이블을 두는 것보다 관리가 용이하다.
단점
1. for update가 있는 경우 insert와 하나로 합할수가 없으므로 두개의 메소드로 구성해야
한다. (select 메소드 + insert 메소드)
2. for update를 사용하므로 lock이 걸리게 된다.
따라서 사용자 수가 많은 업무 테이블을 lock을 걸기 보다는, 채번 테이블을 별도로 두어
상대적으로 사용자 수가 적은 채번 테이블을 lock을 거는 방식을 사용한다.
(채번 테이블의 장점).
3. 데이터가 한건도 없을 경우에는 사용할 수 없다.
(최초에 1값을 넣어 두고, 읽어서 그값으로 신규 데이터를 생성하고 값을 하나 더 증가
시켜 insert 해 놓는 편법을 사용하거나 데이터가 조회 안됐을 경우 별도의 로직으로
처리하기도 한다)
※ 신물류에서는 사용자 수가 적어서 lock이 걸릴 가능성이 적고 데이터가 한건도 없을
경우가 없는 출하항번에서 사용한다.
채번 테이블을 이용하는 방법
장점
1. 사용자가 원하는 형태의 번호를 부여할 수 있다(날짜 + 일련번호, 부서 + 일련번호...)
2. (max값 구해서 + 1) 방법보다 lock이 덜 걸린다.
단점
1. 관리, 개발 번거롭다.
※ 신물류에서는 채번 방식이 복잡하고 사용자 수가 많아 lock이 걸릴 가능성이 큰
주문번호, 배차번호에서 사용한다.
2.
http://www.oracleclub.com/article/59408
'emotional developer > detect-pattern' 카테고리의 다른 글
Rate Limiter (0) | 2023.05.04 |
---|---|
Achieving Immutability with Builder Design Pattern (0) | 2010.08.05 |
TDD를통해의존성줄여보자. (2) | 2007.12.05 |