mysql-8.0 函數和存儲過程


函數和存儲過程

1.創建一個存儲過程
delimiter //
create procedure s1(in x int,out y int)
begin
select count(*) into y from students where sid >x;
end
//
delimiter ;
創建一個存儲過程,並且定義兩個參數,
x是輸入參數.在進行存儲過程調用的時候需要輸入相應的參數.
y是輸出參數.存儲過程執行完成后輸出一個返回值.存儲到y中.
其中x和y都需要人為進行定義.一般在調用的時候輸入參數可以是任意整數值,輸出參數為一個變量,
call s1(1,@a);
調用s1存儲過程.1傳入存儲過程中,並且將輸出結果存到@a中.
select @a;
查看輸出結果@a;
2.存儲過程中可以傳入和輸出多個參數.
 show create procedure cc;
+-----------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| Procedure | sql_mode | Create Procedure | character_set_client | collation_connection | Database Collation |
+-----------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
| cc | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | CREATE DEFINER=`root`@`%` PROCEDURE `cc`(IN `a` int,IN `aa` int,OUT `b` int,OUT `bb` int)
BEGIN
	select count(*) into b from students WHERE sid > a;#Routine body goes here...
	select count(*) into bb from students WHERE sid > aa;
END | utf8 | utf8_general_ci | utf8mb4_0900_ai_ci |
+-----------+-----------------------------------------------------------------------------------------------------------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+--------------------+
1 row in set (0.00 sec)
調用格式 
call cc(1,2,@b,@bb);
查看
select @b,@bb;
 
2.創建一個函數
delimiter //
create function hello(s char(20))
returns char(50)
begin
return concat('hello',s,'!');
end
//
delimiter ;
注意:因為輸入參數是字符串類型.所以在進行調用的時候應該添加引號"",來進行傳參.
mysql> select hello("hello");
+----------------+
| hello("hello") |
+----------------+
| hellohello! |
+----------------+
1 row in set (0.00 sec)
3.創建一個帶有case when 語句的 存儲過程.
delimiter //
create procedure exp_case(v_sid int)
begin
declare v int default 1;
select gender into v from students where sid=v_sid;
case v
when 0 then update students set gender=1 where sid= v_sid;
when 1 then update students set gender=0 where sid = v_sid;
else
update students set gender = -1 where sid = v_sid;
end case;
end;
//
delimiter ;
注意:創建的時候case when 是配對出現的.
或者使用下面的方式將v卸載case內部進行條件的篩選,
delimiter //
create procedure exp_case(v_sid int)
begin
declare v int default 1;
select gender into v from students where sid=v_sid;
case 
when v = 0 then update students set gender=1 where sid= v_sid;
when v = 1 then update students set gender=0 where sid = v_sid;
else
update students set gender = -1 where sid = v_sid;
end case;
end;
//
delimiter ;
當v = 1的時候和當v = 0 的時候然后做哪些操作.
4.流程控制語句 if語句
在存儲過程或者函數中可以是用if流程控制語句.用來進行輸入參數的匹配.
if語句中的開始和結束是成對出現的.
if和 end if;
delimiter //
create procedure dd1 ( in s int);
BEGIN
if s = 3 then select * from students where sid <= s;
ELSEIF s = 4 then select * from students where sid = s;
ELSEIF s = 5 then select * from students where sid >= s;
else select * from students ;
end if;
END
//
delimiter ;
流程控制語句用來根據數據條件參數進行匹配.
5.使用存儲過程插入100000條測試數據.
delimiter //
create procedure proc1();
BEGIN
DECLARE n int DEFAULT 1;
定義默認n的初始值是1,
while n <= 100000 DO
如果n< 100000那么就插入一條數據.
INSERT into students1 VALUES(n,'mike',1,1);
插入指定數據
set n = n+1;
數據插入后 n=n+1
end WHILE;
結束while循環
END
//
delimiter ;
使用while 語句循環插入100000條測試語句;
6.生成帶有隨機數的存儲過程.
delimiter //
create crocedure proc2();
begin
declare n int default 1;
declare v_gender_id int;
declare v_dept_id int;
while n < 10000 do
set v_gender_id = round(rand());
set v_dept_id = floor(rand()*3+1);
insert into students2 values(n,'mike',v_gender_id,v_dept_id);
set n=n+1;
end while;
end;
//
delimiter ;
定義n初始值是1
定義v_gender_id=int類型
定義v_dept_id = int 類型
創建循環 當n< 10000的時候循環如下內容.
將v_gender_id 賦值成01的數值.其中rand()表示隨機任意0-1之間的小數.round(rand()),表示將隨機出來的小數進行四舍五入到整數部分.
同理將v_dept_id 賦值成小於等於(rand()*3+1)的最大整數值.其中rand()最大的小數會小於1,那么*3就會無限接近於3,+1的話就會接近於4,
如果取出小於等於這個數字的最大整數的話就是3.
使用insert 插入數據(這個就不用多說了.)
數據插入完成后將n賦值成 n+1.
結束while循環.
結束存儲過程.
7. 定義多少個變量就可以在存儲過程中 into 多少個被賦值變量.
delimiter //
create procedure p1(v_sid int)
begin
select sum(score),avg(score) into @x,@y from score where sid = v_sid;
select @x,@y;
end
//
delimiter ;
查詢出來的值,可以對應進行賦值操作.
8.
 
9.


免責聲明!

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



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