SQL編程:存儲過程、觸發器、函數(實例基於MySQL5.7.12)

SQL編程基礎

A.編程環境:

 即存儲過程、觸發器和函數中進行SQL編程,所以有些語法並不能應用於普通的SQL應用場景,如命令行直接SQL查詢。

B.變量聲明:

(1)全局變量

聲明:set @變量名 = 值;
讀取:select @變量名
在這裏插入圖片描述
賦值

  • set @變量名=表達式;
  • select @變量名:=表達式;-- 會輸出結果集
  • select 表達式 into @變量名;–不輸出結果集
(2)普通變量

聲明:declare 變量名 類型 [default 默認值];
讀取、賦值:同上

C.語句塊

[lable_name:] BEGIN

    // 代碼

   END [lable_name]

D.邏輯語句

MySQL支持兩種判斷,第一個是if判斷,第二個 case判斷

if語法
單分支
if 條件 then
    //代碼
end if;

雙分支
if 條件 then
    代碼1
else
    代碼2
end if;

多分支
if 條件 then
    代碼1
elseif 條件 then
    代碼2
else
    代碼3
end if;

E.case語句

語法1:簡單case函數

case sex
  when '1' then '男'
  when '2' then '女’
else '其他' end

語法2:case搜索函數

case when sex = '1' then '男'
         when sex = '2' then '女'
else '其他' end

F.循環語句

1.loop

語法:

lable_name:loop
	...
    leave lable_name --退出循環
    ...
end loop;
2.REPEAT

語法:

[lable_name:] REPEAT
    statement_list
UNTIL search_condition
END REPEAT [lable_name]

實例:

delimiter //
CREATE PROCEDURE ps_repeat ( p1 INT ) BEGIN
	SET @x = 0;
	REPEAT
			SET @x = @x + 1;
		UNTIL @x > p1 
	END REPEAT;
END //
3.while

語法:

while 條件 do
    //代碼
end while;

實例:

delimiter //
CREATE PROCEDURE ps_while(p1 INT)
BEGIN
  WHILE p1 > 0 DO
    SET p1 = p1 - 1;
  END WHILE;
END//
4.遊標

語法:
1.定義遊標:declare 遊標名 cursor for select語句;
2.打開遊標:open 遊標名;
3.獲取結果:fetch 遊標名 into 變量名[,變量名];
4.關閉遊標:close 遊標名;
實例:

delimiter //
create procedure p3()
begin
    declare value1 int;
    declare value2 int;
    -- 聲明遊標
    declare mc cursor for select id,name from old_tab;
    -- 打開遊標
    open mc;
    -- 獲取結果
    fetch mc into value1,value2;
    -- 這裏是爲了顯示獲取結果
    select value1,value2;
    -- 關閉遊標
    close mc;  
end//

call p3

G.存儲過程

 存儲過程(Stored Procedure)是一組爲了完成特定功能的SQL 語句集。存儲在數據庫中,經過第一次編譯後再次調用不需要再次編譯。可設定只有某些用戶才具有對指定存儲過程的使用權,這展現了其安全性。
(1)查看現有的存儲過程。
語法:

SHOW  PROCEDURE  STATUS  [ LIKE ' pattern ' ] ;

實例:

show procedure status from mysql like '%p1%'

