oracle(6)pl/sql的进价 编写分页过程

--编写一个过程,可以向book表添加书,要求通过java程序调用该过程
案例1(无返回值)
--建表
-- book表
create table book
(bookId number,bookName varchar2(50),publishHouse varchar2(50));


--编写过程
-- in 表示这是一个输入参数 不写 默认为in
-- out 表示一个输出参数
create or replace procedure sp_pro7
(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is
begin
insert into book values(spBookId,spbookName,sppublishHouse);
end;


--在java中调用
//调用一个无返回值的过程
public class Test1{
    public static void main(String[] args){
        try{
   //1.加载驱动
   Class.forName("oracle.jdbc.driver.OracleDriver");
   Connection ct = DricerManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:hs","system","123456");


   //2.创建CallableStatement
   CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
   //给?赋值
   cs.setInt(1,10);
   cs.setString(2,"笑傲江湖");
   cs.setString(3,"人民出版社");
   //执行
   cs.execute();
   //关闭
   cs.close();
   ct.close();
} catch (Exception e){
   e.printStackTrace();
}
    }
}






案例2(有输入和输出的存储过程)


--有输入和输出的存储过程
create or replace procedure sp_pro8
(spno in number,spName out varchar2) is
begin
select ename into spName from emp where empno=spno;
end;




--在java中调用
//调用一个有返回值的过程
public class Test1{
    public static void main(String[] args){
        try{
   //1.加载驱动
   Class.forName("oracle.jdbc.driver.OracleDriver");
   Connection ct = DricerManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:hs","system","123456");
   //如何调用有返回值的过程
   //2.创建CallableStatement
   CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?)}");
   //给第一个?赋值
   cs.setInt(1,7788);
   //给第二个?赋值
   cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);
  
   //执行
   cs.execute();
   //取回返回值,要注意?顺序
   String name=cs.getString(2);
   System.out.println("7788的名字"+name);
   //关闭
   cs.close();
   ct.close();
} catch (Exception e){
   e.printStackTrace();
}
    }
}




**调用返回多个值 和返回一个值一样






案例3(返回结果集的过程)
--1 创建一个包,在该包中,我定义类型test_cursor,是个游标
create or replace package tespackage as
type test_cursor is ref cursor;
end tespackage;




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


--3 java调用


public class Test1{
    public static void main(String[] args){
        try{
   //1.加载驱动
   Class.forName("oracle.jdbc.driver.OracleDriver");
   Connection ct = DricerManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:hs","system","123456");
   //如何调用有返回值的过程
   //2.创建CallableStatement
   CallableStatement cs = ct.prepareCall("{call sp_pro9(?,?)}");
   //给第一个?赋值
   cs.setInt(1,7788);
   //给第二个?赋值
   cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
  
   //执行
   cs.execute();
   //得到结果集
   ResultSet rs =(ResultSet)cs.getObject(2);
   
   while(rs.next()){
System.out.println(rs.getInt(1)+" "+rs.getString(2));
   }


   //关闭
   cs.close();
   ct.close();
} catch (Exception e){
   e.printStackTrace();
}
    }
}






--编写分页过程
编写一个存储过程,要求可以输入表名、每页显示记录数、当前页。返回总记录数、总页数、和返回的结果集




--oracle的分页
select t1.*,rownum rn from (select * from emp) t1


select t1.*,rownum rn from (select * from emp) t1 where rownum<=10


--在分页时,可以把下面的sql语句当做一个模版使用
select * from
(select t1.*,rownum rn from (select * from emp) t1 where rownum<=10)
where rn>=6






--开发一个包
create or replace package tespackage as
type test_cursor is ref cursor;
end tespackage;




--开始编写分页的过程




create or replace procedure fenye
(tableName in varchar2,
pageSize in number,--一页显示的记录数
pageNow in number,
myrows out number,--总记录数
myPageCount out number,--总页数
p_cursor out tespackage.test_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 t1.*,rownum rn from (select * from '||tableName||') t1 where rownum<='||v_end||') where rn>='||v_begin||'';
--把游标和sql关联
open p_cursor for v_sql;
--计算myrows和myPageCount
--组织一个sql
v_sql:='select count(*) from '||tableName;
--执行sql,并把返回的值赋值给myrows
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测试




public class FenYe{
    public static void main(String[] args){
        try{
   //1.加载驱动
   Class.forName("oracle.jdbc.driver.OracleDriver");
   Connection ct = DricerManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:hs","system","123456");
   //如何调用有返回值的过程
   //2.创建CallableStatement
   CallableStatement cs = ct.prepareCall("{call fenye(?,?,?,?,?,?)}");
   //给?赋值
   cs.setString(1,"emp");
   cs.setInt(2,5);
   cs.setInt(3,1);
  
  //注册总记录数
   cs.registerOutParameter(4,oracle.jdbc.OracleTypes.INTEGER);
   //注册总页数
   cs.registerOutParameter(5,oracle.jdbc.OracleTypes.INTEGER);
   //注册返回的结果集
   cs.registerOutParameter(6,oracle.jdbc.OracleTypes.CURSOR);
   //执行
   cs.execute();
   //取出总记录数/这里要注意,getInt(4)中4,是由该参数的位置决定的
   int rowNum = cs.getInt(4);
   int pageCount = cs.getInt(5);
            //得到结果集
   ResultSet rs =(ResultSet)cs.getObject(6);
   
   //显示一下
   System.out.println("rowNum="+rowNum);
   System.out.println("总页数:"+pageCount);
   while(rs.next()){
System.out.println("编号:"+rs.getInt(1)+"名字:"+rs.getString(2));
   }


   //关闭
   cs.close();
   ct.close();
} catch (Exception e){
   e.printStackTrace();
}
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值