- ROWID
- ROWNUM
- ROWNUM 으로 페이징처리하기
Pseudo(의사) Column 은 ROWID 와 ROWNUM 이 있다.
ROWID
- ROWID 는 오라클이 내부적으로 사용하기 위해 만든 id 값으로써
행에 대한 id 값인데 오라클 전체내에서 고유한 값을 가진다.
다음과 같이 SELECT 항목에 ROWID를 넣으면 모든 테이블에서 확인할 수 있다.
select userid, name, address, rowid
from tbl_heowon;
-- 결과
/*
-------------------------------------------
USERID NAME ADDRESS ROWID
-------------------------------------------
leess 이순신 서울 AAAST7AAHAAAAHbAAA
eomjh 엄정화 인천 AAAST7AAHAAAAHbAAB
kangkc 강감찬 수원 AAAST7AAHAAAAHbAAC
*/
각 레코드들이 고유한 ROWID를 가지고, 자동으로 오름차순 되어지기 때문에 조회할 때 WHERE절에 ROWID를 가지고 조건을 주어서 조회할 수 있다.
delete from tbl_heowon
where rowid > 'AAASDUAAHAAAAHVAAC';
-- tbl_heowon 에서 rowid가 AAASDUAAHAAAAHVAAC 보다 큰 레코드들을 삭제하여라.
-- 6개 행 이(가) 삭제되었습니다.
commit;
--커밋 완료.
ROWNUM
-ROWNUM도 ROWID와 마찬가지로 오라클에서 내부적으로 사용하기위한 번호로써
행에 대한 일련번호이다.
-ROWNUM 은 조회할 때 WHERE 절에 바로 쓸 수가 없다는 특징이 있다.
그래서 ROWNUM 을 가지는 컬럼의 별칭(alias)을 만든 후에 Inline view 를 사용해야만 된다.
ROWNUM 으로 페이징처리하기
TBL_BOARD 테이블
글번호 | 글제목 | 글쓴이 | 작성일자 |
1 | 안녕하세요 | leess | 2022-07-04 12:19:00 |
2 | 반갑습니다 | eomjh | 2022-07-04 12:19:00 |
3 | 건강하세요 | youks | 2022-07-04 12:19:00 |
4 | 기쁘고 감사함이 넘치는 좋은 하루되세요 | leess | 2022-07-04 12:19:00 |
5 | 오늘도 좋은 하루되세요 | hongkd | 2022-07-04 12:19:00 |
- 페이징처리의 공식
where RNO(ROWNUM의 별칭) between (조회하고자하는페이지번호 * 한페이지당보여줄행의개수) - (한페이지당보여줄행의개수 - 1) and (조회하고자하는페이지번호 * 한페이지당보여줄행의개수); - between A and B 에서 A와 B는 등차수열의 일반항 공식과 같다.
- 첫항이 a이고, 공차가 d인 수열에서 n번째의 일반항은 a+(n-1)d 인데,
페이징 처리에서 첫항은 무조건 1이고, 공차 d는 한 페이지당 보여줄 행의 개수이며, n은 조회하고자 하는 페이지 번호이다.
- A는 첫항이 1인 등차수열의 일반항을 구하면 되고,
-B 는 첫항이 2인 등차수열의 일반항을 구하면 된다.
각각의 공차와, 조회하고자 하는 페이지 번호는 같다
결국,BETWEEN 1+(n-1)d AND 2+(n-1)d 이다
TBL_BOARD 테이블에서 한 페이지당 2개의 게시글을 보여주는 페이징 처리를 하려고 한다.
-- 1 페이지 ==> RNO : 1 ~ 2 boardno : 5 ~ 4
select boardno, subject, userid, registerday
from
(
select rownum AS RNO, boardno, subject, userid, registerday
from
(
select boardno
, subject
, userid
, to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS REGISTERDAY
from tbl_board
order by boardno desc
) V
) T
where RNO between 1 and 2;
-- 2 페이지 ==> RNO : 3 ~ 4 boardno : 3 ~ 2
select boardno, subject, userid, registerday
from
(
select rownum AS RNO, boardno, subject, userid, registerday
from
(
select boardno
, subject
, userid
, to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS REGISTERDAY
from tbl_board
order by boardno desc
) V
) T
where RNO between 3 and 4;
-- 3 페이지 ==> RNO : 5 ~ 6 boardno : 1
select boardno, subject, userid, registerday
from
(
select rownum AS RNO, boardno, subject, userid, registerday
from
(
select boardno
, subject
, userid
, to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS REGISTERDAY
from tbl_board
order by boardno desc
) V
) T
where RNO between 5 and 6;
'개발 > Oracle' 카테고리의 다른 글
[Oracle]오라클 TRUNCATE (0) | 2022.07.21 |
---|---|
[Oracle] 오라클 Transaction,SAVEPOINT (0) | 2022.07.21 |
[Oracle] 오라클 Set Operator(SET 연산자,집합연산자) (0) | 2022.07.21 |
[Oracle] 오라클 Join 과제하기 (0) | 2022.07.20 |
[Oracle] 오라클 Join(조인) (0) | 2022.07.20 |
개발을 하며 만났던 문제들과 해결 과정, 공부한 내용 등을 기록합니다.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!