1. 程式人生 > >MySQL 第八篇:自定義函式、儲存過程、遊標

MySQL 第八篇:自定義函式、儲存過程、遊標

本篇內容由猿道教育的課程內容整理而來。
我把MySQL的內容整理成9篇部落格,學完這9篇部落格雖不能說能成為大神,但是應付一般中小企業的開發已經足夠了,有疑問或建議的歡迎留言討論。

自定義函式

一、函式的概念與定義

1、理解函式

函式可以看作是一個加工作坊,這個加工作坊接收呼叫者傳遞過來的原料(傳遞的引數),然後將這些原料加工處理成產品(函式的返回值)再把產品返回給呼叫者。

2、建立語法(建議自定義函式以fun_字首)

create function 函式名(引數1,引數2....) returns 返回值的資料型別
[函式型別]
begin
函式體
return
語句; end;
-- 將日期轉換成2017年10月29日
-- DELIMITER $$的作用是宣告sql語句以$$結束,也可以把$$換成其他符號,在這裡可以省略,如果是命令列執行就一定要加上。
DELIMITER $$
create function fun_dateToStr(mdate datetime)returns varchar(50)
BEGIN
    -- 宣告一個變數 使用declare 變數名 資料型別 預設值
    declare str varchar(50) default '';
    -- 使用set 對變數進行賦值
    set str = DATE_FORMAT(mdate,'%Y年%m月%d日'
);
return str; end $$ DELIMITER ;
-- 使用函式 
select *,fun_dateToStr(NOW()) from students

二、自定義函式

1、DELIMITER

定義一個結束識別符號,因為MySQL預設是以分號作為SQL語句的結束符的,而函式體內部要用到分號,所以會跟預設的SQL結束符發生衝突,所以需要先定義一個其他的符號作為SQL的結束符;

2、分支結構

IF 條件 THEN 語句 ELSEIF 條件 THEN 語句 ELSE 語句 END IF;
DELIMITER $$
CREATE FUNCTION
FUN_getAgeStr(age int) RETURNS varchar(20) BEGIN declare results varchar(20);
IF age<16 then set results = '小屁孩'; ELSEIF age <22 THEN set results = '小鮮肉'; ELSEIF age <30 THEN set results = '小青年'; ELSE SET results = '大爺'; END IF; RETURN results; end $$ DELIMITER ; select *,FUN_getAgeStr(age) from students;

3、迴圈結構

迴圈名:loop end loop 迴圈名 WHILE,REPEAT
DELIMITER $$
create function fun_loop(nums int) returns varchar(255)
BEGIN
	DECLARE i int default 0;
	DECLARE result varchar(255) default '';
	-- 迴圈的開始,冒號前面是一個迴圈名
	colorLoop:LOOP
	SET i = i+1;
	SET result = concat(result,'Color  ');
	-- 跳出迴圈
	IF i >= nums THEN
		LEAVE colorLoop;
	END IF;
	-- 結束迴圈
	END LOOP colorLoop;
	return result;
end $$
DELIMITER ;
select fun_loop(4)

4、刪除自定義函式

DROP FUNCTION IF EXISTS 自定義函式名
drop function if exists FUN_getAgeStr;

5、檢視自定義函式定義

SHOW CREATE FUNTION 自定義函式名;

6、檢視自定義函式狀態

SHOW FUNCTION STATUS [LIKE]

儲存過程

一、建立語法(建議自定義函式以pro_字首)

create procedure 儲存過程名(引數1,引數2…)
[儲存過程選項]
begin
儲存過程語句塊
end;
說明:

  • IN 輸入引數:表示該引數的值必須在呼叫儲存過程時指定,在儲存過程中修改該引數的值不能被返回,為預設值。
  • OUT 輸出引數:該值可在儲存過程內部被改變,並可返回。
  • INOUT 輸入輸出引數:呼叫時指定,並且可被改變和返回。
create procedure pro_dealStudents(in s_id varchar(50))
BEGIN
    set @s_id = s_id;
    select * from students s where [email protected]_id;
end;
-- 使用儲存過程
CALL pro_dealStudents('J1604028');

二、儲存過程與函式的區別

