oracle15 pl/sql 分页

PL/SQL分页
编写分页过程 

无返回值的存储过程
古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解。首先是掌握最简单的存储过程,无返回值的存储过程:
案例:现有一张表book,表结构如下:书号 书名 出版社 

请写一个过程,可以向book表添加书,要求通过java程序调用该过程。
--in:表示这是一个输入参数,默认为in(不写in则默认就是in)
--out:表示一个输出参数
Sql代码
1.create or replace procedure sp_pro7(spBookId in number,spbookName in varchar2,sppublishHouse in varchar2) is  
2.begin  
3.    insert into book values(spBookId,spbookName,sppublishHouse);   
4.end;   
5./  

--在java中调用
Java代码
1.//调用一个无返回值的过程   
2.import java.sql.*;   
3.public class Test2{   
4.    public static void main(String[] args){   6.        try{   
7.            //1.加载驱动   
8.            Class.forName("oracle.jdbc.driver.OracleDriver");   
9.            //2.得到连接   
10.            Connection ct = DriverManager.getConnection("jdbc:oracle:[email protected]:1521:MYORA1","scott","m123");   
11.  
12.            //3.创建CallableStatement   
13.            CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");   
14.            //4.给?赋值   
15.            cs.setInt(1,10);   
16.            cs.setString(2,"笑傲江湖");   
17.            cs.setString(3,"人民出版社");   
18.            //5.执行   
19.            cs.execute();               
20.        } catch(Exception e){   
21.            e.printStackTrace();   
22.        } finally{   
23.            //6.关闭各个打开的资源   
24.            cs.close();   
25.            ct.close();   
26.        }   
27.    }   
28.}  
执行,记录被加进去了 
有返回值的存储过程(非列表)
再看如何处理有返回值的存储过程:
案例:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。
Sql代码
1.--有输入和输出的存储过程   
2.create or replace procedure sp_pro8   
3.(spno in number, spName out varchar2) is  
4.begin  
5.    select ename into spName from emp where empno=spno;   
6.end;   
7./  

Java代码
1.import java.sql.*;   
2.public class Test2{   
3.    public static void main(String[] args){   
4.           
5.        try{   
6.            //1.加载驱动   
7.            Class.forName("oracle.jdbc.driver.OracleDriver");   
8.            //2.得到连接   
9.            Connection ct = DriverManager.getConnection("jdbc:oracle:[email protected]:1521:MYORA1","scott","m123");   
10.            //看看如何调用有返回值的过程   
11.            //创建CallableStatement   
12.            CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?)}");   
13.  
14.            //给第一个?赋值   
15.            cs.setInt(1,7788);   
16.            //给第二个?赋值   
17.            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);   
18.  
19.            //5.执行   
20.            cs.execute();      
21.            //取出返回值,要注意?的顺序   
22.            String name=cs.getString(2);    
23.            System.out.println("7788的名字"+name);           
24.        } catch(Exception e){   
25.            e.printStackTrace();   
26.        } finally{   
27.            //6.关闭各个打开的资源   
28.            cs.close();   
29.            ct.close();   
30.        }   
31.    }   
32.}  
运行,成功得出结果。。 
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。
Sql代码
1.--有输入和输出的存储过程   
2.create or replace procedure sp_pro8   
3.(spno in number, spName out varchar2,spSal out number,spJob out varchar2) is  
4.begin  
5.    select ename,sal,job into spName,spSal,spJob from emp where empno=spno;   
6.end;   
7./  

