程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL存儲進程和函數的操作(十二)

MySQL存儲進程和函數的操作(十二)

編輯:MySQL綜合教程

MySQL存儲進程和函數的操作(十二)。本站提示廣大學習愛好者:(MySQL存儲進程和函數的操作(十二))文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL存儲進程和函數的操作(十二)正文


數據庫對象表時存儲和操作數據的邏輯構造,而數據庫對象存儲進程和函數,則是用來完成將一組關於表操作的sql語句看成一個全體來履行。在數據庫體系中,當挪用存儲進程和函數時,則會履行這些對象中所設置的sql語句組,從而完成響應功效。
1. 為何應用存儲進程和函數的操作 
    有時針對表的一個完全操作常常不是單條sql語句便可以完成的,而是須要一組sql語句來完成。在詳細運用傍邊,一個完全的操作會包括多條sql語句,在履行進程中須要依據後面sql語句的履行成果有選擇地履行前面sql語句。
    存儲進程和函數可以簡略懂得為一條或多條sql語句的聚集。存儲進程和函數就是事前經由編譯並存儲在數據庫中的一段sql語句聚集。
    存儲進程和函數有甚麼差別呢?這二者的重要差別在於函數必需有前往值,而存儲進程則沒有。存儲進程的參數類型遠遠多於函數的參數類型。 

關於存儲進程和函數的長處以下:
      1. 存儲進程和函數許可尺度組件式編程,進步了sql語句的重用性、同享性和可移植性。
      2. 存儲進程和函數可以或許完成較快的履行速度,可以或許削減收集流量。
      3. 存儲進程和函數可以作為一種平安機制來應用。 

關於存儲進程和函數的缺陷以下:
      1. 存儲進程和函數的編寫比單句sql語句龐雜,須要用戶有更高的技巧和更豐碩的經歷。
      2. 在編寫存儲進程和函數時,須要創立這些數據庫對象的權限。=

2. 創立存儲進程和函數 
2.1 創立存儲進程語法情勢:

語法情勢以下:

create procedure procedure_name([procedure_parameter[,...]])
  [characteristic...] routine_body

//解釋:procedure_name參數表現所要創立的存儲進程的名字,procedure_parameter參數表現存儲進程的參數,
characteristic參數表現存儲進程的特征,routine_body參數表現存儲進程的sql語句代碼,可以用begin...end來標記sql語句的開端和停止。
//留意:在詳細創立存儲進程時,存儲進程名不克不及和曾經存在的存儲進程名反復,推舉存儲進程名為procedure_xxx或許proce_xxx;

//procedure_parameter 中每一個參數的語法情勢為:
[IN|OUT|INOUT] parameter_name type

//該語句中每一個參數由三部門構成,分離為輸出/輸入類型、參數名和參數類型。

characteristic參數的取值為:
language sql
|[not] deterministic
|{constains sql | no sql | reads sql data|modifies sql data}
|sql security {definer | invoker}
|comment 'string'

    1. language sql,表現存儲進程的routine_body部門由sql說話的語句構成。為mysql軟件一切默許的語句。
    2. [not] deterministic,表現存儲進程的履行成果能否肯定。假如值是deterministic表現履行成果是肯定的。即每次履行存儲進程時,假如輸出雷同的參數將獲得雷同的輸入;假如值為not deterministic,表現履行成果不肯定,即雷同的輸出能夠獲得分歧的輸入。默許值為deterministic。
    3. {contains sql|no sql|reads sql data|modifies sql data},表現sql語句的限制,假如值為contains sql表現可以包括sql語句,但不包括讀或寫數據的語句;假如值為no sql表現不包括sql語句;假如值為reads sql data表現包括讀數據的語句;假如值為modifies sql data表現包括讀數據的語句。默許值為contains sql。
    4. sql security{definer|invoker},設置誰有權限來履行。假如值為definer,表現只要界說者能力履行,假如值為invoker表現挪用者可以履行。默許值為definer。
    5. comment ‘string', 表現正文語句。 

2.2 創立函數語法情勢:

語法情勢以下:

create function function_name([function_parameter[,...]])
  [characteristic...] routine_body

    上述語句中,function_name參數表現所要創立的函數的名字;function_parameter參數表現函數的參數,characteristic參數表現函數的特征,該參數的取值與存儲進程中的取值雷同。routine_body參數表現函數的sql語句代碼,可以用begin…end來表現sql語句的開端和停止。

function_parameter中每一個參數的語法情勢以下:
parameter_name type

    在上述語句中每一個參數由兩部門構成,分離為參數名和參數類型。parameter_name表現參數名。type表現參數類型。 

2.3 創立簡略的存儲進程和函數:

//查詢雇員表中一切雇員工資的存儲進程:
示例:

mysql> delimiter $$
mysql> delimiter $$ create procedure proce_employee_sal() 
    comment '查詢一切雇員的工資' 
    begin 
     select sal from t_employee;
    end $$
    dilimiter ;

    平日在創立存儲進程時,經由過程敕令delimiter && 將sql語句的停止符由“;”符號修正成兩個美元符號。這重要是由於sql語句中默許語句停止符為分好(;),即存儲進程中的sql語句也須要用分號來停止,將停止符號修正成兩個美元符以後,便可以在履行進程中防止抵觸。不外最初不要忘卻將經由過程敕令“delimiter ;”將停止符修正為sql語句中默許的停止符號。

創立函數示例:

delimiter $$
create function func_employee_sal (empno int(11))
 returns double(10,2)
 comment '查詢某個雇員的工資'
 begin
 return (
  select sal from t_employee where t_employee.empno=empno;
 )
