mysql儲存過程小試牛刀

bitifi發表於2016-09-06
(1). 格式
MySQL儲存過程建立的格式:CREATE PROCEDURE 過程名 ([過程引數[,...]])
[特性 ...] 過程體
這裡先舉個例子:
mysql> DELIMITER //  
mysql> CREATE PROCEDURE proc1(OUT s int)  
  -> BEGIN 
    -> SELECT COUNT(*) INTO s FROM user;  
    -> END 
    -> //  
mysql> DELIMITER ; 
 注:
1)這裡需要注意的是DELIMITER //DELIMITER ;兩句,DELIMITER是分割符的意思,因為MySQL預設以";"為分隔符,如果我們沒有宣告分割符,那麼編譯器會把儲存過程當成SQL語句進行處理,則儲存過程的編譯過程會報錯,所以要事先用DELIMITER關鍵字申明當前段分隔符,這樣MySQL才會將";"當做儲存過程中的程式碼,不會執行這些程式碼,用完了之後要把分隔符還原。
2)儲存過程根據需要可能會有輸入、輸出、輸入輸出引數,這裡有一個輸出引數s,型別是int型,如果有多個引數用","分割開。
3)過程體的開始與結束使用BEGINEND進行標識。
這樣,我們的一個MySQL儲存過程就完成了,是不是很容易呢?看不懂也沒關係,接下來,我們詳細的講解。
  (2). 宣告分割符
其實,關於宣告分割符,上面的註解已經寫得很清楚,不需要多說,只是稍微要注意一點的是:如果是用MySQLAdministrator管理工具時,可以直接建立,不再需要宣告。
(3). 引數
MySQL儲存過程的引數用在儲存過程的定義,共有三種引數型別,IN,OUT,INOUT,形式如:
CREATE PROCEDURE([[IN |OUT |INOUT ] 引數名 資料類形...])
IN 輸入引數:表示該引數的值必須在呼叫儲存過程時指定,在儲存過程中修改該引數的值不能被返回,為預設值
OUT 輸出引數:該值可在儲存過程內部被改變,並可返回
INOUT 輸入輸出引數:呼叫時指定,並且可被改變和返回
DELIMITER $$
DROP PROCEDURE IF EXISTS getUserInfo $$
CREATE PROCEDURE getUserInfo(in date_day datetime)
--
-- 例項
-- MYSQL儲存過程名為:getUserInfo
-- 引數為:date_day日期格式:2008-03-08
--
    BEGIN
declare _userName varchar(12); -- 使用者名稱
declare _chinese int ; -- 語文
declare _math int ;    -- 數學
declare done int;  
-- 定義遊標
DECLARE rs_cursor CURSOR FOR SELECT username,chinese,math from userInfo where datediff(createDate, date_day)=0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;    --結束語法
-- 獲取昨天的日期
if date_day is null then
   set date_day = date_add(now(),interval -1 day);
end if;
open rs_cursor;
cursor_loop:loop     ###固定語法,cusor_loop 是自己隨便起的名字
   FETCH rs_cursor into _userName, _chinese, _math; -- 取資料
  if done=1 then
    leave cursor_loop;
   end if;
-- 更新表
update infoSum set total=_chinese+_math where UserName=_userName;
end loop cursor_loop;
close rs_cursor;
    END$$
DELIMITER ;
我寫的案例:
1.取出每條資料的總訪問量
DELIMITER $$
CREATE PROCEDURE test.get_data_lunzheng()
BEGIN
DECLARE loop_id INT;
DECLARE done INT DEFAULT 0;
DECLARE id_cursor CURSOR FOR SELECT id FROM test2.lunzheng;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
OPEN id_cursor;
select_loop: LOOP
FETCH id_cursor INTO loop_id;
IF done=1 THEN
LEAVE select_loop;
END IF;
SELECT info_id,COUNT(*) FROM (SELECT a.info_id,a.id FROM liuhe.`pvlogs_back_05_bak` a 
WHERE a.info_id=loop_id UNION ALL SELECT b.info_id,b.id FROM liuwenhe.`pvlogs_back_08_bak` b  WHERE b.info_id=loop_id) c  GROUP BY info_id  into outfile  'C:\Users\manet\Desktop\loop_id.txt'   ;
END LOOP ;
CLOSE id_cursor;
END $$
DELIMITER ;

mysql儲存過程小試牛刀

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30496894/viewspace-2124574/,如需轉載,請註明出處,否則將追究法律責任。

相關文章