TB_APPSAMPLE 이란 테이블에
APP_ID(number) P_ID(number) E_SNO(number)
27 364976 273649769
이렇게 3개의 컬럼이 있는데.
컬럼 E_SNO 에 쿼리로 27364976910 값을 넣을려고 합니다.
값이 들어 가는 규칙은 APP_ID + P_ID + 1부터 시작하는 MAX 값인데
아래 쿼리에서 #read_appid#||#p_id#||NVL(MAX(TO_NUMBER(E_SNO)), 0) + 1) 이 부분에서
위와 같이 데이터가 나올경우에 NUMBER 형 이다 보니 문제가 발생합니다. 273649769 + 1 이 되서
273649770 이 되어 버리는데 이걸 2736497610 이 되게 할 수는 없을까요?
SELECT NVL2(max(E_SNO), NVL(MAX(TO_NUMBER(E_SNO)), 0) + 1, #read_appid#||#p_id#||NVL(MAX(TO_NUMBER(E_SNO)), 0) + 1)
FROM TB_READAPPMAILHIST WHERE E_SNO LIKE #read_appid ||#p_id#||'%'
WITH T AS ( SELECT 27 APP_ID , 364976 P_ID , 273649768 E_SNO FROM DUAL UNION ALL SELECT 27 APP_ID , 364976 P_ID , 273649769 E_SNO FROM DUAL ) SELECT TO_CHAR(APP_ID || P_ID) || TO_CHAR(SUBSTR(E_SNO,LENGTH(APP_ID||P_ID)+1,LENGTH(E_SNO)) + 1 ) MAX_E_SNO FROM (SELECT APP_ID ,P_ID ,E_SNO ,ROW_NUMBER() OVER(ORDER BY E_SNO DESC ) RN FROM T )WHERE RN = 1
일련번호를 따기 위해서는 자리수가 일정해야 합니다.
뒤에 9 다음 10 이 붙는 형태로 자리수가 늘어나면 여러모로 곤란합니다.
MAX 값을 가져오는데도 엉뚱하게 되어 버릴 수 있구요.
숫자 항목에 검색조건을 LIKE 로 걸면 인덱스를 효율적으로 사용하지 못하게 됩니다.
뒤에 순번을 3자리 정도로 고정하여 사용하는것을 고려해 보세요.
그리고, 뒤 순번 뿐만 아니라 앞에 두가지 값을 붙이는 부분도 마찬가지입니다.
자리수가 일정하지 않다면 여러가지 문제가 발생될 가능성이 있습니다.
예를 들면
1 번에 11 번을 붙이는 경우와
11번에 1번을 붙이는 경우가 존재한다면?
둘다 111 로 시작하여 구별이 안가게 됩니다.