亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

理解MySQL存儲過程和函數

2024-07-24 13:08:57
字體:
來源:轉載
供稿:網友
這篇文章主要幫助大家學習理解MySQL存儲過程和函數,感興趣的小伙伴們可以參考一下
 

一、概述 

一提到存儲過程可能就會引出另一個話題就是存儲過程的優缺點,這里也不做討論,一般別人問我我就這樣回答你覺得它好你就用它。因為mysql中存儲過程和函數的語法非常接近所以就放在一起,主要區別就是函數必須有返回值(return),并且函數的參數只有IN類型而存儲過程有IN、OUT、INOUT這三種類型。

二、語法 

 創建存儲過程和函數語法

CREATE PROCEDURE sp_name ([proc_parameter[,...]])  [characteristic ...] routine_body CREATE FUNCTION sp_name ([func_parameter[,...]])  RETURNS type  [characteristic ...] routine_body    proc_parameter:  [ IN | OUT | INOUT ] param_name type    func_parameter:  param_name type type:  Any valid MySQL data type characteristic:  LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string' routine_body:  Valid SQL procedure statement or statements

語法來自官方自帶的參考手冊,characteristic語法塊是需要注意的地方,先用一個例子來介紹。

例子:

 

#創建數據庫DROP DATABASE IF EXISTS Dpro;CREATE DATABASE DproCHARACTER SET utf8;USE Dpro;#創建部門表DROP TABLE IF EXISTS Employee;CREATE TABLE Employee(id INT NOT NULL PRIMARY KEY COMMENT '主鍵', name VARCHAR(20) NOT NULL COMMENT '人名', depid INT NOT NULL COMMENT '部門id');#插入測試數據INSERT INTO Employee(id,name,depid) VALUES(1,'陳',100),(2,'王',101),(3,'張',101),(4,'李',102),(5,'郭',103);#創建存儲過程DROP PROCEDURE IF EXISTS Pro_Employee;DELIMITER $$CREATE PROCEDURE Pro_Employee(IN pdepid VARCHAR(20),OUT pcount INT )READS SQL DATASQL SECURITY INVOKERBEGINSELECT COUNT(id) INTO pcount FROM Employee WHERE depid=pdepid;END$$DELIMITER ;#執行存儲過程CALL Pro_Employee(101,@pcount);SELECT @pcount;

MySQL,存儲過程,函數

語法解釋:

在創建存儲過程的時候一般都會用DELIMITER$$.....END$$ DELIMITER ;放在開頭和結束,目的就是避免mysql把存儲過程內部的";"解釋成結束符號,最后通過“DELIMITER ;”來告知存儲過程結束。

主要解釋characteristic部分:

LANGUAGE SQL:用來說明語句部分是SQL語句,未來可能會支持其它類型的語句。

[NOT] DETERMINISTIC:如果程序或線程總是對同樣的輸入參數產生同樣的結果,則被認為它是“確定的”,否則就是“非確定”的。如果既沒有給定DETERMINISTIC也沒有給定NOT DETERMINISTIC,默認的就是NOT DETERMINISTIC(非確定的)CONTAINS SQL:表示子程序不包含讀或寫數據的語句。

NO SQL:表示子程序不包含SQL語句。

READS SQL DATA:表示子程序包含讀數據的語句,但不包含寫數據的語句。

MODIFIES SQL DATA:表示子程序包含寫數據的語句。

SQL SECURITY DEFINER:表示執行存儲過程中的程序是由創建該存儲過程的用戶的權限來執行。

SQL SECURITY INVOKER:表示執行存儲過程中的程序是由調用該存儲過程的用戶的權限來執行。(例如上面的存儲過程我寫的是由調用該存儲過程的用戶的權限來執行,當前存儲過程是用來查詢Employee表,如果我當前執行存儲過程的用戶沒有查詢Employee表的權限那么就會返回權限不足的錯誤,如果換成DEFINER如果存儲過程是由ROOT用戶創建那么任何一個用戶登入調用存儲過程都可以執行,因為執行存儲過程的權限變成了root)

COMMENT 'string':備注,和創建表的字段備注一樣。