end$$
delimiter ;

    創立了一個名為func_employee_sal的函數,該函數具有一個類型為int(11),名為empno的參數,前往值為double(10,2)類型。select語句從t_employee表中查詢empnoo字段值等於所傳入參數empno值的記載,同時將該筆記錄的sal字段的值前往。

3. 關於存儲進程和函數的表達式 

3.1 操作變量:
    變量是表達式語句中最根本的元素,可以用光降時存儲數據。可以經由過程變量存儲從表中查詢到的數據。 

    3.1.1 聲明變量:

語法情勢以下:
declare var_name[,...] type [default value]

    在上述語句中,var_name參數表現要聲明的變量的名字;參數type表現所要聲明變量的類型;default value用來完成設置變量的默許值,假如無該語句默許值為null。在詳細聲明變量時,可以同時界說多個變量。 

    3.1.2 賦值變量:

語法情勢以下:
語法一:
set var_name=expr[,...]
語法二:

select filed_name[,...] into var_name[,...]
  from table_name
    where condition

    var_name參數表現所要賦值變量名字,參數expr是關於變量的賦值表達式。在為變量賦值時,可以同時為多個變量賦值,各個變量的賦值語句之間用逗號離隔。
語法二中將查詢到的成果賦值給變量,參數filed_name表現查詢的字段名,參數var_name表現變量名。將查詢成果賦值給變量,該查詢語句的前往成果只能是單行。

示例:

declare employee_sal int default 1000;

declare employee_sal int default 1000;
set employee_sal = 3500;

select sal into employee_sal from t_employee where empno=7556;

3.2 操作前提:
    3.2.1 界說前提:

語法情勢以下:

declare condition_name condition for condition_value
condition_value:
  sqlstate[value] sqlstate_value
  |mysql_error_code

condition_name參數表現所要界說的前提稱號;參數condition_value用來完成設置前提的類型;參數sqlstate_value和mysql_error_code用來設置前提的毛病。 

    3.2.2 界說處置法式:

語法情勢為:

declare handler_type handler for condition_value[,...] sp_statement
handler_type:
  continue
  |exit
  |undo
condition_value:
  sqlstate[value] sqlstate_value
  |condition_name
  |sqlwarning
  |not found
  |sqlexception
  |mysql_error_code

    這個語句指定每一個可以處置一個或多個前提的處置法式。假如發生一個或多個前提,指定的語句被履行。對一個continue處置法式,以後子法式的履行處置法式語句以後持續。關於exit處置法式,以後begin…end復合語句的履行被終止。undo處置法式類型語句還不被支撐。
1. sqlwarning是對一切以01開首的sqlstate代碼的速記。
2. not found是對一切以02開首的sqlstate代碼的速記。
3. sqlexception 是對一切沒有被sqlwarning或not found捕捉的sqlstate代碼的速記。 

3.3 應用游標:
    mysql的查詢語句可以前往多筆記錄成果,那末在表達式中若何遍歷這些記載成果呢?mysql供給了游標來完成。經由過程指定由select語句前往的行聚集(包含知足該語句的where子句所列前提的一切行),由該語句前往完全的行聚集叫成果集。運用法式須要一種機制來一次處置成果集中的一行或持續的幾行,而游標經由過程每次指定一筆記錄完成與運用法式的交互。
    游標可以看作一種數據類型,可以用來遍歷成果集,相當是指針或數組的下標。處置成果集的辦法可以經由過程游標定位到成果集的某一行,從以後成果集的地位搜刮一行或許一部門行或許成果集中確當前行停止數據修正。

    3.3.1 聲明游標:

語法情勢以下:
declare cursor_name cursor for select_statement;

    上述語句中,cursor_name參數表現有游標的稱號,參數select_statement表現select語句。由於游標須要遍歷成果集中的每行,增長了辦事器的累贅,招致游標的效力其實不高。假如游標操作的數據跨越1萬行,那末應當采取其他方法,別的假如應用了游標,還應盡可能防止在游標輪回中停止表銜接操作。 

    3.3.2 翻開游標:

語法情勢為:
open cursor_name

//留意,翻開一個游標時,游標其實不指向第一筆記錄,而是指向第一筆記錄的前邊。

    3.3.3 應用游標:

語法情勢以下:
fetch cursor_name into var_name [,var_name] ...

    3.3.4 封閉游標:

語法情勢以下:
close cursor_name

4. 修正存儲進程和函數 
    關於曾經創立好的存儲進程和函數,當應用一段時光後,就會須要停止一些界說上的修正。可以經由過程alter procedure語句完成修正存儲進程,經由過程alter function語句完成修正函數。
  4.1 修正存儲進程:

語法情勢以下:

alter procedure procedure_name
  [characteristic...]

    procedure_name參數表現所要修正存儲進程的名字,而characteristic參數指定修正後存儲進程的特征,與界說存儲進程的該參數比擬,取值只能是以下值:

|(contains sql|no sql|reads sql data|modifys sql data) 
|sql security {definer|invoker} 
|comment ‘string' 
) 

  4.2 修正函數:

語法情勢以下:

alter function function_name
  [characteristic...]

    function_name參數表現所要修正函數的名字,而characteristic參數指定修正後的函數特征,與界說函數的該參數比擬,取值只能是以下值:
|(contains sql|no sql|reads sql data|modifys sql data)
|sql security {definer|invoker}
|comment ‘string'

5. 刪除存儲進程和函數 
  5.1 經由過程drop語句刪除存儲進程:

語法情勢以下:
drop prcedure proce_name;

  5.2 經由過程drop function語句刪除函數:

語法情勢以下:
drop function func_name;

以上就是本文的全體內容,願望對年夜家的進修有所贊助,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved