mysql之存储过程和存储函数
CREATE PROCEDURE
sp_name ([
proc_parameter[,…]])
[
characteristic …]
routine_body
CREATE FUNCTION
sp_name
([
func_parameter[,…]])
RETURNS
type [
characteristic
…]
routine_body
proc_parameter: [ IN | OUT | INOUT ]
param_name type
type:
Any valid MySQL data type
characteristic: LANGUAGE SQL| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT ‘
string‘
routine_body:
Valid SQL procedure statement or statements
COMMENT子句是一个MySQL的扩展,它可以被用来描述存储程序。这个信息被SHOW CREATE PROCEDURE和 SHOW CREATE FUNCTION语句来显示。
MySQL允许子程序包含DDL语句,如CREATE和DROP。MySQL也允许存储程序(但不是存储函数)包含SQL 交互语句,如COMMIT。存储函数不可以包含那些做明确的和绝对的提交或者做回滚的语句。
存储子程序不能使用LOAD DATA INFILE。
ALTER {PROCEDURE | FUNCTION}
sp_name
[
characteristic
…]
characteristic:
{ CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT ‘
string‘
DROP {PROCEDURE | FUNCTION} [IF EXISTS]
sp_name
SHOW CREATE {PROCEDURE | FUNCTION}
sp_name
SHOW {PROCEDURE | FUNCTION} STATUS [LIKE ‘
pattern‘]
CALL
sp_name([
parameter[,…]])
CALL语句可以用声明为OUT或的INOUT参数的参数给它的调用者传回值。它也“返回”受影响的行数,客户端程序可以在SQL级别通过调用ROW_COUNT()函数获得这个数,从C中是调用the mysql_affected_rows() C API函数来获得
BEGIN … END复合语句
[
begin_label:] BEGIN
[
statement_list]
END [
end_label]
变量的使用
DECLARE
var_name[,…]
type
[DEFAULT
value]用来声明局部变量。
SET
var_name
=
expr
[,
var_name
=
expr] …
SELECT
col_name[,…] INTO
var_name[,…]
table_expr
存储过程实例:
CREATE PROCEDURE sp1 (x VARCHAR(5))
BEGIN
DECLARE xname VARCHAR(5) DEFAULT ‘bob’;
DECLARE newname VARCHAR(5);
DECLARE xid INT;