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、參數類型
二、日期和時間類型
三、字符串類型