MySql學習心得之存儲過程
來源:易賢網 閱讀:1386 次 日期:2014-06-20 20:16:01
溫馨提示:易賢網小編為您整理了“MySql學習心得之存儲過程”,方便廣大網友查閱!

先來看段mysql查詢文章回復語句:

代碼如下:

#查詢文章回復

------------------------------

--Procedurestructurefor`sp_select_reply_article`

------------------------------

DROPPROCEDUREIFEXISTS`sp_select_reply_article`;

DELIMITER;;

CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_select_reply_article`(IN`ra_id`int,IN`pagefrom`int,IN`pagesize`int)

BEGIN

#Routinebodygoeshere...

SET@ra_id=ra_id;

SET@pagefrom=pagefrom;

SET@pagesize=pagesize;

SET@ssra=CONCAT('SELECT*FROMgk_articleWHEREid=?LIMIT?,?');

PREPAREsqlqueryFROM@ssra;

EXECUTEsqlqueryUSING@ra_id,@pagefrom,@pagesize;

END

DELIMITER;

#技術點1:MySql5.1不支持LIMIT參數(MySql5.5就支持了),如果編寫存儲過程時使用LIMIT做變量,那是需要用動態SQL來構建的,而這樣做性能肯定沒有靜態SQL好。主要代碼如下:

代碼如下:

SET@ssra=CONCAT('SELECT*FROMgk_articleWHEREid=?LIMIT?,?');

PREPAREsqlqueryFROM@ssra;

EXECUTEsqlqueryUSING@ra_id,@pagefrom,@pagesize;

#技術點2:如果同時需要返回受影響行數需要在語句后面添加語句:ROW_COUNT()函數,兩條語句之間需要“;”分隔。

代碼如下:

#更新數據

------------------------------

--Procedurestructurefor`sp_update_permission`

------------------------------

DROPPROCEDUREIFEXISTS`sp_update_permission`;

DELIMITER;;

CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_update_permission`(IN`puser_uid`varchar(20),IN`plevel`int,IN`ppower`int)

BEGIN

#Routinebodygoeshere...

SET@puser_uid=puser_uid;

SET@plevel=plevel;

SET@ppower=ppower;

UPDATEgk_permissionSET`level`=@plevel,power=@ppowerWHEREuser_uid=CONVERT(@puser_uidUSINGutf8)COLLATEutf8_unicode_ci;

END

DELIMITER;

#技術點3:MySQL進行字符串比較時發生錯誤(Illegalmixofcollations(utf8_unicode_ci,IMPLICIT)and(utf8_general_ci,IMPLICIT)foroperation'='),解決方法:將比較等式一邊進行字符串轉換,如改為“CONVERT(b.fullCodeUSINGutf8)COLLATEutf8_unicode_ci”,主要代碼如下:

代碼如下:

UPDATEgk_permissionSET`level`=@plevel,power=@ppowerWHEREuser_uid=CONVERT(@puser_uidUSINGutf8)COLLATEutf8_unicode_ci;

代碼如下:

#插入數據

------------------------------

--Procedurestructurefor`sp_insert_user`

------------------------------

DROPPROCEDUREIFEXISTS`sp_insert_user`;

DELIMITER;;

CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_insert_user`(IN`uid`varchar(20),IN`upw`varchar(32),IN`name`varchar(20),IN`sex`int,IN`phone`varchar(20),IN`u_id`int,IN`s_id`int,IN`j_id`int)

BEGIN

#Routinebodygoeshere...

SET@uid=uid;

SET@upw=upw;

SET@uname=uname;

SET@sex=sex;

SET@phone=phone;

#由于外鍵約束,所以添加的外鍵字段需要在對應外鍵所在表有相應數據

SET@u_id=u_id;

SET@s_id=s_id;

SET@j_id=j_id;

SET@verifytime=DATE('0000-00-00');

INSERTINTOgk_user(uid,upw,uname,sex,phone,u_id,s_id,j_id,verifytime)

       VALUES(@uid,@upw,@uname,@sex,@phone,@u_id,@s_id,@j_id,@verifytime);

#查詢結果會自動返回受影響行數

END

DELIMITER;

代碼如下:

#根據ID刪除數據

------------------------------

--Procedurestructurefor`sp_delete_exchange_by_id`

------------------------------

DROPPROCEDUREIFEXISTS`sp_delete_exchange_by_id`;

DELIMITER;;

CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_delete_exchange_by_id`(IN`eid`int)

BEGIN

#Routinebodygoeshere...

SET@eid=eid;

DELETEFROMgk_exchangeWHEREid=@eid;

END

DELIMITER;

代碼如下:

#通過賬號查詢用戶或者管理員

------------------------------

--Procedurestructurefor`sp_select_user_by_uid`

------------------------------

DROPPROCEDUREIFEXISTS`sp_select_user_by_uid`;

DELIMITER;;

CREATEDEFINER=`root`@`localhost`PROCEDURE`sp_select_user_by_uid`(IN`uid`varchar(20),IN`getAdmin`int)

BEGIN

#Routinebodygoeshere...

SET@uid=uid;

#SET@getadmin=getAdmin;

#查詢管理員

IF(getAdmin=1)THEN

SELECTus.*,un.`name`,se.`name`,jo.`name`,pe.`level`,pe.powerFROMgk_userASus,gk_unitASun,gk_sectionASse,gk_jobtitleASjo,gk_permissionASpeWHEREus.u_id=un.idANDus.s_id=se.idANDus.j_id=jo.idANDus.uid=pe.user_uidANDus.uid=CONVERT(@uidUSINGutf8)COLLATEutf8_unicode_ci;

ENDIF;

#查詢用戶

IF(getAdmin=0)THEN

SELECTus.*,un.`name`,se.`name`,jo.`name`FROMgk_userASus,gk_unitASun,gk_sectionASse,gk_jobtitleASjoWHEREus.u_id=un.idANDus.s_id=se.idANDus.j_id=jo.idANDus.uid=CONVERT(@uidUSINGutf8)COLLATEutf8_unicode_ci;

ENDIF;

END

DELIMITER;

#技術點4:這個存數過程需要用到控制語句(ifelseelseifwhilelooprepeatleaveiterate)。

代碼如下:

IF(getAdmin=1)THEN

#語句…

ENDIF;

#技術點5:在傳入參數不匹配的情況下報錯(Columncountdoesn'tmatchvaluecountatrow1),這個就是細心問題了,詳細檢查參數吧。

#技術點6:獲取當前時間的函數:NOW()

#技術點7:“`”這個符號是反單引號,兩個反單引號夾起來的會被當做變量,一般是在定義字段時遇到關鍵字沖突的時候會用到。

更多信息請查看IT技術專欄

更多信息請查看腳本欄目
易賢網手機網站地址:MySql學習心得之存儲過程
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
未满十八18勿进黄网站免费看