一、什么是存储过程
Stored Procedure 是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它 。
通俗点理解,就是数据库的一些自定义的函数,并且支持含参调用。通常用于:数据查询,数据初始化
二、优势
复用性高:比如涉及复杂的业务逻辑的数据需要修改,可以用写好的存储过程反复操作。
灵活性高:如果涉及业务逻辑修改,只需要修改存储过程,而无需修改程序(程序可以远程调用存储过程)
执行速度快:相比较远程程序调用,本地数据库服务查询等操作,效率高,速度快,不受带宽,网络条件的干扰
安全性高:运行的场景为数据库服务器,特定的操作由特定权限的人操作,物理安全,权限安全
Oracle中存储过程已经出现很久了,而且配合SQL Plus使用起来很友好。开源和轻量级的mysql直到5.0版本才支持,而且客户端支持也不友好,好在8.0之后配合Navicat已经有很好的体验了。
三、语法
CREATE
PROCEDURE过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]])
[特性 ...]
过程体
create procedure testa()
begin
select * from users;
select * from orders;
end;
上边展示了一个简单的存储过程。下边来看一个稍微复杂的
CREATE DEFINER=`root`@`localhost` PROCEDURE `TestProcedure`(IN C_in int,OUT C_out VARCHAR(12))
BEGIN
IF (C_in%2=0)
THEN
SET C_out='合数';
ELSE
SET C_out='素数';
END IF;
SELECT C_in AS'输入结果';
END
当然整个过程是借助Navicat编写的,有提示很友好
编写完成之后,点击运行,会要求输入参数,就可以看到输出和结果啦
其中结果1是select出来的,结果2是输出参数
四、内部调用和外部调用
1.数据库调用
declare para
call testa(para );
2.外部调用(java远程调用)使用JDBC
Connection conn = getConnection(); //创建数据库连接
CallableStatement cs = conn.prepareCall("{call findAllBook()}");
ResultSet rs = cs.executeQuery(); //执行查询操作,并获取结果集
package com.scd.book;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
public class FindBook {
/**
* 获取数据库连接
* @return Connection对象
*/
public Connection getConnection()
{
Connection conn = null; //数据库连接
try
{
Class.forName("com.mysql.jdbc.Driver"); //加载数据库驱动,注册到驱动管理器
/*数据库链接地址*/
String url = "jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=UTF-8";
String username = "root";
String password = "123456";
/*创建Connection链接*/
conn = DriverManager.getConnection(url, username, password);
}
catch (ClassNotFoundException e){
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn; //返回数据库连接
}
/**
* 通过存储过程查询数据
* @return List
*/
public List findAll()
{
List list = new ArrayList(); //实例化List对象
Connection conn = getConnection(); //创建数据库连接
try
{
//调用存储过程
CallableStatement cs = conn.prepareCall("{call findAllBook()}");
ResultSet rs = cs.executeQuery(); //执行查询操作,并获取结果集
while(rs.next())
{
Book book = new Book(); //实例化Book对象
book.setName(rs.getString("name")); //对name属性赋值
book.setPrice(rs.getDouble("price")); //对price属性赋值
book.setBookCount(rs.getInt("bookCount")); //对bookCount属性赋值
book.setAuthor(rs.getString("author")); //对author属性赋值
list.add(book);
}
}catch(Exception e)
{
e.printStackTrace();
}
return list; //返回list
}
/**
* 主函数 调用存储过程(测试使用)
* @param args
*/
public static void main(String[] args)
{
FindBook fb = new FindBook();
//System.out.println(fb.findAll());
for (Book book : fb.findAll())
{
System.out.print(book.getName() + "--" + book.getPrice() + "--");
System.out.print(book.getBookCount() + "--" + book.getAuthor());
System.out.println();
}
}
}