資料庫:儲存程式
阿新 • • 發佈:2018-11-09
目錄
一、什麼是儲存程式?
儲存程式指的是一組儲存和執行在資料庫伺服器端的程式。儲存程式總是在伺服器的程序或執行緒的記憶體中執行的。
二、為什麼使用儲存程式?
優點:
- 執行效率高;
- 簡化開發。
缺點:
- 佔用伺服器端資源;
- 資料遷移時需跟著一併遷移。
三、儲存程式分類
儲存程式分為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;