站長資訊網
        最全最豐富的資訊網站

        mysql中存儲過程和存儲函數是什么?

        在mysql中,存儲過程和存儲函數都是數據庫中定義的一些SQL語句的集合。其中,存儲函數可以通過return語句返回函數值,主要用于計算并返回一個值;而存儲過程沒有直接返回值,主要用于執行操作。

        mysql中存儲過程和存儲函數是什么?

        (推薦教程:mysql視頻教程)

        mysql中的存儲過程

        編寫存儲過程并不是件簡單的事情,但是使用存儲過程可以簡化操作,且減少冗余的操作步驟,同時,還可以減少操作過程中的失誤,提高效率,因此應該盡可能的學會使用存儲過程。

        下面主要介紹如何創建存儲過程。

        可以使用 CREATE PROCEDURE 語句創建存儲過程,語法格式如下:

        CREATE PROCEDURE <過程名> ( [過程參數[,…] ] ) <過程體>

        [過程參數[,…] ] 格式

        [ IN | OUT | INOUT ] <參數名> <類型>

        語法說明如下:

        1) 過程名

        存儲過程的名稱,默認在當前數據庫中創建。若需要在特定數據庫中創建存儲過程,則要在名稱前面加上數據庫的名稱,即 db_name.sp_name。

        需要注意的是,名稱應當盡量避免選取與 MySQL 內置函數相同的名稱,否則會發生錯誤。

        2) 過程參數

        存儲過程的參數列表。其中,<參數名>為參數名,<類型>為參數的類型(可以是任何有效的 MySQL 數據類型)。當有多個參數時,參數列表中彼此間用逗號分隔。存儲過程可以沒有參數(此時存儲過程的名稱后仍需加上一對括號),也可以有 1 個或多個參數。

        MySQL 存儲過程支持三種類型的參數,即輸入參數、輸出參數和輸入/輸出參數,分別用 IN、OUT 和 INOUT 三個關鍵字標識。其中,輸入參數可以傳遞給一個存儲過程,輸出參數用于存儲過程需要返回一個操作結果的情形,而輸入/輸出參數既可以充當輸入參數也可以充當輸出參數。

        需要注意的是,參數的取名不要與數據表的列名相同,否則盡管不會返回出錯信息,但是存儲過程的 SQL 語句會將參數名看作列名,從而引發不可預知的結果。

        3) 過程體

        存儲過程的主體部分,也稱為存儲過程體,包含在過程調用的時候必須執行的 SQL 語句。這個部分以關鍵字 BEGIN 開始,以關鍵字 END 結束。若存儲過程體中只有一條 SQL 語句,則可以省略 BEGIN-END 標志。

        在存儲過程的創建中,經常會用到一個十分重要的 MySQL 命令,即 DELIMITER 命令,特別是對于通過命令行的方式來操作 MySQL 數據庫的使用者,更是要學會使用該命令。

        在 MySQL 中,服務器處理 SQL 語句默認是以分號作為語句結束標志的。然而,在創建存儲過程時,存儲過程體可能包含有多條 SQL 語句,這些 SQL 語句如果仍以分號作為語句結束符,那么 MySQL 服務器在處理時會以遇到的第一條 SQL 語句結尾處的分號作為整個程序的結束符,而不再去處理存儲過程體中后面的 SQL 語句,這樣顯然不行。

        為解決以上問題,通常使用 DELIMITER 命令將結束命令修改為其他字符。語法格式如下:

        DELIMITER $$

        語法說明如下:

        • $$ 是用戶定義的結束符,通常這個符號可以是一些特殊的符號,如兩個“?”或兩個“¥”等。

        • 當使用 DELIMITER 命令時,應該避免使用反斜杠“”字符,因為它是 MySQL 的轉義字符。

        在 MySQL 命令行客戶端輸入如下 SQL 語句。

        mysql > DELIMITER ??

        成功執行這條 SQL 語句后,任何命令、語句或程序的結束標志就換為兩個問號“??”了。

        若希望換回默認的分號“;”作為結束標志,則在 MySQL 命令行客戶端輸入下列語句即可:

        mysql > DELIMITER ;

        注意:DELIMITER 和分號“;”之間一定要有一個空格。在創建存儲過程時,必須具有 CREATE ROUTINE 權限。

        mysql中的存儲函數

        在 MySQL 中,使用 CREATE FUNCTION 語句來創建存儲函數,其語法形式如下:

        CREATE FUNCTION sp_name ([func_parameter[...]]) RETURNS type [characteristic ...] routine_body

        其中:

        • sp_name 參數:表示存儲函數的名稱;

        • func_parameter:表示存儲函數的參數列表;

        • RETURNS type:指定返回值的類型;

        • characteristic 參數:指定存儲函數的特性,該參數的取值與存儲過程是一樣的;

        • routine_body 參數:表示 SQL 代碼的內容,可以用 BEGIN…END 來標示 SQL 代碼的開始和結束。

        注意:在具體創建函數時,函數名不能與已經存在的函數名重名。除了上述要求外,推薦函數名命名(標識符)為 function_xxx 或者 func_xxx。

        func_parameter 可以由多個參數組成,其中每個參數由參數名稱和參數類型組成,其形式如下: [IN | OUT | INOUT] param_name type;

        其中:

        • IN 表示輸入參數,OUT 表示輸出參數,INOUT 表示既可以輸入也可以輸出;

        • param_name 參數是存儲函數的參數名稱;

        • type 參數指定存儲函數的參數類型,該類型可以是 MySQL 數據庫的任意數據類型。

        例 1

        使用 CREATE FUNCTION 創建查詢 tb_student 表中某個學生姓名的函數,SQL 語句和執行過程如下:

        mysql> USE test; Database changed mysql> DELIMITER // mysql> CREATE FUNCTION func_student(id INT(11))     -> RETURNS VARCHAR(20)     -> COMMENT '查詢某個學生的姓名'     -> BEGIN     -> RETURN(SELECT name FROM tb_student WHERE tb_student.id = id);     -> END // Query OK, 0 rows affected (0.10 sec) mysql> DELIMITER ;

        上述代碼中,創建了 func_student 函數,該函數擁有一個類型為 INT(11) 的參數 id,返回值為 VARCHAR(20) 類型。SELECT 語句從 tb_student 表中查詢 id 字段值等于所傳入參數 id 值的記錄,同時返回該條記錄的 name 字段值。

        創建函數與創建存儲過程一樣,需要通過命令 DELIMITER // 將 SQL 語句的結束符由“;”修改為“//”,最后通過命令 DELIMITER ; 將結束符號修改成 SQL 語句中默認的結束符號。

        如果在存儲函數中的 RETURN 語句返回一個類型不同于函數的 RETURNS 子句中指定類型的值,返回值將被強制為恰當的類型。比如,如果一個函數返回一個 ENUM 或 SET 值,但是 RETURN 語句返回一個整數,對于 SET 成員集的相應的 ENUM 成員,從函數返回的值是字符串。

        拓展閱讀

        由于存儲函數和存儲過程的查看、修改、刪除等操作幾乎相同,所以我們不再詳細講解如何操作存儲函數了。

        查看存儲函數的語法如下:

        SHOW FUNCTION STATUS LIKE 存儲函數名; SHOW CREATE FUNCTION 存儲函數名; SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=存儲函數名;

        可以發現,操作存儲函數和操作存儲過程不同的是將 PROCEDURE 替換成了 FUNCTION。同樣,修改存儲函數的語法如下:

        ALTER FUNCTION 存儲函數名 [ 特征 ... ]

        存儲函數的特征與存儲過程的基本一樣。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 亚洲愉拍自拍欧美精品| 国产精品自在欧美一区| 亚洲精品欧美综合| 无码久久精品国产亚洲Av影片| 国产午夜精品理论片| 国产精品久久国产精品99盘| 亚洲AV日韩精品久久久久| 久久久久99精品成人片三人毛片| 国产精品久久波多野结衣| 精品人妻va出轨中文字幕| 亚洲国产精品无码久久久久久曰| 精品久久久久久久久久久久久久久| 久久精品国产影库免费看| 国产精品三级国产电影| 无码人妻精品一区二区三区99仓本 | 精品无码一区二区三区爱欲 | 国产午夜精品一区二区| 欧美精品1区2区| 精品视频第一页| 国产精品视频第一页| 91麻豆精品视频在线观看| 国产精品免费高清在线观看 | 日韩人妻无码精品一专区| 亚洲国产精品成人| 亚洲国产婷婷综合在线精品| 久久久久久极精品久久久 | 亚洲精品乱码久久久久66| 亚洲欧美日韩国产一区二区三区精品 | 亚洲AV永久无码精品一区二区 | 亚洲国产精品成人一区| 欧美日韩精品一区二区三区不卡 | 国产99久久久国产精品~~牛| 久久久久久久99精品免费观看| 你懂的国产精品| 精品综合久久久久久97超人| 久久国产精品成人免费| 欧美黑人巨大精品| 国产精品婷婷午夜在线观看| 国产精品极品| 另类国产精品一区二区| 亚洲国产精品综合久久一线|