1.存儲過程

1.1體會封裝
(1)創建一個存儲過程
create PROCEDURE p1() -- 聲明一個存儲過程,begin和end之間就是sql語句的集合。 BEGIN insert into goods VALUES(null, 'why', '50'); select * from goods; END
(2)調用存儲過程,之后想要使用begin和end之間的sql語句,就可以像調函數一樣使用
-- 調用存儲過程,執行了創建存儲過程時begin和end之間的語句 call p1();
1.2體會參數
(1)
-- 三個參數類型 -- in 表示參數只能傳進來,輸入型參數 -- out 表示輸出型參數 -- inout 表示輸入輸出型參數 -- 默認不給參數參數類型則是in輸入型參數 create PROCEDURE p2(in i int, inout names VARCHAR(50)) -- 聲明一個存儲過程,帶參數的,in表示輸入型參數,i為參數名,int為i這個參數的數據類型 BEGIN -- 參數2:inout表示輸入輸出型參數,names是參數名,varchar(50)表示names這個參數的數據類型是字符串格式的長度最長為50 update goods set name = names where id = i; select names; -- 查詢看一下names這個變量的值
select name into names from goods where id = 1; -- into的意思是將查詢出來的name值賦值給names這個變量
END set @names = '大鵝'; -- 定義一個變量names,賦值為大鵝,目的是給下面的調用用 call p2(4, @names); -- 調用p2這個存儲過程,因為第二個參數是inout輸入輸出型參數,所以一定要進來一個之前被set過的變量,並加@,其實就像C語言中的指針。 select @names; -- 查看一下這個names參數被帶出來的值 大鵝

(2)into關鍵字只能將查詢出來的一個值賦值給一個變量,不能查詢出來多個賦值給多個變量
1.3體會控制

-- 如果flag為true則查詢goods表中比nums小商品記錄 -- 如果flag為false則查詢goods表中比nums大的商品記錄 -- if 條件結束后要加end if,判斷是否相等要用=號而不是== create PROCEDURE p(int flag char(5), in nums int) BEGIN if flag = 'true' THEN select * from goods where num < nums; ELSEIF flag = 'false' THEN select * from goods where num > nums; ELSE select * from goods; end if; END call p('true', 20);
1.4 體會循環,使用存儲過程做1 ~ 100的累加和
create PROCEDURE p4(in count int, out result_sum int) BEGIN declare i int DEFAULT 0; -- 使用declare聲明一個變量i,默認值是0 DECLARE sum int; set sum = 0; -- 使用set設置sum這個變量的值為0 while i <= count DO set sum = sum + i; set i = i + 1; end WHILE; set result_sum = sum; -- 設置result_sum = sum END set he = 0; call p4(100, @he); select @he;
1.5查看和刪除存儲過程
show PROCEDURE status; -- 查看當前創建的存儲過程 drop PROCEDURE p4; -- 刪除p4存儲過程
如果存儲過程寫錯了,在命令行下只能刪除這個存儲過程,然后在重新創建一個來達到修改的目的。如果是在Navicat for mysql可視化ide中,則可以在函數中,設計函數來改存儲過程的邏輯代碼。



存儲過程建議sql語句在幾百行左右才會用,並且跟賬目相關的特別嚴謹的才會用到存儲過程,普通的項目應該是用不到
