oracle15 pl/sql 分页
PL/SQL分页
编写分页过程 无返回值的存储过程
古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解。首先是掌握最简单的存储过程,无返回值的存储过程:
案例:现有一张表book,表结构如下:书号 书名 出版社 请写一个过程,可以向book表添加书,要求通过java程序调用该过程。
--in:表示这是一个输入参数,默认为in(不写in则默认就是in)
--out:表示一个输出参数
Sql代码
.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中调用
Java代码
.//调用一个无返回值的过程
.import java.sql.*;
.public class Test2{
. public static void main(String[] args){ . try{
. //1.加载驱动
. Class.forName("oracle.jdbc.driver.OracleDriver");
. //2.得到连接
. Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
.
. //3.创建CallableStatement
. CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
. //4.给?赋值
. cs.setInt(,);
. cs.setString(,"笑傲江湖");
. cs.setString(,"人民出版社");
. //5.执行
. cs.execute();
. } catch(Exception e){
. e.printStackTrace();
. } finally{
. //6.关闭各个打开的资源
. cs.close();
. ct.close();
. }
. }
.}
执行,记录被加进去了
有返回值的存储过程(非列表)
再看如何处理有返回值的存储过程:
案例:编写一个过程,可以输入雇员的编号,返回该雇员的姓名。
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。
Sql代码
.--有输入和输出的存储过程
.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代码
.import java.sql.*;
.public class Test2{
. public static void main(String[] args){
.
. try{
. //1.加载驱动
. Class.forName("oracle.jdbc.driver.OracleDriver");
. //2.得到连接
. Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
. //看看如何调用有返回值的过程
. //创建CallableStatement
. CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?)}");
.
. //给第一个?赋值
. cs.setInt(,);
. //给第二个?赋值
. cs.registerOutParameter(,oracle.jdbc.OracleTypes.VARCHAR);
.
. //5.执行
. cs.execute();
. //取出返回值,要注意?的顺序
. String name=cs.getString();
. System.out.println("7788的名字"+name);
. } catch(Exception e){
. e.printStackTrace();
. } finally{
. //6.关闭各个打开的资源
. cs.close();
. ct.close();
. }
. }
.}
运行,成功得出结果。。
案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。
Sql代码
.--有输入和输出的存储过程
.create or replace procedure sp_pro8
.(spno in number, spName out varchar2,spSal out number,spJob out varchar2) is
.begin
. select ename,sal,job into spName,spSal,spJob from emp where empno=spno;
.end;
./ Java代码
.import java.sql.*;
.public class Test2{
. public static void main(String[] args){
.
. try{
. //1.加载驱动
. Class.forName("oracle.jdbc.driver.OracleDriver");
. //2.得到连接
. Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
.
. //3.创建CallableStatement
. /*CallableStatement cs = ct.prepareCall("{call sp_pro7(?,?,?)}");
13. //4.给?赋值
14. cs.setInt(1,10);
15. cs.setString(2,"笑傲江湖");
16. cs.setString(3,"人民出版社");*/
.
. //看看如何调用有返回值的过程
. //创建CallableStatement
. CallableStatement cs = ct.prepareCall("{call sp_pro8(?,?,?,?)}");
.
. //给第一个?赋值
. cs.setInt(,);
. //给第二个?赋值
. cs.registerOutParameter(,oracle.jdbc.OracleTypes.VARCHAR);
. //给第三个?赋值
. cs.registerOutParameter(,oracle.jdbc.OracleTypes.DOUBLE);
. //给第四个?赋值
. cs.registerOutParameter(,oracle.jdbc.OracleTypes.VARCHAR);
.
. //5.执行
. cs.execute();
. //取出返回值,要注意?的顺序
. String name=cs.getString();
. String job=cs.getString();
. System.out.println("7788的名字"+name+" 工作:"+job);
. } catch(Exception e){
. e.printStackTrace();
. } finally{
. //6.关闭各个打开的资源
. cs.close();
. ct.close();
. }
. }
.}
运行,成功找出记录
有返回值的存储过程(列表[结果集])
案例:编写一个过程,输入部门号,返回该部门所有雇员信息。
对该题分析如下:
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了。所以要分两部分:
返回结果集的过程
.建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下:
Sql代码
.create or replace package testpackage as
. type test_cursor is ref cursor;
.end testpackage; .建立存储过程。如下:
Sql代码
.create or replace procedure sp_pro9(spNo in number,p_cursor out testpackage.test_cursor) is
.begin
. open p_cursor for
. select * from emp where deptno = spNo;
.end sp_pro9; .如何在java程序中调用该过程
Java代码
.import java.sql.*;
.public class Test2{
. public static void main(String[] args){
.
. try{
. //1.加载驱动
. Class.forName("oracle.jdbc.driver.OracleDriver");
. //2.得到连接
. Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
.
. //看看如何调用有返回值的过程
. //3.创建CallableStatement
. 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代码
.select t1.*, rownum rn from (select * from emp) t1 where rownum<=;
.--在分页时,大家可以把下面的sql语句当做一个模板使用
.select * from
. (select t1.*, rownum rn from (select * from emp) t1 where rownum<=)
.where rn>=;
--开发一个包
--建立一个包,在该包中,我定义类型test_cursor,是个游标。 如下:
Sql代码
.create or replace package testpackage as
. TYPE test_cursor is ref cursor;
.end testpackage;
.--开始编写分页的过程
.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();
.--定义两个整数
.v_begin number:=(pageNow-)*Pagesize+;
.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 inmediate v_sql into myrows;
. --计算myPageCount
. --if myrows%Pagesize= then这样写是错的
. if mod(myrows,Pagesize)= then
. myPageCount:=myrows/Pagesize;
. else
. myPageCount:=myrows/Pagesize+
. end if;
.--关闭游标
.close p_cursor;
.end;
./
--使用java测试
//测试分页
Java代码
.import java.sql.*;
.public class FenYe{
. public static void main(String[] args){
.
. try{
. //1.加载驱动
. Class.forName("oracle.jdbc.driver.OracleDriver");
. //2.得到连接
. Connection ct = DriverManager.getConnection("jdbc:oracle:thin@127.0.0.1:1521:MYORA1","scott","m123");
.
. //3.创建CallableStatement
. CallableStatement cs = ct.prepareCall("{call fenye(?,?,?,?,?,?)}");
.
. //4.给第?赋值
. cs.seString(,"emp");
. cs.setInt(,);
. cs.setInt(,);
.
. //注册总记录数
. cs.registerOutParameter(,oracle.jdbc.OracleTypes.INTEGER);
. //注册总页数
. cs.registerOutParameter(,oracle.jdbc.OracleTypes.INTEGER);
. //注册返回的结果集
. cs.registerOutParameter(,oracle.jdbc.OracleTypes.CURSOR);
.
. //5.执行
. cs.execute();
.
. //取出总记录数 /这里要注意,getInt(4)中4,是由该参数的位置决定的
. int rowNum=cs.getInt();
.
. int pageCount = cs.getInt();
. ResultSet rs=(ResultSet)cs.getObject();
.
. //显示一下,看看对不对
. System.out.println("rowNum="+rowNum);
. System.out.println("总页数="+pageCount);
.
. while(rs.next()){
. System.out.println("编号:"+rs.getInt()+" 名字:"+rs.getString()+" 工资:"+rs.getFloat());
. }
. } catch(Exception e){
. e.printStackTrace();
. } finally{
. //6.关闭各个打开的资源
. cs.close();
. ct.close();
. }
. }
.} 运行,控制台输出:
rowNum=
总页数:
编号: 名字:SMITH 工资:2850.0
编号: 名字:ALLEN 工资:2450.0
编号: 名字:WARD 工资:1562.0
编号: 名字:JONES 工资:7200.0
编号: 名字:MARTIN 工资:1500.0
--新的需要,要求按照薪水从低到高排序,然后取出6-
过程的执行部分做下改动,如下:
Sql代码
.begin
.--执行部分
.v_sql:='select * from (select t1.*, rownum rn from (select * from '||tableName||' order by sal) t1 where rownum<='||v_end||') where rn>='||v_begin; 重新执行一次procedure,java不用改变,运行,控制台输出:
rowNum=
总页数:
编号: 名字:JAMES 工资:950.0
编号: 名字:ADAMS 工资:1100.0
编号: 名字:WARD 工资:1250.0
编号: 名字:MARTIN 工资:1250.0
编号: 名字:MILLER 工资:1300.0
oracle15 pl/sql 分页的更多相关文章
- 二十六、oracle pl/sql 分页
一.无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解.首先是掌握最简单的存储过程,无返回值的存储过程. 案例:现有一张表book, ...
- oracle pl/sql 分页
一.无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解.首先是掌握最简单的存储过程,无返回值的存储过程. 案例:现有一张表book, ...
- [oracle]pl/sql --分页过程demo
这句sql能够用来查询一张表中的特定位置的记录 --查询的方法获取分页的语句 select *from (select t1.*,rownum rn from (select *from books) ...
- PL/SQL分页查询
create or replace procedure fenye(tabelname in varchar2,currentpage in number,pageSize in number,inW ...
- Oracle实践--PL/SQL综合之分页存储过程
Oracle PL/SQL分页的存储过程 Oracle,分页,存储过程三个词结合起来,来个综合点的小练习,运用之前的PL/SQL创建一个分页的存储过程,仅仅须要简单几步就可以. 1.声明一个引用游标 ...
- Oracle基础(五)pl/sql进阶(分页过程)
编写分页过程 通过pl/sql实现分页过程,再该过程中由简单到难一步步深入,目的在于通过该案例熟悉pl/sql的各种存储过程,包,游标.怎样在java中调用等内容的学习. 1.无返回值 ...
- Oracle和MySql的分页查询区别和PL/SQL的基本概念
Oracle和MySql的分页查询区别: Oracle的分析查询,之前Oracle的分页是使用伪列 ROWNUM 结合子查询实现,mysql的分页更简单,直接使用 LIMIT 关键字就可以实现 ...
- Oracle PL/SQL随堂笔记总结
1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...
- Oracle学习笔记十 使用PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...
随机推荐
- 第 5 章 工厂方法模式【Factory Method Pattern】
以下内容出自:<<24种设计模式介绍与6大设计原则>> 女娲补天的故事大家都听说过吧,今天不说这个,说女娲创造人的故事,可不是“造人”的工作,这个词被现代人滥用了.这个故事是说 ...
- Kaggle Competition Past Solutions
Kaggle Competition Past Solutions We learn more from code, and from great code. Not necessarily alwa ...
- QLGame 2d Engine Android端环境搭建(通过jni读取assets目录的文件)
QLGame 2d Engine win端已经实现了一个动物的动画了,初步的东西已经完成,考虑在Android端也实现这些基本的东西,这样跨平台的引擎也就实现了! 要在Android下编程,首先要实现 ...
- NGINX+UWSGI部署生产的DJANGO代码
并且NGINX不用ROOT帐户哟. 1,编译安装NGINX及UWSGI及DJANGO,不表述 2,将NGINX文件夹更改为普通用户拥有.但执行文件NGINX仍为ROOT,运行如下命令加入特殊权限标志位 ...
- 在TMemo上画一条线
var C:TControlCanvas; begin C := TControlCanvas.Create; C.Pen.Color := clRed; C.Pen.Width := ; C.Con ...
- Yii modules中layout文件的调用
在YII中,如果我们使用了modules区分了前后台,那么在不同的modules中需要使用各自的layout文件,在使用中发现经常会调用不到modules中的layout,下面介绍一下如何才能正确的调 ...
- 动态规划(计数DP):JLOI 2016 成绩比较
Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M- 1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个 ...
- android学习—— LayoutInflater的使用
在实际开发种LayoutInflater这个类还是非常有用的,它的作用类似于findViewById(),不同点是LayoutInflater是 用来找layout下xml布局文件,并且实例化!而fi ...
- 学习手工创建表,表关系以及用exists 来查询
---创建表a If exists(select * from sysobject where [name]=='a' and xType = 'u') Begin Drop table aa End ...
- 排序算法_MergeSort
算法思想: 分治自顶而下实现归并排序: 分治法的三个步骤 设归并排序的当前区间是R[low..high],分治法的三个步骤是:①分解:将当前区间一分为二,即求分裂点 ...