내 블로그 목록

금요일, 9월 04, 2009

MS SQL Server 2000의 TOP과 Oracle의 ROWNUM을 이용한 갯수제한

오라클 DB를 위한 솔루션

TOP 키워드는 ANSI SQL standard 가 이니다. 그래서 오라클에서는 지원하지 않는다. 하지만 다행스럽게도 우리는 오라클 stored procedure에 대하여서도 동일한 솔루션을 얻을수 있다. 오라클에서는 가상컬럼인 ROWNUM을 지원한다. 오라클로부터 조회된 각각의 ROW들에는 조회된 순서대로 ROW number가 assign 된다. (첫번째 row에대하여 1부터 시작한다.) 우리는 ROWNUM을 사용해서 퀴리로부터 가져올 row수를 제한할 수 있다.

예를 들어, stored procedure로부터 첫 11개 row를 가져오고 싶으면, 오라클에서는 아래와같은 코드를 사용해서 가져온다.

SELECT * FROM MyTable WHERE ROWNUM < 11;

page navigation 을 구현하기 위해 Oracle stored procedure로 primary key값을 전달한다.

Select *
From tbl_SiteList
Where siteID > @SiteID and ROWNUM < 11
Order by siteID

Oracle OLEDB driver로부터 오라클 스토어드프로시져를 access할때의 제한사항을 명심해야한다. ADO 2.1의 Oracle OLEDB provider 는 오라클 Stored procedure로부터 REF 커서타입을 리턴하지 못한다. 데이터를 가져오기 위해서는 PL/SQL 테이블을 선언해야만 한다. 그러나 ADO 2.5에서는 REF CURSOR 타입을 리턴할수 있다. 다음의 코드는 오라클 package와 procedure를 생성하는 예제이다.

CREATE OR REPLACE PACKAGE PageNavi AS
TYPE Nav_cursor IS REF CURSOR ;
Procedure Prc_Forward (SiteID IN NUMBER, Rtn_cursor IN OUT Nav_cursor);
END curspkg_join;
/

CREATE OR REPLACE PACKAGE BODY PageNavi AS
Procedure Prc_Forward (SiteID IN NUMBER, Rtn_cursor IN OUT Nav_cursor)
IS
local_cursor Nav_cursor;
BEGIN
IF SiteID <> 0
THEN
OPEN local_cursor FOR
Select *
from tbl_SiteList
where siteID > SiteID and ROWNUM < 11
order by siteID;
END IF;
Rtn_cursor := local_cursor;
END Prc_Forward;
END PageNavi;
/

위 코드는 SiteID 의 조건에 해당하는 레코드셋을 리턴할 것이다. 레코드의 갯수는 ROWNUM 에 의해 걸러진다. 그러면 이제 ADO 2.5를 통해서 package를 부를수 있고, 결과를 ASP page에 보여줄 수 있다.

MYSQL에서는 limit로 이러한 것을 지원한다.
select * from table_01 where secret=0 order by hit desc limit 10; 

댓글 없음: