PL/SQL (三)

-----------------------------------------------------------------------------------------------------------------------------------------------------

--有返回值的存储过程,且返回值是一个结果集
--案例:输入部门编号(deptno),返回该部门所有员工的信息


--创建一个包(此处用as),在包中定义了一个游标类型test_cursor,
create or replace package testpackage as
type test_cursor is ref cursor;
end testpackage;


--创建存储过程
create or replace procedure sp_pro55(spNo in number,p_cursor out testpackage.test_cursor) is
begin
open p_cursor for select * from emp where deptno=spNo;
end;


--在java中调用
/*
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","jsd161102");
//创建CallableStatement
CallableStatement cs = conn.prepareCall("{call sp_pro55(?,?)}");
//给第一个?赋值
cs.setInt(1, 10);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.CURSOR);//游标
//执行
cs.execute();
//取出返回值,结果集
ResultSet rs = (ResultSet) cs.getObject(2);
while(rs.next()){
System.out.println(rs.getInt("empno")+","+rs.getString("ename"));//写1或2也可以
}
*/

===============================================================================

案例:

--将emp表中所有数据查询出来,返回结果集(使用游标)
create or replace package sp_package1 as
type sp_cursor is ref cursor;
end sp_package1;


--创建存储过程
create or replace procedure sp_pro10
(sp_table_cursor out sp_package1.sp_cursor) is
begin
open sp_table_cursor for select * from emp; 
end;

---------java代码------------

package test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 * java调用存储过程将,返回结果集(使用游标)
 */
public class TestOracle7 {
	private static String url = "jdbc:oracle:thin:@localhost:1521:orcl";
	private static String username = "scott";
	private static String password = "jsd161102";
	public static void main(String[] args) {
		List<Emp> list = getList();
		for(Emp e : list){
			System.out.println(e);
		}
	}
	
	public static List<Emp> getList() {
		Connection conn = null;
		List<Emp> emps = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url,username,password);
			CallableStatement cs = conn.prepareCall("{call sp_pro10(?)}");
			cs.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
			cs.execute();
			ResultSet rs = (ResultSet) cs.getObject(1);
			emps = new ArrayList<Emp>();
			while(rs.next()){
				Emp emp = new Emp();
				emp.setComm(rs.getDouble("comm"));
				emp.setDeptno(rs.getInt("deptno"));
				emp.setEmpno(rs.getInt("empno"));
				emp.setEname(rs.getString("ename"));
				emp.setHiredate(rs.getDate("hiredate"));
				emp.setJob(rs.getString("job"));
				emp.setMgr(rs.getInt("mgr"));
				emp.setSal(rs.getDouble("sal"));
				emps.add(emp);
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return emps;
	}
}

测试结果:

Emp [empno=7369, ename=SMITH, job=CLERK, mgr=7902, hiredate=1980-12-17, sal=210.0, comm=0.0, deptno=20]
Emp [empno=7499, ename=ALLEN, job=SALESMAN, mgr=7698, hiredate=1981-02-20, sal=1600.0, comm=300.0, deptno=30]
Emp [empno=7521, ename=WARD, job=SALESMAN, mgr=7698, hiredate=1981-02-22, sal=1250.0, comm=500.0, deptno=30]
Emp [empno=7566, ename=JONES, job=MANAGER, mgr=7839, hiredate=1981-04-02, sal=3475.0, comm=0.0, deptno=20]
Emp [empno=7654, ename=MARTIN, job=SALESMAN, mgr=7698, hiredate=1981-09-28, sal=1250.0, comm=1400.0, deptno=30]
Emp [empno=7698, ename=BLAKE, job=MANAGER, mgr=7839, hiredate=1981-05-01, sal=2850.0, comm=0.0, deptno=30]
Emp [empno=7782, ename=CLARK, job=MANAGER, mgr=7839, hiredate=1981-06-09, sal=2450.0, comm=0.0, deptno=10]
Emp [empno=7788, ename=SCOTT, job=ANALYST, mgr=7566, hiredate=1987-04-19, sal=110.0, comm=11.0, deptno=20]
Emp [empno=7839, ename=KING, job=PRESIDENT, mgr=0, hiredate=1981-11-17, sal=6000.0, comm=0.0, deptno=10]
Emp [empno=7844, ename=TURNER, job=SALESMAN, mgr=7698, hiredate=1981-09-08, sal=1500.0, comm=0.0, deptno=30]
Emp [empno=7876, ename=ADAMS, job=CLERK, mgr=7788, hiredate=1987-05-23, sal=1100.0, comm=0.0, deptno=20]
Emp [empno=7900, ename=JAMES, job=CLERK, mgr=7698, hiredate=1981-12-03, sal=950.0, comm=0.0, deptno=30]
Emp [empno=7902, ename=FORD, job=ANALYST, mgr=7566, hiredate=1981-12-03, sal=3000.0, comm=0.0, deptno=20]
Emp [empno=7934, ename=MILLER, job=CLERK, mgr=7782, hiredate=1982-01-23, sal=1300.0, comm=0.0, deptno=10]