Java代码
1.import java.sql.*;   
2.public class Test2{   
3.    public static void main(String[] args){   
4.           
5.        try{   
6.            //1.加载驱动   
7.            Class.forName("oracle.jdbc.driver.OracleDriver");   
8.            //2.得到连接   
9.            Connection ct = DriverManager.getConnection("jdbc:oracle:[email protected]:1521:MYORA1","scott","m123");   
10.  
11.            //3.创建CallableStatement   
12.            /*CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");  
13.            //4.给?赋值  
14.            cs.setInt(1,10);  
15.            cs.setString(2,"笑傲江湖");  
16.            cs.setString(3,"人民出版社");*/  
17.  
18.            //看看如何调用有返回值的过程   
19.            //创建CallableStatement   
20.            CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?,?,?)}");   
21.  
22.            //给第一个?赋值   
23.            cs.setInt(1,7788);   
24.            //给第二个?赋值   
25.            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);   
26.            //给第三个?赋值   
27.            cs.registerOutParameter(3,oracle.jdbc.OracleTypes.DOUBLE);   
28.            //给第四个?赋值   
29.            cs.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR);   
30.  
31.            //5.执行   
32.            cs.execute();      
33.            //取出返回值,要注意?的顺序   
34.            String name=cs.getString(2);    
35.            String job=cs.getString(4);   
36.            System.out.println("7788的名字"+name+" 工作:"+job);           
37.        } catch(Exception e){   
38.            e.printStackTrace();   
39.        } finally{   
40.            //6.关闭各个打开的资源   
41.            cs.close();   
42.            ct.close();   
43.        }   
44.    }   
45.}  
运行,成功找出记录 
有返回值的存储过程(列表[结果集])
案例:编写一个过程,输入部门号,返回该部门所有雇员信息。
对该题分析如下:
  由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了。所以要分两部分:
返回结果集的过程
1.建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下:
Sql代码
1.create or replace package testpackage as  
2.  type test_cursor is ref cursor;   
3.end testpackage;  

2.建立存储过程。如下:
Sql代码
1.create or replace procedure sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is  
2.begin  
3.  open p_cursor for  
4.    select * from emp where deptno = spNo;   
5.end sp_pro9;  

3.如何在java程序中调用该过程
Java代码
1.import java.sql.*;   
2.public class Test2{   
3.    public static void main(String[] args){   
4.           
5.        try{   
6.            //1.加载驱动   
7.            Class.forName("oracle.jdbc.driver.OracleDriver");   
8.            //2.得到连接   
9.            Connection ct = DriverManager.getConnection("jdbc:oracle:[email protected]:1521:MYORA1","scott","m123");   
10.  
11.            //看看如何调用有返回值的过程   
12.            //3.创建CallableStatement   
13.            CallableStatement cs = ct.prepareCall("{call sp_pro9(?,?)}");   
14.  
15.            //4.给第?赋值   
16.            cs.setInt(1,10);   
17.            //给第二个?赋值   
18.            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);   
19.  
20.            //5.执行   
21.            cs.execute();      
22.            //得到结果集   
23.            ResultSet rs=(ResultSet)cs.getObject(2);        
24.            while(rs.next()){   
25.                System.out.println(rs.getInt(1)+" "+rs.getString(2));   
26.            }    
27.        } catch(Exception e){   
28.            e.printStackTrace();   
29.        } finally{   
30.            //6.关闭各个打开的资源   
31.            cs.close();   
32.            ct.close();   
33.        }   
34.    }   
35.}  
运行,成功得出部门号是10的所有用户 
编写分页过程
  有了上面的基础,相信大家可以完成分页存储过程了。
  要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页。返回总记录数,总页数,和返回的结果集。
如果大家忘了oracle中如何分页,请参考第三天的内容。
先自己完成,老师在后面给出答案,并讲解。 

--oracle的分页
Sql代码
1.select t1.*, rownum rn from (select * from emp) t1 where rownum<=10;   
2.--在分页时,大家可以把下面的sql语句当做一个模板使用   
3.select * from  
4.  (select t1.*, rownum rn from (select * from emp) t1 where rownum<=10)   
5.where rn>=6;  
时间: 2024-12-28 16:34:15

oracle15 pl/sql 分页的相关文章

二十六、oracle pl/sql 分页

