JDBC : 数据库的分页语句 && 调用函数和存储过程

一、数据库的分页语句

在编写Web应用程序等系统时,会涉及到与数据库的交互,如果数据库中数据量很大的话,一次检索所有的记录,会占用系统很大的资源,因此常常采用分页语句:需要多少数据就只从数据库中取多少条记录。以下是Sql Server,Oracle和MySQL的分页语句(从数据库表中的第M条数据开始取N条记录):

SQL Server 

从数据库表中的第M条记录开始取N条记录,利用Top关键字(如果Select语句中既有top,又有order by,则是从排序好的结果集中选择):   

SELECT *  
FROM ( SELECT Top N *  FROM (SELECT Top (M + N - 1) * FROM 表名称 Order by 主键 desc) t1 ) t2  
Order by 主键 asc

例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:
    

SELECT *  FROM ( SELECT TOP 20 *  
FROM (SELECT TOP 29 * FROM Sys_option order by sys_id desc) t1) t2  
Order by sys_id asc

Oralce数据库

从数据库表中第M条记录 开始检索N条记录

例如从表employees(主键为employee_id)中从11条记录还是检索20条记录,语句如下:

MySQL数据库

My sql数据库最简单,是利用mySQL的LIMIT函数,LIMIT [offset,] rows从数据库表中M条记录开始检索N条记录的语句为:   

SELECT [列名列表] FROM 表名称 LIMIT M,N  

例如从表Sys_option(主键为sys_id)中从10条记录还是检索20条记录,语句如下:   

select * from sys_option limit 10,20 

二、调用存储函数 和 存储过程

创建函数

获取指定部门的工资和员工人数

create or replace function get_dept_salary(v_dept number , v_num out number)
return number
is
       v_sal number(20,2) := 0;
       cursor salary_cursor is select salary from employees where department_id = v_dept;
begin
       v_num := 0;
       for c in salary_cursor loop
           v_sal := v_sal + c.salary;
           v_num := v_num + 1;
       end loop;
       return v_sal;
end;

创建存储过程

获取指定部门的工资

create or replace procedure get_salary(v_dept number , v_num out number)
is
     cursor salary_cursor is select salary from employees where department_id = v_dept;
begin
       v_num := 0;
       for c in salary_cursor loop
           v_num := v_num + c.salary;
       end loop;
      dbms_output.put_line(v_num);
end;

调用函数:

/**
	 *  使用JDBC 调用函数
	 */
	@Test
	public void test1() {

		Connection conn = null;
		CallableStatement callableStatement = null;
		try {
			conn = JDBC_Tools.getConnection();
			//1.用Connection 对象的 prepareCall() 方法获取CallableStatement 实例
			//prepareCall() 方法需要传入 SQL 字符串,严格书写格式
			String sql = "{?= call get_dept_salary(?,?)}";
			callableStatement = conn.prepareCall(sql);

			//2.通过CallableStatement 的 registerOutParameter() 方法设置OUT 参数
			callableStatement.registerOutParameter(1, Types.NUMERIC);
			callableStatement.registerOutParameter(3, Types.NUMERIC);

			//3.通过 CallableStatement 的 setXxx() 方法设置IN 或 IN OUT 参数的值,若为空,setNull()方法
			callableStatement.setInt(2, 80);

			//4.调用 execute() 方法执行
			callableStatement.execute();

			//5.如果调用的是带返回值
			double salary = callableStatement.getDouble(1);
			long nums = callableStatement.getLong(3);
			System.out.println("salary : "+salary+" nums : "+nums);

		} catch (SQLException e) {

			e.printStackTrace();
		}finally{
			JDBC_Tools.relaseSource(conn, callableStatement);
		}
	}

调用存储过程

/**
	 * 使用JDBC 调用存储过程
	 */
	@Test
	public void test2() {

		Connection conn = null;
		CallableStatement callableStatement = null;
		try {
			conn = JDBC_Tools.getConnection();

			String sql = "{call get_salary(?,?)}";
			callableStatement = conn.prepareCall(sql);
			callableStatement.registerOutParameter(2, Types.NUMERIC);
			callableStatement.setInt(1, 80);

			callableStatement.execute();
			double salary = callableStatement.getDouble(2);

			System.out.println("salary : "+salary);

		} catch (SQLException e) {

			e.printStackTrace();
		}finally{
			JDBC_Tools.relaseSource(conn, callableStatement);
		}
	}
时间: 2024-07-28 17:20:29

