Q & A

시삽: 레드플러스 님 
게시판 이동:
 제목 : 게시판 저장프로시저(SP) 목록 페이징처리한거 만드는건데요..
글번호: 439
작성자: 서방원
작성일: 2007/03/09 오전 1:56:00
조회수: 5031
안녕하세요...제가 회사 수습으로 현재 교육을 받고 있는데 이번 과제였던 게시판 구현을위해 저장프로시저로 게시판 목록을 20개씩 나눠서 표현을 할수있게 만드는거였습니다.
아쉽게도 혼자 구현을 못하고...(ㅡㅡ; 머리가 딸린지 계속 제자리 걸음만 3일간했음).
결국....회사에서 참고하라고준 쿼리문을 보고 복사해 붙여넣기 방식으로 했습니다.
한번보시고 이보다 좋은 방법이나 다른 구현 방법있으시면 좀 가르쳐주세요.... 많은 답변 부탁드립니다.ㅠㅠ 수습3개월을 버티긴 버티겠지만....조금이라도 내꺼로 만들어야겠다는 생각에 다른 방법도 알아보는데 쉽게 안나와서...


--=======================================================================================
-- 게시판 리스트
--
--=======================================================================================
-- 사용자 함수 생성
-- 해당 글의 댓글수
CREATE function get_comment_count (@board varchar(50),@idx int)
returns int
as
begin
declare  @comment_count int, @board_comment varchar(20)    -- @comment_count 해당글의 댓글수 / @board_comment 게시판 테이블명
begin
    
     if @board = 'free_board'
    begin
        select @comment_count=count(*) from free_board_comment where _parent_idx = @idx and active_state = 1
    end
    
    --set @sql = 'set @board_comment = '+@board+'_comment'
    --set @sql = @sql + 'select @comment_count=count(*) from '+@board_comment+' where idx = '+@idx
    --execute(@sql)
end
return (@comment_count)
end

-- 저장 프로시저
create proc lsw_free_board_list
    @start_idx int =1,                -- 해당페이지에서 시작될 글 번호
    @page_size int = 20,            -- 한페이지당 보여줄 글수
    @search int = 0,                -- 조건문
    @search_sdate varchar(10) = '',    -- 검색 날짜 부터~
    @search_edate varchar(10) = '',    -- 검색 날짜 까지
    @search_field varchar(20) = '',    -- 검색 조건
    @search_txt varchar(100) = ''    -- 검색 단어
AS
set nocount on
declare @sql varchar(5000)
declare @length int
set @length=50
if (@start_idx is null) or (@start_idx < 1)
begin
    set @start_idx = 1
end
if (@page_size is null) or (@page_size <1)
begin
    SET @page_size =10
end

-- 검색문
declare @search_str varchar(100)
set @search_str = ''
if    @search = 1
    set @search_str = ' and Write_time >= '''+@search_sdate+''' and
    write_time <= '''+convert(varchar, dateadd(d, 1, @search_edate), 23)+''''
else if @search = 2
    set @search_str = ' and '+@search_field+' like '+'''%'+@search_txt+'%'' '
else if @search = 3
    set @search_str = ' and write_time >= ' +@search_sdate+' and
    wriite_time <= '''+convert(varchar, dateadd(d, 1, @search_edate), 23)+''' and
    '+@search_field+' like '+'''%'+@search_txt+'%'' '

-- 임시테이블 생성
set @sql=
    '
    declare @start_idx int, @page_size int, @count int, @b_idx int
    declare @boardtable table (
    idx bigint not null,
    id varchar(15) not null,
    name varchar(20) not null,
    aca_name varchar(30) null,
    hit int null,
    praise int null,
    membertype int null,
    write_time datetime null,
    subject varchar (100) null,
    contents text null,
    fname varchar(100) null,
    ftype varchar(30) null,
    fencodename varchar(200) null,
    active_state int not null
)
set transaction isolation level read uncommitted
'

-- 가져올 글 수에 대한 공간 확보
set @sql = @sql + '
    set @start_idx = ' + convert(varchar, @start_idx)+
    '
    set @page_size = ' + convert(varchar, @start_idx+@page_size) +
    '
    select @count = count(idx)
    from free_board
'
-- 커서 생성 및 시작 포인트 잡기
set @sql = @sql + '
    declare board_cursor cursor local static read_only for
    select top '+convert(varchar, @start_idx+@page_size)+' idx
    from free_board
    where active_state = 1'+@search_str+' order by idx desc'

-- 커서 실행 게시판 데이터로부터 받은 값을 임시테이블로 삽입
set @sql = @sql + '

    if @count > 0
    begin
        
        open board_cursor

        fetch absolute @start_idx from  board_cursor
        into @b_idx

        while @@fetch_status = 0 and @start_idx < @page_size
        begin
            set @start_idx = @start_idx + 1
            insert @boardtable
            select
                
                idx,
                id,
                name,
                aca_name,
                hit,
                praise,
                membertype,
                write_time,
                subject,    
                contents,
                fname,
                ftype,
                fencodename,
                active_state
            
                from free_board        
        where active_state = 1
        and idx= @b_idx
        fetch next from board_cursor
        into @b_idx
    end
    
    close board_cursor
end
deallocate board_cursor

    if @@error = 0
    begin
        select
            
            idx,
            id,
            name,
            aca_name,
            hit,
            praise,
            membertype,
            write_time,
            (case when len(subject) >'+ convert (varchar, @length) + ' then
            left (subject, ' +convert(varchar, @length ) + ') + ''...''
            else subject
            end) as subject,
            contents,
            fname,
            ftype,
            fencodename,
            active_state,
            get_comment_count(''free_board'', idx) as comment_count
        from @boardtable
    end
    '
--print @sql
exec (@sql)
set nocount off
go
exec free_board_list
 
이전 글   다음 글 삭제 수정 답변 글쓰기 리스트
  hatukoi
  2007-03-09 오후 12:55:21
정말 참고용인듯 하네요...목록 20개 뿌리는데 왠 커서에 테이블 변수까지....
너무 비효율적인거 아닌지;;
보통은 일반적으로 Select Top +변수+ * from 테이블 where idx not in
(서브 쿼리)식으로 페이징 하지 않나요...

(댓글을 남기려면 로그인이 필요합니다.)

관련 아티클 리스트
  제       목 파일 작성자 작성일 조회
이전글 쌤....이건 무슨 오류에요?? (1) - 조혜경 2007-03-09 6883
현재글 게시판 저장프로시저(SP) 목록 페이징처리한거 만드는건데요..(1) - 서방원 2007-03-09 5031
  Re : 게시판 저장프로시저(SP) 목록 페이징처리한거 만드는건데요.. - 고영태 2007-03-09 3677
다음글 쌤...헬프 미~~~ - 조혜경 2007-03-08 3187
 
손님 사용자 Anonymous (손님)
로그인 Home