Oracle基础(五)pl/sql进阶(分页过程)(一)

2015-07-24 06:22:17 · 作者: · 浏览: 1

编写分页过程

通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标,如何在java中调用等内容的学习。

1、无返回值的存储过程

例如 1、可以向book表添加书,

---建表

Create table book(bookId number,bookName varchar2(50),publishHouse varchar2(50));

--编写过程 in 表示变量为输入值,如果不写默认为输入值,而不是输出变量,out为输出值

Create or replace procedure sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2)is

Begin

Insert into book valuse(spBookId ,spbookName,sppublishHouse );

End

---java 中如何调用

?

Package com.sp;
Importjava.sql.*;
Publicclass Test1{
 public static void main(string[] args){
 
   try{
    //1加载驱动
     Class.forName("Oracle.jdbc.driver.OracleDriver");
     Connetionct=DriverManger.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1","scott","123");
    //2创建callablestatement
    Callablestatement cs=ct.preparecall(“{call sp_pro7(?,?,?)}”);
   //给?赋值
    Cs.setInt(1,10);
    Cs.setstring(2,“笑傲江湖”);
    Cs.setstring(3,"人民出版社");
   //执行
    Cs.execute();;
 
      }
   Catch(EXCEPTION E){
    e.printstacktrace();
 
 
     }
Finally{
  关闭各个链接
 
      }
 
    }
 
}

?

2、有返回值的存储过程

例如输入书编号返回书姓名

Create or replace procedure sp_pro8(spno in number,spkName out varchar2,spsal out varchar2) is

Begin

select ename ,spsal,into spName, spsal form emp where empno=spno;

End

在java中如何调用

?

Package com.sp;
Importjava.sql.*;
  Publicclass Test1{
     public static void main(string[] args){
  
      try{
       //1加载驱动
       Class.forName("Oracle.jdbc.driver.OracleDriver");
       Connetionct=DriverManger.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1","scott","123");
       //2创建callablestatement
       Callablestatement cs=ct.preparecall(“{call sp_pro8(?,?)}”);
       //给?赋值
       Cs.setInt(1,7788);
       Cs.registerOutParemeter(2,oracle.jdbc.oracleTyps.varchar)//执行 
       Cs.registerOutParemeter(3,oracle.jdbc.oracleTyps.double)//执行 //oracle.jdbc.oracleTyps.varchar 表示执行的类型
       Cs.execute();
        //取出返回值,要注意?顺序
       String name=sc.getstring(2);
       String job=cs.getstring(3);
       System.out.println(“7788的名字”+name +“7788的工资”+sal);
 
 
     }
     Catch(EXCEPTION E){
      e.printstacktrace();
 
     }
    Finally{
  关闭各个链接
 
     }
 
    }
 
}

3、有返回值的存储过程,以列表结果集的形式返回

?

oracle存储过程本身没有返回时用out参数替代的,集合需要用package

--建立包,定义类型test_cursor

Create or replace packagetestpackage as

Typetest_cursur is ref cursor;

End testpackage

建立存储过程

Create or repalce procedure sp_pro9(spNo in number,P_cursor out tespackage,test_cursor) is

begin

Open p_cursor for select *from emp where depto-spNo;

End;

--如何在java中调用

?

Package com.sp;
Importjava.sql.*;
Publicclass Test1{
   public static void main(string[] args){
 
     try{
    //1加载驱动
     Class.forName("Oracle.jdbc.driver.OracleDriver");
     Connetionct=DriverManger.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:myora1","scott","123");
    //2创建callablestatement
     Callablestatement cs=ct.preparecall(“{call sp_pro9(?,?)}”);
    //给?赋值
    Cs.setInt(1,10);
    Cs.registerOutParemeter(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));
          }
 
      }
   Catch(EXCEPTION E){
      e.printstacktrace();
    }
  Finally{
  关闭各个链接
 
      }
 
    }
 
  }

4、----oracle的分页规律介绍

?

Sql>select t1.*, rownum rn from(select * from emp) t1;

Sql>select t1.*, rownum rn from(select *