Oracle写一个部门表dept2(数据至少15条)的分页存储过程,并使用java代码调用输出在jsp页面上。
时间: 2024-02-11 11:06:24 浏览: 20
好的,以下是一个示例的Oracle分页存储过程:
```
CREATE OR REPLACE PROCEDURE p_get_dept2_page(
i_page_num IN NUMBER,
i_page_size IN NUMBER,
o_dept2_list OUT SYS_REFCURSOR
)
IS
v_start_pos NUMBER;
v_end_pos NUMBER;
BEGIN
v_start_pos := (i_page_num - 1) * i_page_size + 1;
v_end_pos := i_page_num * i_page_size;
OPEN o_dept2_list FOR
SELECT *
FROM (
SELECT deptno, dname, loc, ROW_NUMBER() OVER(ORDER BY deptno) AS row_num
FROM dept2
)
WHERE row_num >= v_start_pos AND row_num <= v_end_pos;
END;
```
该存储过程接受三个参数:
- i_page_num:当前页数
- i_page_size:每页记录数
- o_dept2_list:输出参数,为游标类型,用于返回查询结果集
该存储过程的主要逻辑如下:
- 根据传入的i_page_num和i_page_size计算出需要查询的记录的起始位置和终止位置。
- 使用SELECT语句查询符合条件的记录,并且根据计算出的起始位置和终止位置进行分页。
- 将查询结果集返回给调用者。
以下是Java代码调用该存储过程并将结果集输出在JSP页面上的一个示例:
```
<%@ page import="java.sql.*" %>
<%
Connection conn = null;
CallableStatement cstmt = null;
ResultSet rs = null;
try {
// 连接数据库
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "username", "password");
// 调用存储过程
cstmt = conn.prepareCall("{CALL p_get_dept2_page(?, ?, ?)}");
cstmt.setInt(1, 2); // 第2页
cstmt.setInt(2, 5); // 每页5条记录
cstmt.registerOutParameter(3, OracleTypes.CURSOR); // 输出参数
cstmt.execute();
rs = (ResultSet) cstmt.getObject(3);
// 输出结果集
out.println("<table border=\"1\">");
out.println("<tr><th>DeptNo</th><th>DName</th><th>Loc</th></tr>");
while (rs.next()) {
out.println("<tr>");
out.println("<td>" + rs.getInt("deptno") + "</td>");
out.println("<td>" + rs.getString("dname") + "</td>");
out.println("<td>" + rs.getString("loc") + "</td>");
out.println("</tr>");
}
out.println("</table>");
} catch (Exception e) {
e.printStackTrace();
} finally {
try { if (rs != null) rs.close(); } catch (Exception e) {}
try { if (cstmt != null) cstmt.close(); } catch (Exception e) {}
try { if (conn != null) conn.close(); } catch (Exception e) {}
}
%>
```
该示例代码使用JDBC连接Oracle数据库,并调用存储过程p_get_dept2_page进行分页查询。查询结果集使用游标类型返回,并使用ResultSet对象进行遍历输出。需要注意的是,示例代码中的数据库连接、用户名和密码需要根据实际情况进行修改。