================================================================================

分页:


案例:

存储过程如下:

-----------------------------------------------------------
--开发一个包,定义游标(使用上述包)


---------------编写分页的过程---------------
create or replace procedure fenye(
  tableName in varchar2,--表名字
  PageSize in number, --每页显示条数
  pageNow in number,--当前是第几页
  myRows out number, --总记录数
  myPageCount out number,--总页数
  p_cursor out sp_package1.sp_cursor--返回的记录集
) is
--定义部分
--定义sql语句 字符串
v_sql varchar2(1000);
--定义两个整数
v_begin number:=(pageNow-1) * PageSize + 1;
v_end number:=pageNow * PageSize;
begin
v_sql:='select * from (select rownum rw,t.* from (select * from '|| tablename
||' order by sal)t ) where rw >='||v_begin||' and rw<='||v_end;
--打开游标,关联sql
open p_cursor for v_sql;
--计算myRows(总记录数)
--组织一个sql,并把返回值赋值给myRows
v_sql:='select count(*) from '||tableName;
execute immediate v_sql into myRows;
--计算myPageCount(每页显示条数)
if mod(myRows,PageSize)=0 then
myPageCount:=myRows/PageSize;
else
myPageCount:=myRows/PageSize + 1;
end if;
--关闭游标
--close p_cursor;
end;

-------------------------------------------------------------------------------------

java代码如下:

package test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * 调用有返回值的存储过程,返回值为结果集
 */
public class TestOracle8 {

	public static void main(String[] args) {
		Connection conn = null;
		try{
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","scott","jsd161102");
			//创建CallableStatement
			CallableStatement cs = conn.prepareCall("{call fenye(?,?,?,?,?,?)}");
			/**
			 *  tableName in varchar2,--表名字
  				PageSize in number, --每页显示条数
  				pageNow in number,--当前是第几页
  				myRows out number, --总记录数
  				myPageCount out number,--总页数
  				p_cursor out sp_package1.sp_cursor--返回的记录集
			 */
			//给第一个?赋值
			cs.setString(1, "emp");
			cs.setInt(2, 5);//每页5条
			cs.setInt(3, 2);//显示第2页
			//注册总记录数
			cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);
			//注册总页数
			cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);
			//注册返回的结果集
			cs.registerOutParameter(6, oracle.jdbc.OracleTypes.CURSOR);
			//执行
			cs.execute();
			//取出返回值
			int rowNum = cs.getInt(4);
			int pageCounts = cs.getInt(5);
			ResultSet rs = (ResultSet) cs.getObject(6);
			System.out.println("总记录数:"+rowNum);
			System.out.println("总页数:"+pageCounts);
			while(rs.next()){
				System.out.println(
						"编号:"+rs.getInt("empno")+" \t姓名:"+rs.getString("ename")+" \t薪水:"+rs.getDouble("sal")
				);//写1或2也可以
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(conn != null){
				try {
					conn.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
	}
}

测试结果如下(未关闭游标):

总记录数:14
总页数:3
编号:7654 姓名:MARTIN 薪水:1250.0
编号:7934 姓名:MILLER 薪水:1300.0
编号:7844 姓名:TURNER 薪水:1500.0
编号:7499 姓名:ALLEN 薪水:1600.0
编号:7782 姓名:CLARK 薪水:2450.0




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荒--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值