JDBC : 数据库的分页语句 && 调用函数和存储过程的相关文章

数据库的分页语句

一.mysql 数据库的分页语句 select *from 表名 where 主键名 limit 当前页数-1,每页显示条数; 例如select *from user_register where id limit 15,5; 二. SQL Server 2000/2005数据库的分页语句 SELECT TOP 每页大小 *FROM 表名WHERE id NOT IN ( SELECT TOP 每页大小*(当前页数-1) FROM 表名 ) 三.oracle 数据库分页 --分页查询一selec

Java学习总结(十八)——MySQL数据库(4)MySQL数据库中的视图,函数,存储过程中常见循环

一.MySQL存储过程中常见的循环1.while循环:WHILE.....DO.....END WHILE例1:创建存储过程(求1+2+.......+num的和):创建成功,进行调用:显示结果:2.REPEAT循环: REPEAT.........UNTLL END REPEAT例2:创建存储过程:创建完成,调用存储过程:显示结果:3.LOOP循环:LOOP END LOOP 例3:创建存储过程:创建成功,调用存储过程:显示结果:二.MySQL中的视图1.概念:有结构(有行有列),但没有结果(

代码收藏系列--mysql创建数据库、数据表、函数、存储过程命令

创建mysql数据库 CREATE DATABASE IF NOT EXISTS `database_name` DEFAULT CHARSET utf8 COLLATE utf8_general_ci; 创建mysql数据表 drop table if exists `table_name`; create table if not exists `table_name` ( id int auto_increment primary key comment '主键编号', `name` va

Oracle数据库入门——sql语句和函数详解

一.oracle常用数据类型 一.  数据定义语言(ddl) 数据定义语言ddl(data definition language)用于改变数据库结构,包括创建.更改和删除数据库对象. 用于操纵表结构的数据定义语言命令有: create table alter table truncate table drop table eg. --创建tb_stu表数据结构 create table tb_stu( id number, name varchar2(20) );   --修改tb_stu表数

mysql数据库编程,内置函数,存储过程(循环插入)

mysql编程注释:行:# 或者 -- 定义变量set 变量名 =变量名注意:为了区分系统变量和字段 在加一个@标识符例如   set @who ='韩当'; 使用select 可以获得当前变量的值 select 10,15,20 into @a,@b,@c; 注意:=应该是赋值,但是在select语句内,就成了关系等于,使用专门的赋值运算符:=同样使用与set 1.作用域, 用户定义的函数,是全局的(函数内可以),村子局部作用域变量,函数内定义的变量2.有效期,回话结束(连接结束) 内置函数

JDBC学习笔记(10)——调用函数&存储过程

如何使用JDBC调用存储在数据库中的函数或存储过程: * 1.通过COnnection对象的prepareCall()方法创建一个CallableStatement *    对象的实例,在使用Connection对象的prepareCall() 方法时,需要传入一个String类型的字符串, *    该字符串用于指明如何调用存储过程 * 2.通过CallableStatement对象的registerOutParameter() 方法注册Out参数 * 3.通过CallableStateme

如何使用 JDBC 调用存储在数据库中的函数或存储过程

JDBC调用存储过程步骤:1 通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例.在使用Connection对象的prepareCall()方法时,需要传入一个String类型的字符串,该字符串用于指明如何调用存储过程{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} {call <procedure-name>[(<arg1>,<a

Mybatis分页-利用Mybatis Generator插件生成基于数据库方言的分页语句,统计记录总数 (转)

众所周知,Mybatis本身没有提供基于数据库方言的分页功能,而是基于JDBC的游标分页,很容易出现性能问题.网上有很多分页的解决方案,不外乎是基于Mybatis本机的插件机制,通过拦截Sql做分页.但是在像Oracle这样的数据库上,拦截器生成的Sql语句没有变量绑定,而且每次语句的都要去拦截,感觉有点浪费性能. Mybatis Generator是Mybatis的代码生成工具,可以生成大部分的查询语句. 本文提供的分页解决方案是新增Mybatis Generator插件,在用Mybatis

厚溥教育1718部数据库连接作业答案,分装一个操作数据库而无需写SQL语句的函数

<?php header("Content-type:text/html;charset=utf8"); //PHP操作数据库的函数 function phpsql($dbconfig,$type,$field='',$data=array(),$condition=array(),$join=array()){ //判断存不存在数据库连接主机 if(!isset($dbconfig['host'])){ return "数据库连接主机不存在"; } //判断