天天看點

MySQL--增删改查分頁存儲過程以及事務

添加和修改寫在一起了

可以用id判斷添加和修改

和事務在一起編碼

可以讓代碼更嚴謹

在這裡簡單的說一下事務的四大特性

事務四大特性之原子性:原子性是指事務是一個不可再分割的工作機關,事務中的操作要麼都發生,要麼都不發生

事務四大特性之一緻性:一緻性是指在事務開始之前和事務結束以後,資料庫的完整性限制沒有被破壞。這是說資料庫事務不能破壞關系資料的完整性以及業務邏輯上的一緻性。

事務四大特性之隔離性: 多個事務并發通路時,事務之間是隔離的,一個事務不應該影響其它事務運作效果

事務四大特性之持久性: 持久性,意味着在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,并不會被復原

create PROCEDURE p_AddOrUpd(cid int,cname VARCHAR(200),cnum int,ctype VARCHAR(200),cbirth VARCHAR(200),cmoney VARCHAR(200),out code int)
BEGIN
DECLARE t_error int default 0;
DECLARE CONTINUE HANDLER for SQLEXCEPTION set t_error=1;
START TRANSACTION;
IF cid=0/*判斷*/
THEN/*添加*/
insert into vip(Name,PhoneNum,VipType,Birth,Money) VALUES (cname,cnum,ctype,cbirth,cmoney);
ELSE/*修改*/
update vip set Name=cname,PhoneNum=cnum,VipType=ctype,Birth=cbirth,Money=cmoney where Id=cid;
END IF;

/*錯誤復原*/
if t_error=1
THEN
set code=1;ROLLBACK;
ELSE
set code=0;COMMIT;
end IF;
END

drop PROCEDURE p_AddOrUpd

CALL p_AddOrUpd(0,'1',1,'1','1','1',@code);/*調用存儲過程*/
select @code;      

接下來是删除

删除和正常的代碼差別不大

加上事務也是非常的清晰明了

1 create PROCEDURE p_delete(cid int,out code int)
 2 BEGIN
 3 DECLARE t_error int default 0;
 4 DECLARE CONTINUE HANDLER for SQLEXCEPTION set t_error=1;
 5 START TRANSACTION;
 6 /*删除*/
 7 delete from vip where Id=cid;
 8 
 9 /*錯誤復原*/
10 if t_error=1
11 THEN
12 set code=1;ROLLBACK;
13 ELSE
14 set code=0;COMMIT;
15 end IF;
16 END
17 
18 
19 CALL p_delete(1,@code);
20 select @code;      

最後就是分頁查詢修改時的資料反填了

create PROCEDURE p_pager(pageindex int,pagesize int,out pagecount int,out datacount int,cid int,cname VARCHAR(200),ctype VARCHAR(200))
BEGIN
/*擷取查詢資料*/
set @sqlpager=concat('select * from vip where 1=1',
IF(cid=0,'',concat(' and Id=cid')),
if(cname='','',concat(' and Name like "%',cname,'%"')),
IF(ctype='','',concat(' and VipType="',ctype,'"')),
' limit ',(pageindex-1)*pagesize,pagesize);

PREPARE s1 from @sqlpager;
EXECUTE s1;

/*擷取總條數數*/
set @sqlcount=concat('set @datacount=(select count(*) from vip where 1=1',
IF(cid=0,'',concat(' and Id=cid')),
if(cname='','',concat(' and Name like "%',cname,'%"')),
IF(ctype='','',concat(' and VipType="',ctype,'"')),')');

PREPARE s2 from @sqlcount;
EXECUTE s2;

/*總頁數*/
set pagecount=(@datacount*1.0/pagesize);

END

drop PROCEDURE p_pager;

CALL p_pager(1,3,@pagecount,@datacount,0,'','');
select @pagecount,@datacount;      

根據條件的判斷

可是識别擷取的資料用來顯示

可以用來查詢

也可以用來修改時的資料反填

這就是存儲過程加事務

希望能給大家帶來幫助!

謝謝浏覽!