1、使用状况java
对于复杂业务、简单sql没法解决问题、操做大量表的时候使用存储过程。sql
2、优缺点
优势:一、减小访问数据库链接次数,这是数据库执行效率须要考虑的一个重点。
二、易维护,相对于复杂的程序代码,直接修改存储过程,更加快捷。
三、存储过程,只在建立时进行编译,以后就不用编译了。而普通sql,每次执行都须要编译(由于他们和代码放在一块儿)。
四、减轻编码工做,能够少些不少代码。
缺点: 一、开发调试不方便,相对于程序代码,存储过程打断点进行调试,只能开发者去查看存储过程。
二、若是须要使用中间数据,则不能使用存储过程。
三、编写比较困难,有许多固定格式须要注意。
四、移植性差,不一样数据库厂家,存储过程的语法不一样。数据库
3、建立语法session
BEGIN
过程体
END
//
DELIMITER;
说明:oop
一、存储过程名:pro_**
二、参数:参数有三种类型。
IN: 输入参数。调用该存储过程,必须附带该参数
OUT: 输出参数。调用该存储过程后,返回的结果。
INOUT: 输入输出参数。结合IN、OUT特性
格式:OUT p_out int。p_out为参数名称,int为参数类型。 参数类型编码
三、存储过程参数spa
至关于java的变量,用于存储过程当中的使用。hibernate
格式:declare param_name type(参数类型)3d
例子:declare total decimal(8) default 6;调试
四、过程体
4.1 能够写多个SQL语句。封号“;”隔开
INSERT INTO table1 VALUES (variable1);
select Sum(item_price*quantity) from orderitems where order_num = onumber
4.2 使用存储过程参数
SQL into 参数
SET 变量 = “”
例子:select Sum(item_price*quantity) from orderitems >where order_num = onumber into total;
select total into ototal;
SET variable1 = 'birds';
4.3 判断语句
一、if 条件 then SQL elseif SQL else SQL end if;
例子:if taxable then
select total+(total/100*taxrate) into total;
end if;
2、case when 条件 then SQL when 条件 then SQL end case;
例子:case
when var=0 then insert into t values(30);
when var>0 then ...
when var<0 then
end case;
4.4 循环语句
一、while 条件 do SQL end while;
例子:while var<6 do
insertinto t values(var);
set <var=var+1;
end while;
二、 loop SQL end loop;
例子: LOOP
IF v_Hour>23 THEN
v_Hour = 0;
EXIT;
END LOOP;
4、调用存储过程
在其余存储过程当中调用 或者【call 存储过程名称(参数);】
参数:若是是in参数,直接写参数便可。若是是out参数,格式:@参数名
例如:
CALL pro_second(@a);
SELECT @a;
一、hibernate调用存储过程
//1. 得到Session
Session session = HibernateSessionFactory.getSession();
//2. 设置查询过程字符串
String procName = "{Call 存储过程名(参数)}";
//3. 建立本地查询对象,把查询字符串传入,加入参数
SQLQuery sqlquery = session.createSQLQuery(procName);
sqlquery.setString(0,"sdf");
sqlquery.setString(1,"sdf");
//4. 执行存储过程,返回集合
List list = sqlquery.list();
//5. 关闭session
session.close();
HibernateSessionFactory.closeSession();
二、Mybatis调用存储过程
<select id="getUserCount" parameterMap="***" statementType="***">
{CALL 存储过程名(参数)}
</select>
例子:
{call hlj.customer_interview(#{a,jdbcType=INTEGER,mode=IN},#{b,jdbcType=INTEGER,mode=IN})}
5、删除存储过程
drop procedure product;
6、查看存储过程
一、SHOW CREATE PROCEDURE 存储过程名称
二、SELECT * FROM information_schema.ROUTINES
WHERE routine_name='存储过程名称' AND routine_type='PROCEDURE'
7、修改存储过程
MySQL目前不支持该功能。只能先drop删除后,再建立
8、参数类型
二、日期和时间类型
三、字符串类型