(2)創建存儲過程
語法:
注意:delimiter是聲明定界符,用以區分sql語句(;)和存儲過程(//)結尾定界符
參數說明:參數分爲 in 輸入函數(默認) out輸出函數 inout輸入輸出函數

delimiter //
CREATE PROCEDURE ps_name (參數1,參數2,參數3,...)
BEGIN
  sql代碼
END//

實例:

delimiter //
CREATE PROCEDURE ps_while(p1 INT)
BEGIN
  WHILE p1 > 0 DO
    SET p1 = p1 - 1;
  END WHILE;
END//

 存儲過程的參數分爲輸入參數(in)、輸出參數(out)、輸入輸出參數(inout),默認是輸入參數。如果存儲過程中就一條語句,begin和end是可以省略的。

說明:

  • 存儲過程中,可有各種編程元素:變量,流程控制,函數調用;

  • 還可以有:增刪改查等各種mysql語句;

  • 其中select(或show,或desc)會作爲存儲過程執行後的"結果集"返回;

  • 形參可以設定數據的"進出方向":

(3)調用存儲過程

語法:call 存儲過程()

(4)刪除存儲過程

語法:drop procedure [if exists] 存儲過程名

(5)存儲過程典型案例

1.各種類型輸入輸出參數
實例:
在這裏插入圖片描述
結過說明:除了in,傳入的參數@a沒有改變以外,out和inout都改變了傳入的參數@b,@c

2.簡單查詢
實例:
在這裏插入圖片描述

3.插入數據
實例:

delimiter //
drop procedure if exists insert1;
create procedure insert1()
begin
DECLARE i int;
set i = 0;
WHILE i<100 do 
insert into tab1(id,username) values(i,CONCAT('username',i));
set i = i+1;
end while;
end//

4.遊標遍歷插入
實例:

tip:	declare continue handler for not found set flag = 1;

delimiter //
create procedure p3()
begin
    declare value1 int;
    declare value2 int;
		declare value3 varchar(32);
		declare flag int default 0;
    -- 聲明遊標
    declare mc cursor for select * from old_tab;
		declare continue handler for not found set flag = 1;
	
    -- 打開遊標
    open mc;
		l1:loop
    fetch mc into value1,value2,value3;
		if flag=1 then
			leave l1;
			end if;
      insert into new_tab values(value2,value3,value1);
    -- 這裏是爲了顯示獲取結果
    -- 關閉遊標
		end loop;
    close mc;  
			
end//

call p3

5.綜合實例:變量,select into 變量賦值,遊標,循環
實例:

delimiter //
create procedure selecttab1()
begin
DECLARE i int;
declare username VARCHAR(255);
-- 定義遊標
declare selecttab1_cursor CURSOR for select id, username from tab1 ;
-- 打開遊標
open selecttab1_cursor;
-- 首次填充數據到變量
FETCH next from selecttab1_cursor into i,username;
-- 循環遊標
read_loop: LOOP
select i,username;
-- 再次填充數據到變量
FETCH next from selecttab1_cursor into i,username;
END LOOP;
-- 關閉遊標
close selecttab1_cursor;
end//

6.存儲過程動態執行sql

delimiter //
create procedure dongtaisql()
begin
declare v_sql varchar(500); -- 需要執行的SQL語句 
DECLARE i int;
set i = 0;
WHILE i<10 do 
set v_sql= concat('insert into tab2(id,username) values(',i,', \'username',i,'\');'); 
set @v_sql=v_sql; -- 注意很重要,將連成的字符串賦值給一個變量(可以之前沒有定義,但要以@開頭)
prepare stmt from @v_sql; -- 預處理需要執行的動態SQL,其中stmt是一個變量 
EXECUTE stmt; -- 執行SQL語句 
deallocate prepare stmt; -- 釋放掉預處理段 
set i = i+1;
end while;
end//

H.函數

(1)創建函數
語法:

create function 函數名(參數,參數的類型) returns 返回值類型

begin

    //代碼

end

實例:

create function fun1() returns int
begin 
    declare c int;
    select id from old_tab into c;
    return c;
end;

(2)mysql內置函數
參考:mysql函數參考手冊

I觸發器

(1)簡介

  • 觸發器是一個特殊的存儲過程,它是MySQL在insert、update、delete的時候自動執行的代碼塊。

  • 觸發器必須定義在特定的表上。

  • 自動執行,不能直接調用,

  • 作用:監視某種情況並觸發某種操作。

(2)觸發器四要素
在這裏插入圖片描述
(4)創建觸發器

語法:

create trigger trigger_name

after/before insert /update/delete on 表名

for each row

begin

// 代碼

end

實例:

delimiter // 
CREATE TRIGGER tr_new_tab_insert 
after insert on new_tab 
for Each row
begin 
insert into old(id,name,valid) values(new.id,new.name,new.valid); 
end //

提示:new.字段名 可以訪問新值,old.字段名可以訪問舊值。

(5)查看觸發器

語法: show triggers

(6)刪除觸發器

語法:drop trigger trigger_name

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章