day61
保存在MySQL上的一個別名 > 一坨SQL語句
-- delimiter // -- create procedure p1() -- BEGIN -- select * from student; -- INSERT into teacher(tname) values("ct"); -- END// -- delimiter; call p1(); #把sql語句封裝進p1中
注釋內容(創建存儲過程)執行完,可以通過call調用(執行存儲過程)。
在函數中:

也可通過pymysql調用存儲過程
1 import pymysql 2 3 #打開 4 conn = pymysql.connect(host= "localhost", user = 'root', password='112358', database = 'db3') 5 #拿 6 cursor = conn.cursor() 7 cursor.callproc('p1')#p1存儲過程 8 result = cursor.fetchall() #拿 9 10 print(result) 11 #關閉數據庫 12 cursor.close() 13 conn.close()
cursor.callproc('p1')
執行結果:
((1, '男', 1, '理解'), (2, '女', 1, '鋼蛋'), (3, '男', 1, '張三'), (4, '男', 1, '張一'), (5, '女', 1, '張二'), (6, '男', 1, '張四'), (7, '女', 2, '鐵錘'), (8, '男', 2, '李三'), (9, '男', 2, '李一'), (10, '女', 2, '李二'), (11, '男', 2, '李四'), (12, '女', 3, '如花'), (13, '男', 3, '劉三'), (14, '男', 3, '劉一'), (15, '女', 3, '劉二'), (16, '男', 3, '劉四'), (18, '女', 1, '觸發'), (19, '女', 1, '觸發'), (20, '女', 1, '觸發'), (21, '女', 1, '啦啦')) Process finished with exit code 0
傳參查詢
in
#傳參數(in,out,inout) delimiter // create procedure p2( in n1 int, in n2 int ) BEGIN select * from student where sid > n1; END // delimiter ;
調用方式:
call p2(12,2)
cursor.callproc('p2',(12,2)) #python中
out
delimiter // create procedure p3( in n1 int, inout n2 int ) BEGIN set n2 = 123123; select * from student where sid > n1; END // delimiter ; set @v1 = 0; call p2(12,@v1)
set @v1 = 0,傳入p2后,n1為12,n2為@v1,@v1為123123,相當傳一個引用。
調用call p2(12,@v1)
查看 select @v1;

注意該查詢過程需保存,p3才會生效。
在pymysql中

上半部分對應
set @v1 = 10;
call p2(12,@v1)
下半部分對應
select @v1;
其中@__p3_0,@__p3__1對應n1,n2。
存儲過程在服務端,客戶端可以調用。
事務
delimiter //
create procedure p4(
out status int
)
BEGIN
1. 聲明如果出現異常則執行{
set status = 1; #出現錯誤
rollback; #回滾
}
開始事務
-- 由秦兵賬戶減去100
-- 方少偉賬戶加90
-- 張根賬戶加10
commit; #提交
結束
set status = 2; #說明沒出錯
END //
delimiter ;
事務:
http://www.cnblogs.com/wupeiqi/articles/5713323.html
支持事務操作
delimiter \\ create PROCEDURE p5( OUT p_return_code tinyint ) BEGIN DECLARE exit handler for sqlexception BEGIN -- ERROR set p_return_code = 1; #出錯 rollback; END; DECLARE exit handler for sqlwarning BEGIN -- WARNING set p_return_code = 2; rollback; END; START TRANSACTION; #開始事務 DELETE from tb1; insert into tb2(name)values('seven'); COMMIT; -- SUCCESS set p_return_code = 2; #未出錯 END\\ delimiter ;
事務操作不會因為數據傳輸意外中斷,而發生錯賬。
游標:
對表每一行都要進行操作,需要使用游標。

將表A導入B時,加上當前行的id。
delimiter // create procedure p3() begin declare row_id int; -- 自定義變量1 declare row_num int; -- 自定義變量2 declare done INT DEFAULT FALSE;#設初始值 DECLARE my_cursor CURSOR FOR select id,num from A;#創建游標 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;#設初始值,循環結束 open my_cursor; #開始游標 xxoo: LOOP fetch my_cursor into row_id,row_num; if done then #如果數據取完done 為 TRUE leave xxoo; #離開循環 END IF; set temp = row_num + row_id; #導入B表后還需要加上當前行的id insert into B(num) values(temp); end loop xxoo; close my_cursor;#關閉游標 end // delimter ;
放在服務端,客戶端通過p3名字調用。
A

B

刪除:
drop procedure proc_name;
