MySQL<事務與存儲過程>


事務與存儲過程

事務管理

  事務的概念

    謂的事務就是針對數據庫的一組操作,它可以由一條或多條SQL語句組成,同一個事務的操作具備同步的特點,即事務中的語句要么都執行,要么都不執行。

  事務的使用

    開啟事務START TRANSACTION;

    執行SQL語句

    提交事務COMMIT;

    取消事務(回滾)

  事務的提交

    事務中的操作語句都需要使用COMMIT語句手動提交,只有事務提交后其中的操作才會生效。

  事務的回滾

    如果不想提交當前事務,可使用ROLLBACK語句取消當前事務。

    ROLLBACK語句只能針對未提交的事務執行回滾操作,已提交的事務是不能回滾的。

  事務的隔離級別

    REPEATABLE READ(可重復讀)

    READ UNCOMMITTED(讀未提交)

    READ COMMITTED(讀提交)

    SERIALIZABLE(可串行化)

事務的定義特性

  原子性

      原子性是指一個事務必須被視為一個不可分割的最小工作單元,只有事務中所有的數據庫操作都執行成功,才算整個事務執行成功

  一致性

      一致性是指事務將數據庫從一種狀態轉變為下一種一致的狀態。

  隔離性

      隔離性還可以稱為並發控制、可串行化、鎖等,當多個用戶並發訪問數據庫時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個並發事務之間要相互隔離。  

  持久性

      事務一旦提交,其所做的修改就會永久保存到數據庫中,即使數據庫發生故障也不應該對其有任何影響。

      事務的持久性不能做到100%的持久,只能從事務本身的角度來保證永久性,而一些外部原因導致數據庫發生故障,如硬盤損壞,那么所有提交的數據可能都會丟失。

存儲過程的創建

  什么是存儲過程

    存儲過程就是一條或多條SQL語句的集合,當對數據庫進行一系列復雜操作時,存儲過程可以將這些復雜操作封裝成一個代碼塊,以便重復使用,大大減少數據庫開發人員的工作量。

  創建存儲過程

    CREATE PROCEDURE sp_name([proc_parameter])

    [characteristics…]routine_body

 

    CREATE PROCEDURE:為用來創建存儲過程的關鍵字。

    sp_name:為存儲過程的名稱。

    proc_parameter:為指定存儲過程的參數列表。

    characteristics:用於指定存儲過程的特性。

  變量的使用

    定義

      在MySQL中,變量可以在子程序中聲明,用於保存數據處理過程中的值,這些變量的作用范圍在BEGIN…END程序中。

      DECLARE var_name[,varname]…date_type[DEFAULT value];

      var_name:為局部變量的名稱。

      DEFAULT value:子句給變量提供一個默認值,該值可以被聲明為一個常數或一個表達式。如果沒有DEFAULT子句,變量的初始值為NULL。

    使用SET語句為變量賦值

      SET var_name =

      expr[,var_name = expr]…;

 

    使用SELECT…INTO為一個或多個變量賦值

      SELECT col_name[…]

      INTO var_name[…] table_expr;

 

  定義條件和處理程序

    定義條件是指事先定義程序執行過程中遇到的問題

      DECLARE condition_name CONDITION FOR [condition_type];

      // condition_type的兩種形式:

      [condition_type]:

      SQLSTATE[VALUE] sqlstate_value|mysql_error_code

    處理程序定義了在程序執行過程中遇到問題時應當采取的處理方式,並且保證存儲過程在遇到警告或錯誤時能繼續執行處理過程使用DECLARE語句定義

      DECLARE handler_type HANDLER FOR condition_value[,…] sp_statement

      handler_type:

      CONTINUE|EXIT|UNDO

      condition_value:

      |condition_name

      |SQLWARNING

      |NOT FOUND

      |SQLEXCEPTION

      |mysql_error_code

      handler_type:為錯誤處理方式,參數取值

      有3個:CONTINUE、EXIT和UNDO。

       CONTINUE:表示遇到錯誤不處理,繼續執行;

       EXIT:遇到錯誤馬上退出。

       UNDO:表示遇到錯誤后撤回之前的操作,MySQL中暫時不支持這樣的操作。sp_statement:參數為程序語句段,表示在遇到定義的錯誤時,需要執行的存儲過程。

      condition_value:表示錯誤類型。

  光標的使用

    在編寫存儲過程時,查詢語句可能會返回多條記錄,如果數據量非常大,則需要使用光標來逐條讀取查詢結果集中的記錄。光標是一種用於輕松處理多行數據的機制。

    聲明

      語法:DECLARE cursor_name CURSOR FOR select_statement

      示例:DECLARE cursor_student CURSOR FOR select s_name,s_gender FROM student;

    使用

      語法:OPEN cursor_name FETCH cursor_name INTO var_name[,var_name]…

      示例:FETCH cursor_student INTO s_name, s_gender;

    關閉

      CLOSE cursor_name

流程控制的使用

  存儲過程中的流程控制語句用於將多個SQL語句划分或組合成符合業務邏輯的代碼塊,MySQL中的流程控制語句有7個

  1、 IF語句

    語法格式如下:

    IF expr_condition THEN statement_list

    [ELSEIF expr_condition THEN statement_list]

    [ELSE statement_list]

    END IF

  2、CASE語句

    語法格式如下:

    CASE case_expr

         WHEN when_value THEN statement_list

         [WHEN when_value THEN statement_list]…

         [ELSE statement_list]

    END CASE

  3、 LOOP語句

    語法格式如下:

    [loop_label:]LOOP

    statement_list

    END LOOP [loop_label]

    4、LEAVE語句

    語法格式如下:

    LEAVE lable

  5、ITERATE語句

    語法格式如下:

    ITERATE lable

    6、REPEAT語句

    語法格式如下:

    [repeat_lable:] REPEAT

    statement_list

    UNTIL expr_condition

    END REPEAT[repeat_lable]

  7、WHILE語句

    語法格式如下:

    [[while_lable:] WHILE expr_condition DO

    Statement_list

    END WHILE [while_lable]

存儲過程的使用

  調用存儲過程

    CALL sp_name([parameter[,…]])

    CALL:為調用存儲過程的關鍵字。

    sp_name:為存儲過程的名稱。

    Parameter:為存儲過程的參數。

  查看存儲過程

    1、使用SHOW STATUS語句

      CALL sp_name([parameter[,…]])

 

    2、使用SHOW CREATE語句

      SHOW CREATE{PROCEDURE|FUNCTION} sp_name

    3、information_schema.Routines表中查看

      SELECT * FROM  information_schema.Routines

      WHERE ROUTINE_NAME='CountProc1'

      AND ROUTINE_TYPE='PROCEDURE'\G

  修改存儲過程

    ALTER {PROCEDURE|FUNCTION} sp_name[characteristic…]

    sp_name:表示存儲過程或函數的名稱。characteristic:表示要修改存儲過程的哪個部分, characteristic 的取值分為8部分。

  刪除存儲過程

    DROP{ PROCEDURE|FUNCTION }[IF EXISTS] sp_name

    綜合案例--存儲過程應用


免責聲明!

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



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