oracle pl/sql 分页

一、无返回值的存储过程

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

CREATE TABLE book(   ID NUMBER(4),   book_name VARCHAR2(30),   publishing VARCHAR2(30));

请写一个过程,可以向book表添加书,要求通过java程序调用该过程。

--注意:in->表示这是一个输入参数,默认为in --out->表示一个输出参数CREATE OR REPLACE PROCEDURE ADD_BOOK(ID         IN NUMBER,                                     NAME       IN VARCHAR2,                                     PUBLISHING IN VARCHAR2) ISBEGIN  INSERT INTO BOOK VALUES (ID, NAME, PUBLISHING);  COMMIT;END;/

java程序调用该存储过程的代码

package junit.test;

import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;

/** * 调用一个无返回值的存储过程 *  * @author jiqinlin * */public class ProcedureTest {

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:orcl", "scott", "oracle");            // 3.创建CallableStatement            CallableStatement cs = ct.prepareCall("call ADD_BOOK(?,?,?)");            //给?赋值            cs.setInt(1, 1);            cs.setString(2, "java");            cs.setString(3, "java出版社");            // 4.执行            cs.execute();            //5、关闭            cs.close();            ct.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

二、有返回值的存储过程(非列表)
案例:编写一个存储过程,可以输入雇员的编号,返回该雇员的姓名。

--输入和输出的存储过程CREATE OR REPLACE PROCEDURE SP_PROC(SPNO IN NUMBER, SPNAME OUT VARCHAR2) ISBEGIN  SELECT ENAME INTO SPNAME FROM EMP WHERE EMPNO = SPNO;END;/

java程序调用该存储过程的代码

package junit.test;

import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;

/** * 调用一个无返回值的存储过程 *  * @author jiqinlin * */public class ProcedureTest {

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:orcl", "scott", "oracle");            // 3.创建CallableStatement            CallableStatement cs = ct.prepareCall("{call sp_proc(?,?)}");            //给第一个?赋值            cs.setInt(1,7788);            //给第二个?赋值            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);            //4、执行            cs.execute();            //取出返回值,要注意?的顺序            String name=cs.getString(2);            System.out.println("编号7788的名字:"+name);            //5、关闭            cs.close();            ct.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

案例扩张:编写一个过程,可以输入雇员的编号,返回该雇员的姓名、工资和岗位。

--输入和输出的存储过程CREATE OR REPLACE PROCEDURE SP_PROC(SPNO   IN NUMBER,                                    SPNAME OUT VARCHAR2,                                    SPSAL  OUT NUMBER,                                    SPJOB  OUT VARCHAR2) ISBEGIN  SELECT ENAME, SAL, JOB INTO SPNAME, SPSAL, SPJOB FROM EMP WHERE EMPNO = SPNO;END;/

java程序调用该存储过程的代码

package junit.test;

import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;

/** * 调用一个无返回值的存储过程 *  * @author jiqinlin * */public class ProcedureTest {

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:orcl", "scott", "oracle");            // 3.创建CallableStatement            CallableStatement cs = ct.prepareCall("{call sp_proc(?,?,?,?)}");            //给第一个?赋值            cs.setInt(1,7788);            //给第二个?赋值            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR);            //给第三个?赋值            cs.registerOutParameter(3,oracle.jdbc.OracleTypes.DOUBLE);            //给第四个?赋值            cs.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR);            //4、执行            cs.execute();            //取出返回值,要注意?的顺序            String name=cs.getString(2);            double sal=cs.getDouble(3);            String job=cs.getString(4);            System.out.println("编号7788的名字:"+name+",职位:"+job+",薪水:"+sal+"");            //5、关闭            cs.close();            ct.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

三、有返回值的存储过程(列表[结果集])
案例:编写一个存储过程,输入部门号,返回该部门所有雇员信息。
该题分析如下:由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了。所以要分两部分:
1)、建立一个包,在该包中我们定义类型test_cursor,它是个游标。

CREATE OR REPLACE PACKAGE TESTPACKAGE AS  TYPE TEST_CURSOR IS REF CURSOR;END TESTPACKAGE;/

2)、建立存储过程。

CREATE OR REPLACE PROCEDURE SP_PROC(SPNO     IN NUMBER,                                    P_CURSOR OUT TESTPACKAGE.TEST_CURSOR) ISBEGIN  OPEN P_CURSOR FOR    SELECT * FROM EMP WHERE DEPTNO = SPNO;END SP_PROC;/

3)、如何在java 程序中调用该过程

package junit.test;

import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;