儲存過程是使用者定義的一系列sql語句的集合,涉及特定表或其它物件的任務,使用者可以呼叫儲存過程,而函式通常是資料庫已定義的方法,它接收引數並返回某種型別的值並且不涉及特定使用者表。
儲存過程和函式存在以下幾個區別:
1)一般來說,儲存過程實現的功能要複雜一點,而函式的實現的功能針對性比較強。儲存過程,功能強大,可以執行包括修改表等一系列資料庫操作;使用者定義函式不能用於執行一組修改全域性資料庫狀態的操作。
2)對於儲存過程來說可以返回引數,如記錄集,而函式只能返回值或者表物件。函式只能返回一個變數;而儲存過程可以返回多個。儲存過程的引數可以有IN,OUT,INOUT三種類型,而函式只能有IN類~~儲存過程宣告時不需要返回型別,而函式宣告時需要描述返回型別,且函式體中必須包含一個有效的RETURN語句。
3)儲存過程,可以使用非確定函式,不允許在使用者定義函式主體中內建非確定函式。
4)(mysql除外)儲存過程一般是作為一個獨立的部分來執行( EXECUTE 語句執行),而函式可以作為查詢語句的一個部分來呼叫(SELECT呼叫),由於函式可以返回一個表物件,因此它可以在查詢語句中位於FROM關鍵字的後面。 SQL語句中不可用儲存過程,而可以使用函式。

遊標

遊標本質上是一種能從select結果集中每次提取一條記錄的機制,因此遊標與select語句息息相關。

一、使用遊標的步驟:

1.宣告遊標 declare 遊標名 cursor for select語句。
2.開啟遊標 open 遊標名。
3.從遊標中提取資料 fetch 遊標名 into 標量(需配合迴圈使用)。
4.關閉遊標 close 遊標名稱。
注意:
1.變數名的個數必須與宣告遊標時使用的select語句結果集中的欄位個數保持一致
2.fetch 在執行過程中如果無法提取資料會產生 “ERROR 1329(0200):Nodata to FETCH”,這樣我們可以自定義1329錯誤來結束遍歷。

create PROCEDURE pro_students()
BEGIN
    declare s_age int ;
    declare s_no varchar(50);
    declare DONE INT DEFAULT 0;
    declare cur CURSOR for select age,s_id from students;
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET DONE=1;
    open cur;
    fetch cur into s_age,s_no;
    repeat 
            SET s_age = s_age+1;
        select s_age;
        update students s set s.age = s_age where s.s_id=s_no;
    fetch cur into s_age,s_no;
    UNTIL DONE END REPEAT;
close cur;
end;
CALL pro_students();

相關推薦

MySQL 定義函式儲存過程遊標

本篇內容由猿道教育的課程內容整理而來。 我把MySQL的內容整理成9篇部落格,學完這9篇部落格雖不能說能成為大神,但是應付一般中小企業的開發已經足夠了,有疑問或建議的歡迎留言討論。 自定義函式 一、函式的概念與定義 1、理解函式 函式可以看作是

精通Spring Boot——定義認證流程

前兩篇簡單介紹了一下使用Spring Security 使用Http Basic登入,以及Spring Security如何自定義登入邏輯。這篇文章主要介紹如何使用handler來定義認證相關的流程。 先做一些自定義的操作,如配置自定義登入頁,配置登入請求URL等。 當我們使用Spring Security時

MySQL定義函式儲存過程的區別

  自定義函式和儲存過程的區別: 1)一般來說,儲存過程實現的功能要複雜一點,而函式的實現的功能針對性比較強。儲存過程,功能強大,可以執行包括修改表等一系列資料庫操作;使用者定義函式不能用於執行一組修改全域性資料庫狀態的操作。 2)對於儲存過程來說可以返回引數,如記錄集,而函式只能返回值或者表物件。函式只能

Android特效定義Gallery實戰(仿網易) .

Android系統提供了一個Gallery畫廊控制元件,在專案很多時候都會用到Gallery,比如新浪首頁的廣告,網易看客戶端首頁等隨處可見,今天我自己定義了一個仿網易的Gallery與大家共享。      首先請看效果圖:                        

Web開發之-JSP學習總結-定義標籤總結

一、自定義標籤開發步驟—以高仿<c:if test=""></c:if>標籤為例 1、編寫一個普通的java類,繼承SimpleTagSupport類,叫標籤處理器類。並且覆蓋doTag方法 /** * 標籤處理器類 * 1)繼承

MySQL全面瓦解18定義函式

定義 我們之前學習了MySQL的內建函式,非常豐富,滿足了我們對資料操作的大部分需求。 但是如果有一些複雜的業務邏輯在資料庫層面就可以完成,無需在程式層面完成的時候,這時候就可以寫成MySQL自定義函式。 所以,函式是指 一組預編譯好的sql語句集合,理解成批處理語句。類似於C# 中的方法,並且必須有返回值。

學會使用MySQL定義函式儲存過程

一、快速瞭解什麼是儲存過程和函式?   儲存過程和函式是事先經過編譯並存儲在資料庫中的一段 SQL 語句的集合,呼叫儲存過程 和函式可以簡化應用開發人員的很多工作,減少資料在資料庫和應用伺服器之間的傳輸,對 於提高資料處理的效率是有好處的。   在對儲存過程或函式進行操作時,需要

MySQL利用定義函式儲存過程建立海量表,並使用索引優化

昨天學習韓順平老師的視訊時明白了上一章explain的意義,為了自己的聯絡,我學著建立了一個海量表,供自己練習使用。 程式碼如下: #建立表DEPT CREATE TABLE dept( /*部門表*/ deptno MEDIUMINT UN

