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會釋放,!