1. 程式人生 > >資料庫:儲存程式

資料庫:儲存程式

目錄

一、什麼是儲存程式?

二、為什麼使用儲存程式?

三、儲存程式分類

四、儲存過程

1.儲存過程引數的3中模式

2.流程控制語句

3.示例程式碼

五、儲存函式

六、觸發器


一、什麼是儲存程式?

儲存程式指的是一組儲存和執行在資料庫伺服器端的程式。儲存程式總是在伺服器的程序或執行緒的記憶體中執行的。

二、為什麼使用儲存程式?

優點:

  • 執行效率高;
  • 簡化開發。

缺點:

  • 佔用伺服器端資源;
  • 資料遷移時需跟著一併遷移。

三、儲存程式分類

儲存程式分為3類,分別是:

  • 儲存過程:有輸入和輸出引數,可以執行一組sql語句。
  • 儲存函式:有一個返回值,可以執行一組sql語句,可以傳遞引數。
  • 觸發器:執行一組sql語句,由事件驅動自動執行,不能傳遞引數。

四、儲存過程

1.儲存過程引數的3中模式

in:輸入,預設

out:輸出

inout:輸入輸出

2.流程控制語句

2.1 條件語句

if 條件 then
    #程式碼,分號結尾
elseif 條件 then
    #程式碼,分號結尾
else
    #程式碼,分號結尾
end if;

2.2 迴圈語句

# while ... do ... end while;
while 條件 do
    #程式碼,分號結尾
end while;
#loop##########################
#lip:是給當前loop迴圈取得別名
別名:loop
    if 條件 then
        leave 別名;#結束迴圈
    end if;
end loop;
#repeat#########################
repeat
    until 條件;#條件滿足結束迴圈
end repeat;

3.示例程式碼

建立關鍵詞:procedure

呼叫關鍵詞:call

#儲存過程宣告及呼叫
#根據員工的姓名查詢職位資訊
delimiter //;#設定分隔符,以//作為一句程式碼的結束標誌
#宣告儲存過程關鍵詞procedure,引數模式預設是in
create procedure sel_job(name varchar(20))
begin
    select job from emp where ename = name;
end;
call sel_job('scott');#呼叫儲存過程

#根據員工的姓名查詢職位資訊
delimiter //;
#第一個引數模式是in,第二個引數模式是out
create procedure sel_job2(name varchar(20), out e_job varchar(20))
begin
    #關鍵詞into,可將jobde值賦給變數e_job
    select job into e_job from emp where ename = name;
end;
call sel_job2('scott', @e_job);#@e_job 定義一個臨時變數來接收傳出來的值
select @e_job;

#根據員工的姓名查詢職位資訊
delimiter //;
#宣告儲存過程關鍵詞procedure,引數模式預設是in
create procedure sel_job3(inout name_job varchar(20))
begin
    #以變數name_job的值作為檢索條件,into將值賦給變數name_job
    select job into name_job from emp where ename = name_job;
end;
set @name='scott';#定義name變數並賦值
call sel_job3(@name);#使用變數
select @name;

#儲存過程語法:if / 迴圈
#if:成績分級 80 A /60 B  /C
create procedure score(sc int)
begin
    declare v_level varchar(20);#變數宣告
    #set v_level = 'A';#變數賦值
    if sc >= 80 then
        set v_level = 'A';
    elseif sc >= 60 then
        set v_level = 'B';
    else
        set v_level = 'C';
    end if;
    select v_level;#展示變數值
end;
call score(89);
call score(69);

#迴圈語句:1+2+…+100
delimiter //;
create procedure calc()
begin
    declare i int;
    declare sum int;
    set i = 1;
    set sum = 0;
    while i <= 100 do
        set sum = sum + i;
        set i = i + 1;
    end while;
    select sum;
end;
call calc();

delimiter //;
create procedure calc2()
begin
    declare i int;
    declare sum int;
    set i = 1;
    set sum = 0;
    #lip:是給當前loop迴圈取得別名
    lip:loop
        set sum = sum + i;
        set i = i + 1;
        if i > 100 then
            leave lip;
        end if;
    end loop;
    select sum;
end;
call calc2();

delimiter //;
create procedure calc3()
begin
    declare i int;
    declare sum int;
    set i = 1;
    set sum = 0;
    repeat
        set sum = sum + i;
        set i = i +1;
        until i > 100;
    end repeat;
    select sum;
end;
call calc3();

五、儲存函式

建立關鍵詞:function

呼叫關鍵詞:作為sql語句的一部分進行呼叫

示例程式碼:

#儲存函式(根據僱員的編號查詢名稱)
delimiter //;
create function func_emp(eno int)
returns varchar(20)
deterministic #確定的,如果函式多次輸入同一個引數值,得到的結果是一致的,表示確定的
begin
    declare name varchar(20);
    select ename into name from emp where epmno = eno;
    return name;
end;
#呼叫:作為sql語句的一部分進行呼叫
select func_emp(7788);

六、觸發器

關鍵關鍵詞:tigger

#觸發器
#刪除student表記錄,將刪除記錄新增到bak表中。
#建立備份表
create table stu_bak select * from student where 1=0;
#定義觸發器
delimiter //;
create tigger tri_stu
#事件包括這些:before|after insert|update|delete
after delete
on student for each row #行級觸發器
begin			        #封裝了值的物件:old | new 
    insert into stu_bak values(old.sid,old.sname,old.cid);
end;
#開始觸發
delete from student where sid=5;