注意:在編寫存儲過程和函數時建議明確指定上面characteristic部分的狀態,特別是存在復制的環境中,如果創建函數不明確指定這些狀態會報錯,從一個非復制環境將帶函數的數據庫遷移到復制環境的機器上如果沒有明確指定DETERMINISTIC, NO SQL, or READS SQL DATA該三個狀態也會報錯。

報錯示例

Error Code: 1418. This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
這個報錯就是上面注意部分說的問題。原來是因為在主從復制的兩臺MySQL服務器中開啟了二進制日志選項log-bin,slave會從master復制數據,而一些操作,比如function所得的結果在master和slave上可能不同,所以存在潛在的安全隱患。因此,在默認情況下回阻止function的創建。

解決辦法有兩種:

1.將log_bin_trust_function_creators參數設置為ON,這樣一來開啟了log-bin的MySQL Server便可以隨意創建function。這里存在潛在的數據安全問題,除非明確的知道創建的function在master和slave上的行為完全一致。
  設置該參數可以用動態的方式或者指定該參數來啟動數據庫服務器或者修改配置文件后重啟服務器。需注意的是,動態設置的方式會在服務器重啟后失效。

mysql> show variables like 'log_bin_trust_function_creators'; mysql> set global log_bin_trust_function_creators=1;

  另外如果是在master上創建函數,想通過主從復制的方式將函數復制到slave上則也需在開啟了log-bin的slave中設置上述變量的值為ON(變量的設置不會從master復制到slave上,這點需要注意),否則主從復制會報錯。

2.明確指明函數的類型
  1 )、DETERMINISTIC 不確定的
  2 )、NO SQL 沒有SQl語句,當然也不會修改數據
  3 )、READS SQL DATA 只是讀取數據,當然也不會修改數據
比如:CREATE DEFINER=`username`@`%` READS SQL DATA FUNCTION `fn_getitemclock`(i_itemid bigint,i_clock int,i_pos int) RETURNS int(11)...
這樣一來相當于明確的告知MySQL服務器這個函數不會修改數據,因此可以在開啟了log-bin的服務器上安全的創建并被復制到開啟了log-bin的slave上。

