萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySQL5的存儲過程詳細實例

MySQL5的存儲過程詳細實例

本文章來介紹一下關於mysql5的新特性存儲過程了,在mysql5之前是沒有存儲過程這一說的,下面我們來看看mysql5存儲過程的用法。

MySQL 5.0
新特性教程是為需要了解5.0版本新特性的MySQL老用戶而寫的。簡單的來說是介紹了“存儲過程、觸發器、視圖、信息架構視圖
格式:

CREATE PROCEDURE 過程名 ([過程參數[,...]])
[特性 ...] 過程體

CREATE FUNCTION 函數名 ([函數參數[,...]])
RETURNS 返回類型
[特性 ...] 函數體

過程參數:
[ IN | OUT | INOUT ] 參數名 參數類型

函數參數:
參數名 參數類型

返回類型:
有效的MySQL數據類型即可

特性:
LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'

過程體/函數體:格式如下:
BEGIN
有效的SQL語句
END

 

實例

DELIMITER $$
DROP PROCEDURE IF EXISTS `spTest` $$
CREATE PROCEDURE `spTest`(p_title VARCHAR(200), p_description TEXT)
DETERMINISTIC
BEGIN
INSERT INTO category (title, description)
VALUES (p_title, p_description);
END $$
DELIMITER ;
其中DELIMITER是用來決定SQL分隔符號的,在寫Stored Procedure前,要先把預設的分號換掉,寫完 Stored Procedure 的 routine_body 後,再回復成預設的分號。

--刪除
drop procedure if exists up_common_select

--創建

CREATE  PROCEDURE `up_common_select`(
 in t_name varchar(50)
)
begin
 declare v_sql varchar(500);
 set v_sql= concat('select * from ',t_name);
 select v_sql;
 --
--注意:prepare(預處理)execute stmt using @var,只能跟@var變量,declare和傳入的變量不行!!!
 set @v_sql=v_sql;

 prepare stmt from @v_sql;
 EXECUTE stmt ;
 deallocate prepare stmt;
 
end;

--調用

call up_common_select('admin_authority');
#############################################
#注意事項
###########
1  mysql5.0.13之後支持在存儲過程中調用prepare
2, prepare stmt from 'select * from ?';  (錯)
    mysql5.0.24,prepare尚不支持 表名做變量!
    解決方案:用 contat()函數,組合字符串
3. execute stmt [using @var,@var2]
     必須是@var形式的變量,傳入的參數變量,declare變量不行
4.  deallocate prepare stmt; 顯式的釋放prepare,如果不釋放,mysql會釋放,!

copyright © 萬盛學電腦網 all rights reserved