關系型數據庫的存儲過程


 1.定義:存儲過程就是一組預先編譯好的sql語句集。
2.優點:提高重用性,減少冗余,減少了sql的編譯次數,減少了與服務器連接交互的次數。

3.存儲過程的創建語法

CREATE PROCEDURE 存儲過程名(參數列表)
BEGIN
    存儲過程體;
END

4.參數列表包含三部分:參數模式(in/out/in~out),參數名,參數類型

參數模式:
  in : 需要調用者傳入,類似java中的形參
  out : 作為返回值,類似java中的return
  in~out : 調用者傳入參數,對應的可以有返回值
如果存儲過程體中只有一句話那么對應的begin end 可以省略;
存儲過程體中每一條sql語句結尾都必須加上分號;
存儲過程結尾需要使用delimiter 標記 重新去設置存儲過程的結束標記。

5.存儲過程的調用

CALL 存儲過程名(實參);

  

6.案例

建employee表,department表,role表

 

#空參構造
DELIMITER $
CREATE PROCEDURE add1()
BEGIN
	SELECT 'SD';
END $
CALL radd();

  

#帶IN 模式的存儲過程
#通過部門名稱查詢對應的員工信息
DELIMITER $
CREATE PROCEDURE empinfo(IN dept_name varchar(20))
BEGIN
	SELECT
		e.e_id,
		e.e_name,
		d.dept_name
	FROM
		employee e RIGHT JOIN department d
	ON
		e.dept_id=d.dept_id
	WHERE
		d.dept_name=dept_name;
END $

CALL empinfo('開發部')

  

 

#通過員工部門名稱和角色信息,查詢員工是否存在,如果存在則顯示存在兩字,否則顯示不存在
DELIMITER $
CREATE PROCEDURE empinfo1(IN dept_name VARCHAR(20),IN r_name VARCHAR(20))
BEGIN
		DECLARE result int DEFAULT 0;
		SELECT count(*) INTO result FROM emoloyee e
		LEFT JOIN department d
		ON e.dept_id=d.dept_id
		LEFT JOIN role r
		ON r.r_id=e.r_id
		WHERE d.dept_name=dept_name AND r.r_name=r_name;
		SELECT 
			IF(result>0,'存在','不存在');
END $
CALL emploinfo1('開發部','一級管理員');

  

#帶out的存儲過程
#傳入員工姓名顯示對應的部門名稱
DELIMITER $
CREATE PROCEDURE empdep(IN empName VARCHAR(20),OUT deptName VARCHAR(20))
BEGIN
	SELECT 
		d.dept_name INTO deptName
	FROM 
		employee e LEFT JOIN department d
	ON
		e.dept_id=d.dept_id
	WHERE
		e.e_name=empName;
END $
#調用
CALL empdep('據',@DeptName);
SELECT @DeptName;

  

#通過員工姓名返回員工對應的部門名稱和角色名稱
CREATE PROCEDURE deptNameAndRoleName(IN emp_name VARCHAR(10),OUT dep_name VARCHAR(20),OUT rol_name VARCHAR(20))
BEGIN
	SELECT d.dept_name 部門名稱,r.r_name 角色名稱 INTO dep_name,rol_name
	FROM employee e
	LEFT JOIN department d
	ON d.dept_id=e.dept_id
	LEFT JOIN role r
	ON r.r_name=e.r_name
	WHERE
		e.e_name=emp_name
END $

#調用
CALL deptNameAndRoleName('hjbj',@deptNAME,@ROLEnaME)

#查看變量
SELECT @deptNAME,@ROLEnaME;

  

#創建IN~OUT
#傳入對應的工資計算年薪
DELIMITER $
CREATE PROCEDURE salaryss(INOUT s1 DOUBLE,INOUT s2 DOUBLE)
BEGIN
	SET s1=s1*12;
	SET s2=s2*12;
END 
#調用
set @s1=1000;
set @s2=1200;
CALL salaryss(@s1,@s2);
SELECT @s1,@s2

 7.刪除存儲過程(一次只能刪除一個)

DROP PROCEDURE 存儲過程名;

 8.查看存儲過程

SHOW CREATE PROCEDURE 存儲過程名

 9.修改存儲過程(一般創建好不允許修改)


免責聲明!

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



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