存储过程
正常使用SQL语句是比较简洁点,也比较容易上手,但是SQL语句是一种非程序型语言,其使用的过程基本上是一个命令实现一个处理,这样子在一些特定的产所要实现一些特定的功能就显得比较繁琐。。。这个时候就可以用到存储过程了。。。
存储过程相比单纯的使用SQL语言就显得比较复杂。。存储过程更像一种程序型语言,存储过程是在数据库中保存了一系列SQL命令的集合,可以简单的认为是SQL语言的组合。。。通过SQL语句的组合,就可以通过简单的代码调用实现复杂数据库操作。。。
存储过程事先就完成了解析,编译处理过程后保存在数据库中,所以在使用存储过程的时候对于数据库的负担相对就小一点,而且使用存储过程后客户端就只需要使用少量的代码来使用复杂的功能,这样子客户端的数据传输量就相对比较少,对于网络上也没有太大的压力。。。
存储过程
1)用当地数据库语言,写的一段业务逻辑算法,并该算法存储在客户端 2)使用存储过程需要用于CallableStatement接口,同时需要使如下SQL命令调用:{call add_pro(?,?,?)} 3)对于存储过程的输出参数,需要注册: cstmt.registerOutParameter(3,Types.INTEGER);4)取得返回值时,需要按照输出参数的位置来取
下面是一个存储过程实例的代码。。。
mysql> delimiter // 改变分隔符号 MySql监视器默认的分隔符是; 这样就和代码中的;相混淆了
mysql> create procedure sp_search(IN p_nam varchar(20)) 指定参数类型和数据类型
-> begin
-> if p_nam is null or p_nam = '' then 指is null = 的使用
-> select * from img; 简单的判断分支语句
-> else
-> select * from img where path like p_nam;
-> end if;
-> end
-> //
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ; 最后记得把分隔符号改回来
可以通过show procedure status\G来查找存储过程的状态 查找的是所有的存储过程,但是并不详细
可以通过show create procedure 名称\G来查找指定的存储过程的状态 查看的是单个存储过程的状态,很详细
可以通过drop procedure 名称来删除存储过程
可以通过call 名称(参数)来调用存储过程
存储过程可以使用IN输入变量,同样的,也可以使用OUT输出标量,或者INOUT输入输出变量,输出变量的使用方法和输入标量差不多,在程序中可以通过 select * into 变量名 from 表名 这个方式来把要输出的值存放到输出变量中,但是必须保证存放进去的数据只有一条记录或者一个值。。。
在call存储过程的时候,输出变量的定义要加上@
mysql> create procedure sp_search2(IN p_nam varchar(20),OUT p_cnt int)
-> begin 有输入参数也有输出参数 普通变量一样设置
-> if p_nam is null or p_nam = ''then
-> select * from img;
-> else
-> select * from img where path like p_nam;
-> end if;
-> select found_rows() into p_cnt; 设置检索结果到变量中
-> end
-> //
Query OK, 0 rows affected (0.03 sec)
mysql> delimiter ;
mysql> call sp_search2('',@count); 要传递一个参数去接受输出参数 和普通变量不一样
mysql> select @count; 对输出变量进行操作
当存储过程中需要反复操作同一段字符串的时候,可以通过declare来声明局部变量来临时存放。。
mysql> delimiter //
mysql> create procedure sp_search3(IN p_depart int)
-> begin
-> declare tmp char(4); 声明局部变量
-> case p_depart case的使用
-> when 1 then
-> set tmp = '1'; set是给变量名赋值
-> when 2 then
-> set tmp = '2';
-> when 3 then
-> set tmp = '3';
-> else set tmp = '4'; 都不符号的时候就调用这个
-> end case; 结束case语句
-> select * from img where depart = tmp; 抽取出来的字符串
-> end
-> //
JDBC调用MySQL存储过程
package cn.itcast.web.jdbc.dao;import java.sql.CallableStatement;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Types;import cn.itcast.web.jdbc.util.JdbcUtil;//演示JDBC操作MySQL存储过程public class Demo1 { public static void main(String[] args) { Connection conn = null; //调用存储过程专用的接口 CallableStatement cstmt = null; ResultSet rs = null; //调用存储过程特定的语法 String sql = "{call add_pro(?,?,?)}"; try { conn = JdbcUtil.getMySqlConnection(); cstmt = conn.prepareCall(sql); //绑三个参数(前二个是输入,后一个是输出) cstmt.setInt(1,100); cstmt.setInt(2,200); //对于存储过程的输出参数,需要注册: //注册一个输出参数, //其中Types.INTEGER表示SQL与JDBC之前的是映射类型 cstmt.registerOutParameter(3,Types.INTEGER); //调用存储过程 boolean flag = cstmt.execute(); System.out.println("flag="+flag); //取得执行结果 //取得返回值时,需要按照输出参数的位置来取 int sum = cstmt.getInt(3); System.out.println("sum="+sum); } catch (Exception e) { e.printStackTrace(); }finally{ JdbcUtil.close(rs); JdbcUtil.close(cstmt); JdbcUtil.close(conn); } }}