~routine_body:SQL語句, DELIMITER // #將結束符定義為// BEGIN ..... ...... END
delimiter //
create procedure nbaf() begin select from team left join star on team.id = star.team_id union select from team right join star on team.id = star.team_id; end//
create procedure pf(in p_id int) begin select from team left join star on team.id = star.team_id where team.id = p_id union select from team right join star on team.id = star.team_id where team.id = p_id; end//
delimiter ;
call pf();
3.定義條件和處理程序
?。?)定義條件:是事先定義程序執行過程中遇到的問題,處理程序定義了在遇到這些問題時應當采取的處理方式,并且保證存儲過程中遇到警告或錯誤時能繼續執行。 DECLARE condition_name CONDITION FOR [condition_type];
SQLSTATE[VALUE] sqlstate_value:包含5個字符的字符串錯誤值 condition_name :錯誤條件名稱 SQLWARNING :匹配所有以01開頭的SQLSTATE錯誤代碼 NOT FOUND :匹配所有以02開頭的SQLSTATE錯誤代碼 SQLEXCEPTION :匹配所有除01,02開頭外的SQLSTATE錯誤代碼 mysql_error_code :匹配數值類型的錯誤代碼
定義處理程序的幾種方式
declare continue handler for SQLSTATE '42S02' set @info= 'NO_SUCH_TABLE' ; #info輸出
declare continue handler for 1146 set @info= 'NO_SUCH_TABLE' ; #1146,捕獲mysql_error_code
declare no_such_table condition for 1146; declare continue handler for NO_SUCH_TABLE set @info= 'ERROR' ; #先定義條件,然后調用
declare exit handler for SQLWARNING set @info= 'ERROR' ;
declare exit handler for NOT FOUND set @info= 'NO_SUCH_TABLE' ;
declare exit handler for SQLEXCEPTION set @info= 'ERROR' ;
4.光標的使用:數據量非常大時使用光標逐條查詢
(1)光標的聲明:在聲明變量、條件后,聲明處理程序之后
DECLARE cursor_name CURSOR FOR select_statement
(2)光標的使用 打開光標: OPEN cursor_name; FETCH cursor_name INTO var_name [,var_name].... 關閉光標: CLOSE curse_name
5.控制流程的使用:在編寫存儲過程中
?。?)IF語句: IF expr_condition THEN statement_list [ELSEIF expr_contidion THEN statement_list] [ELSE statement_list] END IF //expr_condition 判斷語句 statement_list SQL語句
(2)CASE語句: CASE case_expr WHEN when_value THEN statement_list [ WHEN when_value THEN statement_list] ............ [ELSE statement_list] END CASE;
(3) LOOP語句: [loop_table:] LOOP statement_list END LOOP [loop_tabel];
create procedure east() begin declare ep1 int default 0; declare ep2 int default 7; east_p:LOOP set ep1 = ep1 + 1; if ep1< 4 then select * from team left join star on team.id = star.team_id where team.id = ep1 union select * from team right join star on team.id = star.team_id where team.id = ep1;