/** * 调用一个无返回值的存储过程 *  * @author jiqinlin * */public class ProcedureTest {

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:orcl", "scott", "oracle");            // 3.创建CallableStatement            CallableStatement cs = ct.prepareCall("{call sp_proc(?,?)}");            //给第一个?赋值            cs.setInt(1,10);            //给第二个?赋值            cs.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);            //4、执行            cs.execute();            //得到结果集            ResultSet rs = (ResultSet) cs.getObject(2);            while (rs.next()) {                System.out.println(rs.getInt(1) + " " + rs.getString(2));            }            //5、关闭            rs.close();            cs.close();            ct.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

四、编写分页过程
有了上面的基础,相信大家可以完成分页存储过程了。
要求,请大家编写一个存储过程,要求可以输入表名、每页显示记录数、当前页。返回总记录数,总页数,和返回的结果集。

--ROWNUM用法SELECT o.*, ROWNUM RN FROM (SELECT * FROM EMP) o WHERE ROWNUM <= 10;----oracle分页sql语句;在分页时,大家可以把下面的sql语句当做一个模板使用SELECT *FROM (SELECT o.*, ROWNUM RN FROM (SELECT * FROM EMP) o WHERE ROWNUM <= 10)WHERE RN >= 6;

1)、开发一个包
建立一个包,在该包中定义类型为test_cursor的游标。

--建立一个包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(1000);--定义两个整数V_BEGIN NUMBER := (PAGENOW - 1) * PAGESIZE + 1; 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 ImMEDIATE V_SQL INTO MYROWS; --它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,                                     --EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.                                     --尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 --计算myPageCount--if myrows%Pagesize=0 then 这样写是错的IF MOD(MYROWS, PAGESIZE) = 0 THEN   MYPAGECOUNT := MYROWS/PAGESIZE; ELSE   MYPAGECOUNT := MYROWS/PAGESIZE + 1;END IF;--关闭游标--CLOSE P_CURSOR; --不要关闭,否则java调用该存储过程会报错END;/

java调用分页代码

package junit.test;

import java.sql.CallableStatement;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;

/** * 调用一个无返回值的存储过程 *  * @author jiqinlin *  */public class ProcedureTest {

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:orcl", "scott", "oracle");            // 3.创建CallableStatement            CallableStatement cs = ct.prepareCall("{call fenye(?,?,?,?,?,?)}");            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); //返回的记录集            // 4、执行            cs.execute();            // 得到结果集            // 取出总记录数 /这里要注意,getInt(4)中4,是由该参数的位置决定的            int rowNum = cs.getInt(4);

int pageCount = cs.getInt(5);            ResultSet rs = (ResultSet) cs.getObject(6);            // 显示一下,看看对不对            System.out.println("rowNum=" + rowNum);            System.out.println("总页数=" + pageCount);

while (rs.next()) {                System.out.println("编号:" + rs.getInt(1) +                         " 名字:" + rs.getString(2) +                         " 工资:" + rs.getFloat(6));            }            // 5、关闭            //rs.close();            cs.close();            ct.close();        } catch (Exception e) {            e.printStackTrace();        }    }}

参见:http://www.cnblogs.com/linjiqin/archive/2012/02/28/2372096.html

时间: 2024-11-07 15:59:26

oracle 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 --分页过程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

oracle15 pl/sql 分页

PL/SQL分页 编写分页过程 无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解.首先是掌握最简单的存储过程,无返回值的存储过程: 案例:现有一张表book,表结构如下:书号 书名 出版社 请写一个过程,可以向book表添加书,要求通过java程序调用该过程. --in:表示这是一个输入参数,默认为in(不写in则默认就是in) --out:表示一个输出参数 Sql代码 1.create or replace procedur

ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE PL/SQL编程之八:把触发器说透 得到了大家的强力支持,感谢.接下来再下猛药,介绍下一篇,大家一定要支持与推荐呀~!我也才有动力写后面的.   本篇主要内容如下: 6.1 引言 6.2 创建函数 6.3 存储过程 6.3.1 创建过程 6.3.2 调用存储过程 6.3.3 AUTHID 6.3.4 

[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]

[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) 得到了大家的强力支持与建议,万分感谢.接下来介绍下一篇:oracle pl/sql异常处理部分,还望大家一定

【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人品牌. 本是成书的,但后来做其他事了,就无偿的贡献出来,被读者夸其目前为止最“实在.经典”的写ORACLE PL/SQL编程的文章-! 觉得对你有帮助,请留言与猛点推荐,谢谢. [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) 本篇主要内容如下:第一章 PL/S

[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到)

原文:[推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之四: 把游标说透(不怕做不到,只怕想不到) 继上两篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) 得到了大家的强力支持,感谢.接下来再下猛药,介绍下一篇,大家一定要支持与推荐呀~!我也才有动力写后面的. 本篇主要内容如下: 4.1 游标概念 4.1.1 处理显式游标 4.1.2 处理

[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)

原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ——通过知识共享树立个人品牌. 继上五篇: [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不