一.无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解.首先是掌握最简单的存储过程,无返回值的存储过程. 案例:现有一张表book,表结构如下:书号.书名.出版社. CREATE TABLE book( ID NUMBER(4), book_name VARCHAR2(30), publishing VARCHAR2(30)); 请写一个过程,可以向book表添加书,要求通过java程序调用该过程. --注意:in->表示这是一

oracle pl/sql 分页

一.无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解.首先是掌握最简单的存储过程,无返回值的存储过程. 案例:现有一张表book,表结构如下:书号.书名.出版社. CREATE TABLE book( ID NUMBER(4), book_name VARCHAR2(30), publishing VARCHAR2(30)); 请写一个过程,可以向book表添加书,要求通过java程序调用该过程. --注意:in->表示这是一

[oracle]pl/sql --分页过程demo

这句sql能够用来查询一张表中的特定位置的记录 --查询的方法获取分页的语句 select *from (select t1.*,rownum rn from (select *from books) t1 where rownum<=4) where rn >2; --使用分页写存储过程 --1 首先要创建一个包,定义游标类型 create or replace package fenyepackage as type fenye_cursor is ref cursor; end feny

pl/sql程序语言

pl/sql程序基础知识: pl/sql(procedural language/sql)oracle在标准sql上面的扩展,不仅简单的sql语句,还具有一般语言的特性:变量,常量,流程控制和循环,错误处理机制.是一个功能完善强大的过程化语言. 它的编程基本单位是块,复杂的功能都是多个块组成 我们来看看它的实列代码: 块结构: declear --定义部分,可选 /*定义部分--变量,常量,游标,异常,复杂数据类型*/ begin --执行部分 /*pl/sql语句和SQL语句;*/ excep

Oracle实践--PL/SQL综合之分页存储过程

当我们查看JDK API的时候,总会发现一些类说明写着,线程安全或者线程不安全,比如说StringBuilder中,有这么一句,"将StringBuilder 的实例用于多个线程是不安全的.如果需要这样的同步,则建议使用StringBuffer. ",那么下面手动创建一个线程不安全的类,然后在多线程中使用这个类,看看有什么效果. Count.java: [java] view plaincopy public class Count { private int num; public 

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

编写分页过程 通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标,如何在java中调用等内容的学习. 1.无返回值的存储过程 例如 1.可以向book表添加书, ---建表 Create table book(bookId number,bookName varchar2(50),publishHouse varchar2(50)); --编写过程 in 表示变量为输入值,如果不写默认为输入值,而不是输出变量,out为输出值

Oracle学习笔记十 使用PL/SQL

PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制结构,可用于创建存储过程.触发器和程序包,给SQL语句的执行添加程序逻辑,与 Oracle 服务器和 Oracle 工具紧密集成,具备可移植性.灵活性和安全性. PL/SQL 的优点 支持 SQL,在 PL/SQL 中可以使用: 1.数据操纵命令 2.事务控制命令 3.游标控制 4.

Oracle基础(四)pl/sql

PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL).PL/SQL是Oracle数据库对SQL语句的扩展.在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL就是把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断.循环等操作实现复杂的功能或者计算的程序语言. 总结下来就是是sql语言的扩展,sql语句+ 变量和常量+条件语句+循环语句+例外处理各种错误! PL/SQL的作用 使用PL/SQL可以编写具有很多高级功能的程

Oracle PL/SQL随堂笔记总结

1.pl/sql编程 1.理解oracle的pl/sql的概念    2.掌握pl/sql编程技术(过程.函数.触发器)    pl/sql是标准sql语句的扩展    简介        1.过程.函数.触发器都是由pl/sql编写        2.过程.函数.触发器是在oracle中        3.pl/sql是非常强大的过程语言        4.过程.函数等可以在java程序被调用    学习必要性:        1.提高应用程序的性能        2.模块化的设计思想