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.修改存儲過程(一般創建好不允許修改)