一、使用情况
对于复杂业务、简单sql无法解决问题、操作大量表的时候使用存储过程。
二、优缺点
优点:1、减少访问数据库连接次数,这是数据库执行效率需要考虑的一个重点。
2、易维护,相对于复杂的程序代码,直接修改存储过程,更加快捷。
3、存储过程,只在创建时进行编译,之后就不用编译了。而普通sql,每次执行都需要编译(因为他们和代码放在一起)。
4、减轻编码工作,可以少些很多代码。
缺点: 1、开发调试不方便,相对于程序代码,存储过程打断点进行调试,只能开发者去查看存储过程。
2、如果需要使用中间数据,则不能使用存储过程。
3、编写比较困难,有许多固定格式需要注意。
4、移植性差,不同数据库厂家,存储过程的语法不同。
三、创建语法
BEGIN
过程体
END
//
DELIMITER;
说明:
1、存储过程名:pro_**
2、参数:参数有三种类型。
IN: 输入参数。调用该存储过程,必须附带该参数
OUT: 输出参数。调用该存储过程后,返回的结果。
INOUT: 输入输出参数。结合IN、OUT特性
格式:OUT p_out int。p_out为参数名称,int为参数类型。 参数类型
3、存储过程参数
相当于java的变量,用于存储过程中的使用。
格式:declare param_name type(参数类型)
例子:declare total decimal(8) default 6;
4、过程体
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 判断语句
1、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 循环语句
1、while 条件 do SQL end while;
例子:while var<6 do
insertinto t values(var);
set <var=var+1;
end while;
2、 loop SQL end loop;
例子: LOOP
IF v_Hour>23 THEN
v_Hour = 0;
EXIT;
END LOOP;
四、调用存储过程
在其他存储过程中调用 或者【call 存储过程名称(参数);】
参数:如果是in参数,直接写参数即可。如果是out参数,格式:@参数名
例如:
CALL pro_second(@a);
SELECT @a;
1、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();
2、Mybatis调用存储过程
<select id="getUserCount" parameterMap="***" statementType="***">
{CALL 存储过程名(参数)}
</select>
例子:
{call hlj.customer_interview(#{a,jdbcType=INTEGER,mode=IN},#{b,jdbcType=INTEGER,mode=IN})}
五、删除存储过程
drop procedure product;
六、查看存储过程
1、SHOW CREATE PROCEDURE 存储过程名称
2、SELECT * FROM information_schema.ROUTINES
WHERE routine_name='存储过程名称' AND routine_type='PROCEDURE'
七、修改存储过程
MySQL目前不支持该功能。只能先drop删除后,再创建
八、参数类型
2、日期和时间类型
3、字符串类型