修改存儲過程函數語法

ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...] characteristic:  { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'

刪除存儲過程函數語法

DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name

查看存儲過程和函數

1.查看存儲過程狀態

SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']show procedure status like 'Pro_Employee' /G

MySQL,存儲過程,函數

2.查看存儲過程和函數的創建語法

SHOW CREATE {PROCEDURE | FUNCTION} sp_nameSHOW CREATE PROCEDURE Pro_Employee /G;

MySQL,存儲過程,函數

3.查看存儲過程和函數詳細信息

 

復制代碼代碼如下:
SELECT * FROM information_schema.ROUTINES WHERE ROUTINE_NAME='Pro_Employee' /G;

 

MySQL,存儲過程,函數

總結 

 存儲過程和函數語法不難理解,但是往往存儲過程中不單單只包含這種簡單的查詢語法,還會嵌套循環語句、變量、報錯處理、事務等,下一篇文章會單獨講變量,將變量的知識加入到存儲過程,包括變量的聲明和報錯處理,歡迎關注。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧亚精品在线观看| 国产精品久久av| 美女啪啪无遮挡免费久久网站| 另类美女黄大片| 亚洲黄色av女优在线观看| 亚洲激情视频网| 欧美成年人在线观看| 久久精品久久久久| 精品久久久久久久久久国产| 国内伊人久久久久久网站视频| 亚洲精品www久久久| 国产日韩在线一区| 尤物yw午夜国产精品视频明星| 日韩av在线免播放器| 国产精品久久久久久av福利| 国产精品久久久久久久久粉嫩av| 国产精品视频一| 欧美成aaa人片在线观看蜜臀| 日韩av免费一区| 91亚洲精品久久久久久久久久久久| 九色精品免费永久在线| 国产精品91免费在线| 成人女保姆的销魂服务| 国产一区二区在线免费视频| 久青草国产97香蕉在线视频| 日韩在线欧美在线国产在线| 日日骚久久av| 日韩中文有码在线视频| www.久久久久久.com| 日韩av免费在线播放| 欧美电影在线免费观看网站| 国产91av在线| 国产视频久久久| 成人午夜高潮视频| 国产精品欧美风情| 国产亚洲精品久久久久久777| 国产精品91在线观看| 久久久精品国产| 国产成人一区二区三区| 国产小视频国产精品| 亚洲国产私拍精品国模在线观看| 欧美激情视频一区二区三区不卡| 亚洲精品在线看| 97国产在线观看| 国产成人97精品免费看片| 欧美激情a∨在线视频播放| 欧美日韩在线免费| 亚洲欧美日韩天堂一区二区| 91九色单男在线观看| 亚洲成人亚洲激情| 久久久久久久久久久亚洲| 国产亚洲精品久久久优势| 中文字幕日韩在线观看| 欧美网站在线观看| 亚洲影院色无极综合| 这里只有精品丝袜| 欧美大肥婆大肥bbbbb| 国产伦精品免费视频| 日韩中文字幕在线| 亚洲精品色婷婷福利天堂| 91九色精品视频| 国产精品久久久久影院日本| 国产成人a亚洲精品| 国产91精品视频在线观看| 国产精品第七影院| 91精品国产91久久久久久不卡| 一区二区中文字幕| 国产欧美韩国高清| 青青草一区二区| 亚洲美女av网站| 欧美制服第一页| 亚洲第一页中文字幕| 国产精品人人做人人爽| 国产精品黄视频| 国产精品视频免费在线观看| 精品自在线视频| 精品高清一区二区三区| 一区二区欧美亚洲| 久久99精品国产99久久6尤物| 日韩欧美中文第一页| 久久成年人免费电影| 久久精品国产免费观看| 亚洲欧美精品一区二区| 亚洲一二三在线| 亚洲天堂成人在线视频| 国产精品91久久久| 91中文字幕一区| 亚洲精品美女在线观看播放| 日韩大片在线观看视频| 国产成人精品久久二区二区91| 欧美激情按摩在线| 另类视频在线观看| 国产日韩欧美成人| 亚洲视频在线观看视频| 国产ts一区二区| 97超级碰碰人国产在线观看| 日本高清不卡的在线| 日本久久中文字幕| 国产网站欧美日韩免费精品在线观看| 欧美视频免费在线观看| 精品国产91乱高清在线观看| 国产精品日日做人人爱| 欧美理论电影网| 色午夜这里只有精品| 91美女高潮出水| 国产成人一区二区三区| 日韩精品视频中文在线观看| 久久99精品久久久久久青青91| 亚洲日本欧美日韩高观看| 一本久久综合亚洲鲁鲁| 国产福利精品av综合导导航| 国产成+人+综合+亚洲欧洲| 精品亚洲aⅴ在线观看| 色一情一乱一区二区| 亚洲精品98久久久久久中文字幕| 日韩黄色av网站| 2019最新中文字幕| 国内免费久久久久久久久久久| 久久久精品日本| 欧美丝袜一区二区| 亚洲xxxxx性| 精品久久久久久电影| 国产精品视频免费在线观看| 操人视频在线观看欧美| 亚洲天堂网在线观看| 九九热这里只有精品免费看| 国产亚洲视频中文字幕视频| 色婷婷**av毛片一区| 日韩高清人体午夜| 中文字幕在线国产精品| 亚洲日本成人女熟在线观看| 国产视频在线观看一区二区| 在线a欧美视频| 日韩欧美在线免费观看| 色与欲影视天天看综合网| 日韩视频第一页| 美日韩丰满少妇在线观看| 日韩欧美高清视频| 久久久国产影院| 欧洲亚洲免费视频| 亚洲最大的av网站| 深夜福利一区二区| 在线精品视频视频中文字幕| 韩国国内大量揄拍精品视频| 亚洲第一免费播放区| 精品久久久久久国产| 久99九色视频在线观看| 色综合老司机第九色激情| 久久精品视频免费播放| 91av在线影院| 在线日韩日本国产亚洲| 国产一区二区三区视频免费| 中文字幕av一区| 国模叶桐国产精品一区| 国产精品网红福利| 在线观看精品国产视频| 日韩精品视频免费专区在线播放| 色婷婷亚洲mv天堂mv在影片| 日韩精品丝袜在线| 中文字幕亚洲图片| 韩国精品美女www爽爽爽视频| 亚洲人成网站色ww在线| 91人人爽人人爽人人精88v| 全亚洲最色的网站在线观看|