Mysql:存儲過程


變量

系統變量

變量由系統提供,不是用戶定義,屬於服務器層面

全局變量
查看所有的全局系統變量:
SHOW GLOBAL VARIABLES
Variable_name                            Value                                                           
​
---------------------------------------  ----------------------------------------------------------------
​
auto_increment_increment                 1                                                               
auto_increment_offset                    1                                                               
automatic_sp_privileges                  ON                                                              
back_log                                 50                                                              
basedir                                  D:\Program Files (x86)\mysql\                                   
binlog_cache_size                        32768                                                           
bulk_insert_buffer_size                  8388608                                                         
character_set_client                     utf8                                                            
character_set_connection                 utf8                                                            
character_set_database                   utf8                                                            
character_set_filesystem                 binary                                                          
character_set_results                    utf8     
查看指定的全局變量

例如查看隔離級別:

SELECT @@tx_isolation
@@tx_isolation   
-----------------
REPEATABLE-READ  

全局變量修改后,其他的連接的變量的值也會改變

作用域:服務器每次啟動將為所有的全局變量賦初始值,針對於所有的會話(連接)有效,但不能跨重啟(配置文件內的除外)

會話變量

作用域:僅僅針對於當前會話(連接)有效

查看會話變量
SHOW SESSION VARIABLES
Variable_name                            Value                                                           
​
---------------------------------------  ----------------------------------------------------------------
​
auto_increment_increment                 1                                                               
auto_increment_offset                    1                                                               
automatic_sp_privileges                  ON                                                              
back_log                                 50                                                              
basedir                                  D:\Program Files (x86)\mysql\                                   
binlog_cache_size                        32768                                                           
bulk_insert_buffer_size                  8388608                                                         
character_set_client                     utf8                                                            
character_set_connection                 utf8                                                            
character_set_database                   utf8                                                            
character_set_filesystem                 binary    

自定義變量

用戶變量
作用域

針對於當前會話有效,與會話變量的作用域有效

聲明

聲明時必須初始化,格式是 :

set @變量名=值;或
set @變量名:=值;或
select @變量名:=值
賦值

方式一:

set @變量名=值;或
set @變量名:=值;或
select @變量名:=值

方式二:

select 字段 into 變量名
from 表名
SELECT COUNT(1) INTO @studentNumber
FROM student
使用(查看用戶變量的值)
SELECT @studentNumber
局部變量
作用域

僅僅在定義它的begin end中有效,且只能放在begin end中的第一句話

聲明
declare 變量名 類型;
declare 變量名 類型 default 值(聲明變量的同時進行賦值)
賦值
set 變量名=值;或
set 變量名:=值;或
select @變量名:=select 字段 into 變量名
from 表名
使用
select 局部變量名
案例
用戶變量
聲明兩個變量並賦初始值,求和
SET @a=1;
SET @b=2;
SET @sum= @a+@b;
SELECT @sum;

結果

@sum    
--------
3     

存儲過程和函數

含義

一組預編譯好的SQL語句的集合

好處

提高代碼的可重用性

簡化操作

減少了編譯次數和數據庫服務器的連接次數,提高了效率

創建

創建語法
create procedure 存儲過程名(參數列表)
begin
    存儲過程體
end
參數列表

參數模式 參數名 參數類型

參數模式
IN:該參數作為輸入,需要調用方傳入值1

OUT:該參數作為輸出,可以作為返回值

INOUT:該參數既可以作為輸入也可以作為輸出,既可以輸入值也可以返回值
調用語法

CALL 存儲過程名(實參列表)

注意事項

如果存儲過程體只有一句話,begin end可省略

存儲過程體中的每條SQL語句的結尾必須加分號

存儲過程的結尾可以使用 DELIMITER重新設置

案例

無參

進入docker容器mysql窗口並登錄,將書寫的存儲過程語句粘貼進去運行,運行成功后可以在可視化工具中看到存儲過程

delimiter $
create procedure myInsert()
begin 
    insert into student (birthday,classno,phone,sex,sname,score) values
    ('1998-11-11','202001','18739396145','nv','tom',501.0),
    ('1998-11-11','202001','18739490123','nan','jack',503.0);
end $

調用存儲過程

 call myInsert()$

執行查詢語句

| 2020043105 | 1998-11-11 | 202001  | 18739396145 | nv   | tom       |   501 |
| 2020043106 | 1998-11-11 | 202001  | 18739490123 | na   | jack      |   503 |
+------------+------------+---------+-------------+------+-----------+-------+
有輸入參數
案例一
delimiter $
create procedure snameIn(IN name varchar(8))
begin
    select sname,score.*
    from student  
    left join score on  student.studentno =score.studentno
where student.sname=name;
end $

調用存儲過程

call snameIn('王石')$

案例二
DELIMITER $
CREATE PROCEDURE login(IN username VARCHAR(12),IN passwd VARCHAR(6))
BEGIN
DECLARE result INT DEFAULT 0;
SELECT COUNT(*) INTO result
FROM login
WHERE login.account=username
AND login.password=passwd;
​
SELECT IF(result>0,'成功','失敗');
END $

有輸出參數
返回一個字段的值
DELIMITER $
CREATE PROCEDURE shuchu(IN NAME VARCHAR(8),OUT finall DOUBLE)
BEGIN
    SELECT score.finall INTO finall
    FROM student  
    LEFT JOIN score ON student.studentno=score.studentno
        WHERE student.sname=NAME;
END $
CALL shuchu('zhai',@fin)$
SELECT @fin$

返回多個字段的值

需要注意一個問題:下面的書寫select並分別給兩個輸出參數賦值的寫法是不對的

DELIMITER $
CREATE PROCEDURE outputTwo(IN NAME VARCHAR(8),OUT finall DOUBLE,OUT usually DOUBLE)
BEGIN
    SELECT score.finall INTO finall,score.usually INTO usually
    FROM student  
    LEFT JOIN score ON student.studentno=score.studentno
        WHERE student.sname=NAME;
END $

需要將兩個賦值語句合並為一次賦值

DELIMITER $
CREATE PROCEDURE outputTwo(IN NAME VARCHAR(8),OUT finall DOUBLE,OUT usually DOUBLE)
BEGIN
    SELECT score.finall,score.usually INTO finall,usually
    FROM student  
    LEFT JOIN score ON student.studentno=score.studentno
        WHERE student.sname=NAME;
END $

先調用:

查看結果:

INOUT模式
CREATE PROCEDURE inouttest(INOUT a INT,INOUT b INT)
BEGIN
    SET a=a*2;
    SET b=b*2;
END $

刪除

存儲過程的刪除
drop procedure 存儲過程名$

查看

查看存儲過程信息
SHOW CREATE PROCEDURE 存儲過程名稱

 

 

總結:

DELIMITER:相當於定義一個結束符,在默認情況下遇到;后就會默認結束


免責聲明!

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



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