공부중인 생초보입니다..
일단 제가 사용하고 있는건 oracle이고 mybatis형식으로 하려합니다
제목대로 채번쿼리에 대해서인데요
일단 컬럼이 예를들어
Pk1 varchar2
Pk2 varchar2
Name1 varchar2 이 있습니다
데이터는 대강
‘2023000001’
‘000001’
‘분류1’
이라는 데이터가 각각 들어있다고 치고
데이터베이스에 name1이 중복존재하는게 있으면
Pk1이 그대로 2023000001이 유지가 되고
중복이 아닌 새로운 명칭이 들어오면 신규채번이 되도록 짜려고 합니다
Oracle에서 MyBatis를 사용하여 특정 조건에 따라 채번(시퀀스 생성) 로직을 구현하고 싶으신 것으로 이해했습니다.
주어진 조건은 Name1 컬럼의 값이 중복되는지 여부에 따라 Pk1의 값이 변경되거나 유지되어야 한다는 것입니다.
즉, Name1 값이 기존에 데이터베이스에 존재한다면 Pk1은 동일한 값을 유지하고, 새로운 Name1 값이면 Pk1을 새로 채번해야 합니다.
이를 구현하기 위해 몇 가지 접근 방법이 있을 수 있으며, 아래는 가능한 구현 방법 중 하나를 제시한 것입니다.
1단계: 시퀀스 생성
먼저, 새로운 Pk1 값을 생성하기 위한 Oracle 시퀀스를 생성합니다.
이 시퀀스는 새로운 Pk1 값을 자동으로 생성할 때 사용됩니다.
CREATE SEQUENCE pk1_seq START WITH 1 INCREMENT BY 1 NOCACHE;
2단계: MyBatis 쿼리 작성
MyBatis 매퍼 XML 파일에 새로운 데이터를 삽입하는 쿼리를 작성합니다.
이 쿼리는 먼저 Name1 값이 데이터베이스에 존재하는지 확인하고, 존재하는 경우 해당 Name1에 대한 현재 Pk1 값을 사용하며, 존재하지 않는 경우 새로운 Pk1 값을 시퀀스에서 생성하여 사용합니다.
<insert id="insertWithConditionalPk" parameterType="map"> <!-- 변수 선언 --> <selectKey keyProperty="pk1" resultType="string" order="BEFORE"> SELECT CASE WHEN EXISTS(SELECT 1 FROM your_table WHERE name1 = #{name1}) THEN (SELECT pk1 FROM your_table WHERE name1 = #{name1} FETCH FIRST 1 ROWS ONLY) ELSE '2023' || LPAD(pk1_seq.NEXTVAL, 7, '0') END AS pk1 FROM dual </selectKey> INSERT INTO your_table (pk1, pk2, name1) VALUES (#{pk1}, #{pk2}, #{name1}) </insert>
이 예제에서는 먼저 SELECT 문을 사용하여 Name1이 기존에 존재하는지 확인합니다.
존재한다면 해당 Name1에 대한 현재 Pk1 값을 선택하고, 그렇지 않으면 시퀀스를 사용하여 새로운 Pk1 값을 생성합니다.
LPAD 함수를 사용하여 채번된 숫자 앞에 0을 채우고, '2023' 같은 연도 또는 필요한 접두사를 추가합니다.