작성
·
226
0
<sql id="search">
<if test="type=='writer'">
where writer like concat(concat('%', #{keyword}), '%')
</if>
<if test="type=='title'">
where title like concat(concat('%', #{keyword}),'%')
</if>
<if test="type=='content'">
where content like concat(concat('%', #{keyword}), '%')
</if>
</sql>
<select id="getList" resultType="kr.bit.entity.Board" parameterType="kr.bit.entity.Criteria">
select * from tblBoard
<include refid="search"/>
order by boardGroup desc, boardSequence asc
limit #{pageStart}, #{perPageNum}
</select>
전에
"select * from tblBoard
<include refid="search"/>
order by boardGroup desc, boardSequence asc
limit #{pageStart}, #{perPageNum} "
에 대해 질문 했었는데
select * from tblBoard
<include refid="search"/>
order by boardGroup desc, boardSequence asc
limit #{pageStart}, #{perPageNum} 을
오라클로 바꾸는 문법을 알고 싶습니다.
※ <include refid="search"/> 포함이 되는 경우가 생겨서 어렵습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
ciw님께서 작성하신 MyBatis의 XML 구문을 Oracle의 문법으로 변환하는 것에 대해서 질문해주신 것으로 이해했습니다. MySQL에서 사용하는 LIMIT
키워드는 Oracle에서는 ROWNUM
이나 페이징을 위해 OFFSET
과 FETCH NEXT
를 사용해야 합니다.
MySQL 쿼리:
select * from tblBoard
where ...
order by boardGroup desc, boardSequence asc
limit pageStart, perPageNum
Oracle로 변환한 쿼리는 다음과 같습니다:
SELECT * FROM
(SELECT a.*, ROWNUM rnum FROM
(SELECT * FROM tblBoard
-- <include refid="search"/> 해당 부분은 검색 조건의 동적 SQL 삽입
ORDER BY boardGroup DESC, boardSequence ASC) a
)
WHERE rnum > pageStart AND rnum <= (pageStart + perPageNum)
Oracle 12c 이상 버전에서는 더 새로운 방식도 사용 가능합니다:
SELECT * FROM tblBoard
-- <include refid="search"/> 해당 부분은 검색 조건의 동적 SQL 삽입
ORDER BY boardGroup DESC, boardSequence ASC
OFFSET pageStart ROWS FETCH NEXT perPageNum ROWS ONLY
<include refid="search"/>
는 MyBatis의 기능을 활용하여 쿼리 내에 다른 XML 내에서 정의된 SQL을 포함하는 방법입니다. Oracle 문법으로 변환 시에도 해당 부분은 변하지 않고 그대로 유지됩니다.
Oracle 쿼리에서 페이징 처리가 필요할 때는 ROWNUM
을 사용하는 전통적인 방법이 있고, Oracle 12c 이상에서는 OFFSET
과 FETCH NEXT
를 사용하는 방법이 있으니, 사용하시는 Oracle 데이터베이스 버전에 맞게 적절한 방식을 선택하여 사용하시면 됩니다.