SQl中的UDF(使用者定義函式)與儲存過程的區別優點

UDF定義: 和儲存過程很類似,使用者自定義函式是一組有序的T_SQL語句,這些語句被預先優化和編譯,並且可以作為一個單元來進行呼叫。UDF和儲存過程的主要區別在於結果的返回方式。為了能支援多種的不同的返回值,UDF比儲存過程有更多的限制。 UDF和儲存過程的具體區別: 儲

Python 語言學習 函式2(引數lamdba和函式屬性)

函式的引數是引數暴露給外部的介面,向函式傳遞引數,可以控制函式的流程,函式可以0個、1個或多個引數;在Python中向函式傳參,使用的是賦值方式。 一,傳遞引數 引數是通過賦值來傳遞的,傳遞引數的特點是: 引數的傳遞是通過自動把物件賦值給函式的本地變數名來實現的, 在函式內部的變數名的賦值不會

5天定義建構函式,建立物件(簡單工廠模式)

面向物件 封裝、繼承、多型(抽象性) js是一門基於物件的語言 萬物皆物件 物件:有屬性和方法,具體特指的某個事物 物件:有特徵和行為,具體特指的某一事物 javaScript 中的所有事物都是物件:字串、數值、陣列、函式... 此外,Ja

SpringBoot十六定義starter

作者:追夢1819 原文:https://www.cnblogs.com/yanfei1819/p/11058502.html 版權宣告:本文為博主原創文章,轉載請附上博文連結! 前言   這一段時間專案趕進度,故該系列部落格更新沒有之前那麼頻繁,望諒解。   SpringBoot 用起來方便,它預設集成了

面向對象編程

-1 eight 常用 attr recent 建立 動作 空間 過程 OOP介紹 一、什麽是OOP 1、編程的發展已經從簡單控制流中按步的指令序列進入到更有組織的方式中 2、結構化的或過程性編程可以讓我們把程序組織成邏輯塊,以便重復或重用 3、面向對象編增強了

python基礎_8 面向對象與網絡編程

pro size 賬單 socket 基礎 發生 多態 proc client 本篇內容 接口與歸一化設計 多態與多態性 封裝 面向對象高級 異常處理 網絡編程 一、 接口與歸一化設計 1.定義 (1)歸一化讓使用者無需關心對象的類是什麽,只需要知道這些對象都具備某

Linux實戰CentOS7.3下Nginx虛擬主機配置實戰(基於端口)

基於 sub 主機配置 centos7.3 entos ada .com 版本 fad 個人筆記分享(在線閱讀): http://note.youdao.com/noteshare?id=9a8b56ec54800ccf197eb6c23de55a85&sub=2E3048

JSP定義標簽之傳統標簽】

abstract error 重寫 ren flush zhong pwrite out b2c 為什麽要使用自定義標簽? JSTL標簽庫只提供了簡單的輸出等功能,沒有實現任何的HTML代碼封裝,並且某些復雜類型轉換,或者邏輯處理的時候,JSTL標簽庫完成不了,需要自定義標

Django 【定義驗證規則和中間件

表達式 主動 mixin tex choice direct request lock test 一、Form基本使用 類 字段 is_valid() cleaned_data errors 字段參數: m

Django 【定義的分頁器組件

ota pen mod href render art 頁碼 .get led 一、分頁的實現與使用 class Pagination(object): """ 自定義分頁 """ def __init__(self,current_pa

grub加密

grub.conf 進入 nbsp 單用戶 密碼 第八篇 方法 ima bsp 1.grub加密是為了阻止在開機時用戶進入單用戶模式,任意鍵進入下圖,【e】進入修改init值=1 加密方法: (1)比如密碼123456,生成它的密文方法: (2)在/etc/grub.

ZTree操作總結

花了一個多星期,終於完成了這個完整的功能,今天週五是時候總結下加深理解了。 專案要實現的功能: 將樹形目錄釋出到釋出庫, 若是根目錄,沒有釋出,連同自己和下面所有的子目錄們全部發布; 不是根目錄,判斷父目錄是否已經發布,未釋出,連同自己全部發布;已釋出,追加 轉化為節點就是:將節點複製另