MySQL(存儲過程,支持事務操作)


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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM