2011-08-15 2 views
1

나는 패키지 중 하나에서이 절차를 가지고 :JSP에서 호출 가능한 statment/prepared 프로 시저의 출력을 페이지 매기기 (paginate)하려면 어떻게합니까?

PROCEDURE get_namelist 
    (
    return_code_out OUT VARCHAR2, 
    return_msg_out OUT VARCHAR2, 
    id_no_in IN employee.id_no%TYPE, 
    name_out OUT employee.name%TYPE, 
     addr_out OUT employee.addr%TYPE 
) 
    IS 

    BEGIN 

    return_code_out := '0000'; 
    return_msg_out := 'OK'; 

    SELECT i.name, i.addr INTO name_out, addr_out 
     FROM employee i 
    WHERE i.id_no = id_no_in; 

END get_namelist; 

나는 나의 자바에서이 같은이 프로 시저를 호출하고 있습니다 :

DbUtil db = null; 
java.sql.CallableStatement cstmt = null; 


db = new DbUtil(); 
cstmt = db.prepareCall("{ call jack.PACK_EMPLOYEE.get_namelist(?, ?, ?, ?, ?) }"); 

cstmt.registerOutParameter(1,OracleTypes.VARCHAR); 
cstmt.registerOutParameter(2,OracleTypes.VARCHAR); 
cstmt.setString(3,this.getIdNo()); 
cstmt.registerOutParameter(4,OracleTypes.VARCHAR); 
cstmt.registerOutParameter(5,OracleTypes.VARCHAR); 
stmt.execute(); 

this.setName(cstmt.getString(4)); 
this.setAddress(cstmt.getString(5)); 

을 현재는 테이블에서 모든 데이터를 당기는. 이를 변경하여 특정 수의 행을 여러 페이지로 가져옵니다. 필자는 Java 코드 자체에서 SQL 쿼리를 사용할 때 JSP 페이지 매김을 수행하는 방법을 찾아 냈지만 패키지 및 호출 문을 사용하여이를 보여주는 예제는 찾지 못했습니다.

JSP 페이지 매김을 사용할 수 있도록이 코드를 어떻게 수정할 수 있습니까?

답변

3

페이지 크기 및 페이지 번호를 프로 시저에 추가하십시오.

행이 조회를 통해 번호 추가 한 다음 레코드를 반환 경우 행 번호> ((페이지 크기 - 1) * 페이지 번호 + 1)과 행 번호 < = (페이지 크기 * 페이지 번호)

하는 경우 당신은 더 낮은 수준의 대답이 필요합니다, 나는 이것을 관련 코드로 번역 할 수 있습니다.


부인 : My Oracle Syntax는 끔찍할 수 있습니다. 이것을 어떻게 만들려고 시도했는지에 대해서는 Oracle ROW_NUMBER 설명 (마지막 예제)을 참조하십시오.

// 절차

PROCEDURE get_namelist 
    (
    return_code_out OUT VARCHAR2, 
    return_msg_out OUT VARCHAR2, 
    id_no_in IN employee.id_no%TYPE, 
    page_num IN (int datatype),    
    page_size IN (int datatype),    
    name_out OUT employee.name%TYPE, 
     addr_out OUT employee.addr%TYPE, 
) 
    IS 

    BEGIN 

    return_code_out := '0000'; 
    return_msg_out := 'OK'; 

    SELECT i.name, i.addr INTO name_out, addr_out, 
     FROM 
      (SELECT e.name, e.addr, 
       ROW_NUMBER() OVER (ORDER BY e.name) as row   
       FROM employee e 
       WHERE e.id_no = id_no_in) i 
     WHERE row between ((page_num - 1) * page_size) AND (page_num * page_size); 

END get_namelist; 

// 자바

DbUtil db = null; 
java.sql.CallableStatement cstmt = null; 


db = new DbUtil(); 
cstmt = db.prepareCall("{ call jack.PACK_EMPLOYEE.get_namelist(?, ?, ?, ?, ?, ?, ?) }"); 

cstmt.registerOutParameter(1,OracleTypes.VARCHAR); 
cstmt.registerOutParameter(2,OracleTypes.VARCHAR); 
cstmt.setString(3,this.getIdNo()); 
cstmt.setString(4,pagenum); 
cstmt.setString(5,pagesize); 
cstmt.registerOutParameter(6,OracleTypes.VARCHAR); 
cstmt.registerOutParameter(7,OracleTypes.VARCHAR); 
stmt.execute(); 

this.setName(cstmt.getString(4)); 
this.setAddress(cstmt.getString(5)); 

이 표시가 아닌 다른 페이지를 필요할 때마다 당신은 다른 pagenum 자바를 통해 프로 시저를 호출합니다.

+0

감사합니다. Sam,이게 처음이라. 정확히 어떻게 작동하는지 보여 주면 좋을 것 같습니다. – Jack

+0

@Jack, 나는 코드를 제공하려고 시도했다. 즉, 전 SQL Server에서만 Oracle에서이 정확한 작업을 수행하지 않았습니다. 따라서 일부 구문이 올바르지 않을 수 있으며, 필자가 작성한 Oracle 페이지의 링크를 제공했습니다. –

+0

정말 고마워요. – Jack