存储过程创建语法:
CREATE
PROCEDURE
procedure_name(
[
parameter[,...
]
)
[ LANGUAGESQL ]
[ [NOT ] DETERMINISTIC]
[ {CONTAINSSQL|MODIFIESSQLDATA|READSSQLDATA|NOSQL} ]
[ SQLSECURITY{DEFINER|INVOKER} ]
[ COMMENTcomment_string ]
procedure_statements
[ LANGUAGESQL ]
[ [NOT ] DETERMINISTIC]
[ {CONTAINSSQL|MODIFIESSQLDATA|READSSQLDATA|NOSQL} ]
[ SQLSECURITY{DEFINER|INVOKER} ]
[ COMMENTcomment_string ]
procedure_statements
函数的创建
CREATE
FUNCTION
function_name(parameter
[
,...
]
)
RETURNS datatype
[ LANGUAGESQL ]
[ [NOT ] DETERMINISTIC]
[ {CONTAINSSQL|NOSQL|MODIFIESSQLDATA|READSSQLDATA} ]
[ SQLSECURITY{DEFINER|INVOKER} ]
[ COMMENTcomment_string ]
语句体
RETURNS datatype
[ LANGUAGESQL ]
[ [NOT ] DETERMINISTIC]
[ {CONTAINSSQL|NOSQL|MODIFIESSQLDATA|READSSQLDATA} ]
[ SQLSECURITY{DEFINER|INVOKER} ]
[ COMMENTcomment_string ]
语句体
函数与存储过程基本一样,其区别主要有:
1、 要使用RETURNS指定返回类型
2、 函数必须返回值,且在语句体中使用RETURN返回(注意:指定返回类型用RETURNS,返回值用RETURN)
3、 参数不区分IN,OUT,全部为IN类形
例:
CREATE
FUNCTION
cust_status(in_status
CHAR
(
1
))
RETURNS VARCHAR ( 20 )
BEGIN
DECLARE long_status VARCHAR ( 20 );
IF in_status = ' O ' THEN SET long_status = ' Overdue ' ;
ELSEIFin_status = ' U ' THEN SET long_status = ' Uptodate ' ;
ELSEIFin_status = ' N ' THEN SET long_status = ' New ' ;
END IF ;
RETURN (long_status);
END ;
RETURNS VARCHAR ( 20 )
BEGIN
DECLARE long_status VARCHAR ( 20 );
IF in_status = ' O ' THEN SET long_status = ' Overdue ' ;
ELSEIFin_status = ' U ' THEN SET long_status = ' Uptodate ' ;
ELSEIFin_status = ' N ' THEN SET long_status = ' New ' ;
END IF ;
RETURN (long_status);
END ;
调用:
SELECT
cust_status(
'
O
'
);
可用SHOW PROCEDURE STATUS 或 SHOW CREATE PROCEDURE 来查看存储过程信息
另,系统表INFORMATION_SCHEMA.ROUTINES也包含了存储过程的一些信息
同样地,函数也可以使用同样方式查看(SHOW FUNCTION STATUS)
触发器
CREATE
[
DEFINER={user|CURRENT_USER}
]
TRIGGER
trigger_name
{BEFORE | AFTER}{ UPDATE | INSERT | DELETE }
ON table_name
FOR EACHROW
trigger_statements
{BEFORE | AFTER}{ UPDATE | INSERT | DELETE }
ON table_name
FOR EACHROW
trigger_statements
意义:
当对表table_name执行update,insert,delete操作之前(before)或之后(after)时触发语句trigger_statements操作
例:
mysql
>
CREATE
TRIGGER
account_balance_au
AFTER UPDATE ON account_balance FOR EACHROW
BEGIN
DECLARE dummy INT ;
IF NEW.balance < 0 THEN
SET NEW.balance = NULL ;
END IF ;
END
AFTER UPDATE ON account_balance FOR EACHROW
BEGIN
DECLARE dummy INT ;
IF NEW.balance < 0 THEN
SET NEW.balance = NULL ;
END IF ;
END
上述触发器表示:当更新表account_balance之后,如果更新的值balance小于0,则将它改为NULL,
注:如果为OLD.balance则表示更新前的原值
基本语法
一.创建存储过程
1.基本语法:
create procedure sp_name()
begin
.........
end
2.参数传递
begin
.........
end
二.调用存储过程
1.基本语法:call sp_name()
注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递
注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递
三.删除存储过程
1.基本语法:
drop procedure sp_name//
2.注意事项
(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
drop procedure sp_name//
2.注意事项
(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
四.区块,条件,循环
1.区块定义,常用
begin
......
end;
也可以给区块起别名,如:
lable:begin
...........
end lable;
可以用leave lable;跳出区块,执行区块以后的代码
2.条件语句
begin
......
end;
也可以给区块起别名,如:
lable:begin
...........
end lable;
可以用leave lable;跳出区块,执行区块以后的代码
2.条件语句
if
条件
then
statement
else
statement
end if ;
statement
else
statement
end if ;
3.循环语句
(1).while循环
[
label:
]
WHILE
expression DO
statements
END WHILE [ label ] ;
statements
END WHILE [ label ] ;
(2).loop循环
[
label:
]
LOOP
statements
END LOOP [ label ] ;
statements
END LOOP [ label ] ;
(3).repeat until循环
[
label:
]
REPEAT
statements
UNTIL expression
END REPEAT [ label ] ;
statements
UNTIL expression
END REPEAT [ label ] ;