PL/SQL分页过程

[size=large][/size]控制结构   ①使用if语句②循环③使用控制语句—goto和null;
条件分支语句
Pl/sql中提供了三种条件分支语句 if-then,if-then-else,if-then-elsif-else
简单的条件判断if-then
create or replace procedure sp_pro6(spName varchar2) is
v_sal EMP.SAL%type;
begin
select sal into v_sal from emp where ename=spName;
if v_sal<2000 then
update emp set sal=sal*1.1 where ename=spName;
end if;
end;
二重条件分支 if-then-else
?编写一个过程,可以输入一个雇员名,如果该雇员的补助不是0,就在该基础上增长10%,如果是0就直接改为200;
create or replace procedure sp_pro8(spName varchar2) is
  v_comm EMP.COMM%type;
begin
  select comm into v_comm from emp where ename = spName;
  if v_comm <> 0 then
    update emp set comm = comm + 100 where ename = spName;
  else
    update emp set comm = comm + 200 where ename = spName;
  end if;
end;
多重条件分支 if-then-elsif-else
?编写一个过程,可以输入一个雇员的编号,如果该雇员是PRESIDENT,就给他的工资增加1000,如果该雇员是MANAGER,就给他工资增加500,其它职位的雇员工资加200.
create or replace procedure sp_pro9(spNo number) is
  v_job EMP.JOB%type;
begin
  select job into v_job from emp where empno = spNo;
  if v_job = 'PRESIDENT' then
    update emp set sal = sal + 1000 where empno = spNo;
  elsif v_job = 'MANAGER' then
    update emp set sal = sal + 500 where empno = spNo;
  else
    update emp set sal = sal + 200 where empno = spNo;
  end if;
end;
循环语句-loop  以loop开头,以end loop结尾
?编写一个过程,可输入用户名,并循环添加10个用户到uers表中,用户编号从1开始增加。
create or replace procedure sp_pro1(spName varchar2) is
v_num number:=1;
begin
  loop
  insert into users values (v_num,spName);
  exit when v_num=10;
  v_num:=v_num+1;
  end loop;
end;
循环语句-while  以while开头,以end while结尾
create or replace procedure sp_pro1(spName varchar2) is
v_num number:=11;
begin
  while v_num<=20 loop
  insert into users values (v_num,spName);
   v_num:=v_num+1;
  end loop;
end;
循环语句-for(不建议使用)
顺序控制语句-goto 用于跳转到特定标号去执行语句,复杂性,可读性差,不建议使用。 set serveroutput on;
declare
  i int := 1;
begin
  loop
    dbms_output.put_line('输出i=' || i);
    if i = 10 then
      goto end_loop;
    end if;
    i := i + 1;
  end loop;
  <<end_loop>>
  dbms_output.put_line('循环结束');
end;
(知道就行)null-语句不用执行任何操作,并且会直接将控制传递到下一个语句,提高PL/SQL的可读性。
编写分页的过程
现有一张表book
create table book(bookId number,booName varchar2(50),publishHouse varchar2(50));
添加(创建过程)
create or replace procedure sp_pro2(spBookId       in number,
                                    spBookName     varchar2,
                                    spPublishHouse varchar2) is
begin
  insert into book values (spBookId, spBookName, spPublishHouse);
end;
(在Java语句中执行)
public static void main(String[] args) {
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
CallableStatement cs=conn.prepareCall("{call sp_pro2(?,?,?)}");
cs.setInt(1, 10);
cs.setString(2,"笑傲江湖");
cs.setString(3,"人民出版社");
cs.execute();
返回值过程 有输入和输出的存储过程
create or replace procedure sp_pro3(spno in varchar2,spName out varchar2) is
begin
select ename into spName from emp where empno=spno;
end;
(在Java语句中执行)
CallableStatement cs=conn.prepareCall("{call sp_pro3(?,?)}");
cs.setInt(1,7566);
cs.registerOutParameter(2, oracle.jdbc.OracleTypes.VARCHAR);
cs.execute();
String name=cs.getString(2);
System.out.println(name);
返回结果集过程 由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用package了,所以要分两部分:
①建一个包,如下:
--在该包中定义游标类型test_cursor
create or replace package testpackage as type test_cursor is ref cursor;
end testpackage;
②创建过程
create or replace procedure sp_pro4(spno in number,p_cursor out testpackage.test_cursor) is
begin
open p_cursor for select * from emp where empno=spno;
end;
③在Java语句中执行
CallableStatement cs=conn.prepareCall("{call sp_pro4(?,?)}");
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(1)+rs.getString(2)+"fuck");
}
创建分页过程
create or replace procedure fenye(tableName in varchar2,pageSize in number,pageNow in number,myrows out number,myPageCount out number,
p_cursor out testPackage.test_cursor) is
--定义SQL语句 字符串
v_sql varchar2(1000);
begin
v_sql:='select * from (select a1.*,rownum rn from (select * from '||tableName
||') a1 where rownum<='||pageSize*pageNow||'  where rn>='||((pageNow-1)*pageSize+1);
--把游标和SQL关联(开发环境会自动判断v_sql变量)
open p_cursor for v_sql;
--计算myrows和myPageCount
v_sql:='select * from '||tableName;
execute immediate v_sql into myrows;
if mod(myrows,pageSize)=0 then
myPageCount:=myrows/pageSize;
else
myPageCount:=myrows/pageSize+1;
end if;
close p_cursor;
end;
在JAVA中执行(自己动手吧)

你可能感兴趣的:(oracle,sql,jdbc,出版)