1.1 降低網絡流量
1.2 處理需要檢查、循環、多語句但沒有用戶交互的重複性任務
1.3 可移植性好,因爲與具體語言無關
2
2.1選擇分隔符
mysql>DELIMITER //
不使用“;”的原因是:存儲過程中有許多語句,所以要選擇一個不容易在程序中出現的分隔符
2.2恢復分隔符
mysql>Delimiter ;
3 顯示存儲過程內容:
show create procedure proc_name;
show procedure status; ---->列出所有的存儲過程
show function status;
show table status;
但不能有對例程都表操作的數據庫操作語句
6. Characteristics Clauses 特徵子句
6.1
create procedure p2()
Language sql <--
not deterministic <--
sql security definer <--
comment 'a Procedure' <--
select current_date,Rand() from t//
not deterministic(不確定性) 是傳遞給系統的信息。
如上面主體中含有select 語句,那返回肯定是未知的。
因此稱其 not deterministic
但Mysql內置的優化程序不會注意這個,至少現在不注意。
sql security definer 在調用時檢查創建過程用戶的權限 。還有一個(sql security invoker)
如過程己經調用,則不再檢查了。
而(invoker)則還需要檢查!
7.1 create procedure p5()...
7.2 create procedure p5([in] name data-type)...
7.3 create procedure p5(out name data-type)...
7.4 create procedure p5(inout name data-type)...
8 設置一個變量 set @x=0
in: create procedure p5(p int) set @x=p//
call p5(123)//
select @x//
out: create procedure p6(out p int)
->set p=-5//
call p6(@y)
select @y
Compound Statements 複合語句:
create procedure p7()
begin
set @a=5;
set @b=5;
insert into person values('lihua',21,'m','[email protected]')
select name form person where age>@a*@b-10;
end;//
declare a int;
set a=5;
變量一旦聲明,就能在任何能使用會話變量、文字、列名的地方使用
mysql> create procedure p3()select'a'||'b'//
mysql> set sql_mode=''//
mysql> call p3()//
不會改變的不會改變的不會改變的不會改變的
+------------+
| 'a' || 'b' |
+------------+
| ab |
+------------+
這說明:MYSQL 在過程創建時會自動保持運行環境。
(3) Example with DEFAULT clause 含有DEFAULT有例子
CREATE PROCEDURE p10 ()
BEGIN
DECLARE a, b INT DEFAULT 5;
INSERT INTO t VALUES (a);
SELECT s1 * a FROM t WHERE s1 >= b;
END; //
CREATE PROCEDURE p11 ()
結果顯示了過程能正常工作
BEGIN
DECLARE x1 CHAR(5) DEFAULT 'outer';
BEGIN
DECLARE x1 CHAR(5) DEFAULT 'inner';
SELECT x1;
END;
SELECT x1;
END; //
內部高於外部
1.
drop procedure if exists p13//
CREATE PROCEDURE p13 (IN parameter1 INT)
BEGIN
DECLARE variable1 INT;
SET variable1 = parameter1 + 1;
CASE variable1
WHEN 0 THEN insert into person values('PP',11,'m','[email protected]');
WHEN 1 THEN insert into person values('MM',22,'f','[email protected]');
ELSE insert into person values('ELSE',33,'el','[email protected]');
END CASE;
END; //
13.Loops循環語句
WHILE ... END WHILE
LOOP ... END LOOP
REPEAT ... END REPEAT
GOTO
-----------------------
14. WHILE ... END WHILE 執行前檢查結果
CREATE PROCEDURE p14 ()
BEGIN
DECLARE v INT;
SET v = 0;
WHILE v < 5 DO
INSERT INTO t VALUES (v);
SET v = v + 1;
END WHILE;
END; //
PRIME:
drop procedure if exists pro_prime2//
create procedure pro_prime2(in num int)
begin
declare i,j,x,y int default 0;
select PRI_NUM into j from prime;
select 'count ',j;
while i<num do
set x=2;
pp1:while x<=sqrt(j) do
if j%x=0 then
set y=1;
leave pp1;
else
set x=x+1;
end if;
end while;
if y=1 then
set y=0;
else
set i=i+1;
insert into prime values(j);
end if;
set j=j+1;
end while;
end;//
15. REPEAT ... END REPEAT 執行後檢查結果,while是執行前。。。[注:UNTIL語句後面可以沒有分號]
CREATE PROCEDURE p15 ()
BEGIN
DECLARE v INT;
SET v = 0;
REPEAT
INSERT INTO t VALUES (v);
SET v = v + 1;
UNTIL v >= 5
END REPEAT;
END; //
-----------------------
16. LOOP ... END LOOP
CREATE PROCEDURE p16 ()
BEGIN
過程
我們可以看到調用
DECLARE v INT;
SET v = 0;
loop_label: LOOP
INSERT INTO t VALUES (v);
SET v = v + 1;
IF v >= 5 THEN <--利用if/leave退出loop循環
LEAVE loop_label;
END IF;
END LOOP;
END; //
| 可以在begin、while、repeat、loop語句前使用標號 |
----------------------------------------------------------------
| 也可以在語句結束時使用標號,但並不十分有用,只是 |
| 這是良好的編程習慣。方便他人閱讀。 如:end while label1; |
----------------------------------------------------------------
它類似於C語言中的continue;
BEGIN
DECLARE v INT;
SET v = 0;
loop_label: LOOP
IF v = 3 THEN
SET v = v + 1;
ITERATE loop_label;
END IF;
INSERT INTO t VALUES (v);
SET v = v + 1;
IF v >= 5 THEN
LEAVE loop_label;
END IF;
END LOOP;
END; //
17. GOTO [不推薦使用]
BEGIN
...
LABEL label_name;
...
GOTO label_name;
...
END;