PL/SQL(二)

PLSQL  条件控制语句

if-then ,if -then -elseif-else,if-then-else

输入一个员工,如果其工资小于2000 就让其工资加100

create or replace procedure my_pro(name varchar2) is

v_sal emp.sal%type;

begin 

select sal into v_sal from emp where ename  = name;

if (v_sal<2000) 

then

update emp set sal = sal + 100 where ename = name;

end if;

end;

 

exec mypro('SCOTT');

 

如果补助不为0就加100,如果为0就设为200补助

if v_comm <>0 then   --  +100 操作

else  -- 设为200

end if;

 

多种判断

if b1 then   xxx

elsif b2 then  xxx

else  xxx

end if;

 

循环结构

for while ,do..while

loop  

end loop;

 

while b loop 

  xxx

end loop

end;

for 很少用,不太灵活,每次只能增1

for i in reverse 1..10 loop

xxxx;

end loop;

end;

 

goto  不建议使用

如果有多种循环,如果某种原因需要从最里面的循环跳到外面其中的某种循环的话需要用goto.goto 可读性很差

goto mylabel  

用法 <<mylabel>>

<<mylabel>> 放到哪里就跳到哪里

 

null 

if b then else null; end if;

 

分页过程

 

过程的参数  过程名(参数名1 in 类型,....)  注意in为可选参数

 

有返回值的过程 (有输入有输出)

create or replace procedure mypro (noid in varchar2,name out varchar2) is

begin 

select ename into name from emp where empno = noid;

end;

 

java 如何得到输出值呢?

CallableStatement cs = conn.prepareCall("{call mypro(?,?)}");

cs.setInt(1,7873); //员工阿訇为7873

cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);

// 此处必须一一对应,都必须注册

cs.execute();

System.out.print("员工名字为"+ cs.getString(2));

 

多个返回值就写多个out 

但是参数很多,想得到结果集如何办?

 

用package

创建一个包,定义一个mytest_cursor游标类型

create or replace package testpackage as 

type mytest_cursor is ref cursor

end testpackage;

 

2 创建过程

create or replace procedure my_pro(deptno in number,out_cursor out  testpackage.mytest_cursor) is 

begin 

open out_cursor for 

select * from emp where deptno = deptno;

end;

 

3 java调用返回结果集

CallableStatement cs = conn.prepareCall("{call mypro(?,?)}");

cs.setInt(1,10); //10 号部门

cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);

cs.execute();

// 得到结果集

ResultSet rs = (ResultSet)cs.getObject(2);

while(rs.next){

System.out.println(rs.get(1) + "...........");

//

}

 

分页:传入表名,每页显示的记录数,当前页。

然后返回总条数,总页数,当前页的结果集

分页的语句

select * from (select t1.*,rowrnum from(select * from emp t1) where rownum >= 10) where rn >= 6;

 

 

create or replace procedure page

(tablename in varchar2,pagesize in number,currentpage in number

allsize out number,allpage out number,

out_cursor out  testpackage.mytest_cursor

) is

-- 定义一个sql

v_sql varchar2(300);

v_startnum number:=(current-1)*pagesize+1;

v_endnum number:=v_startnum + pagesize;

v_sql:='select * from (select t1.*,rowrnum from(select * from '||tablename||' t1) where rownum >= '||endnum||') where rn >= '||startnum||';';

beign 

open out_cursor for v_sql;

 -- 计算总行数总页数

v_sql:='select count(*) from '||tablename;

 -- 执行并返回记录数

execute immediate into allsize;

 -- 计算总页数

if mod(allsize,pagesize)=0

  then 

all page  := allsize / pagesize- 1;

end if;

close out_cursor ;

end;

 

用java测试

 

CallableStatement cs = conn.prepareCall("{call page(?,?,?,?,?,?)}");

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();

// 得到其他信息

// 得到结果集

ResultSet rs = (ResultSet)cs.getObject(6);

while(rs.next){

System.out.println(rs.get(1) + "...........");

//

}

 

如果想按照薪水倒叙呢只需要在过程拼接的sql 添加 order by sal 

疑问? 动态的为表分页,但是不同的表可能按照不同的字段排序,同一个表不同的地方也可能按照不同的字段排序。如何解决?

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值