본문 바로가기

emotional developer/detect-pattern

채번방식?


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