变量的定义
declare total_sale int default 0;
declare total_count int;
set total_count = 10;
全局变量
set @counter = 1; 定义
存储过程不带返回值,存储函数带返回值,参数in不改变值,out改变值
create procedure proc_name ([parameters])
routine_body
create function func_name ([parameters])
returns data_type routine_body
[ in | out | inout ] param_name data_type
例子:
create procedure GetStudentSizeByDept(in deptname varchar(50))
create function GetStudentSizeByDept2(in deptname varchar(50)) returns int
简单的存储过程
mysql > delimiter // -- replace default statement delimiter ; by //
mysql > create procedure GetAllEmployees()
begin
select * from employees;
end //
mysql > delimiter ; -- make ; the statement delimiter again
if语句基本语法
if ……then……
elseif……then……
else ……
end if;
例子:
if creditlim > 50000 then
set p_customerLevel = 'PLATINUM';
elseif (creditlim <= 50000 and creditlim >= 10000) then
set p_customerLevel = 'GOLD';
elseif creditlim < 10000 then
set p_customerLevel = 'SILVER';
end if;
Case语句基本语法
CASE case_expression
WHEN when_expression_1 THEN commands
WHEN when_expression_2 THEN commands
...
ELSE commands
END CASE;
例子:
CASE customerCountry
WHEN 'USA' THEN set p_shiping = '2-day Shipping';
WHEN 'Canada' THEN set p_shiping = '3-day Shipping';
ELSE set p_shiping = '5-day Shipping';
END CASE;
循环while基本语法
WHILE expression DO
……
END WHILE;
例子:
WHILE x <= 5 DO
…………
set x = x + 1;
END WHILE;
LEAVE=break;
ITERATE=continue;
例子:
loop_label: LOOP
IF x > 10 THEN
LEAVE loop_label;
END IF;
set x = x + 1;
IF (x mod 2) THEN
ITERATE loop_label;
ELSE
set str = concat(str, x, ',');
END IF;
END LOOP;
show procedure status;
show create procedure build_email_list;
触发器基本语句,创建与删除
create trigger trigger_name
{ before | after }
{ insert | update | delete }
on table_name
for each row
drop trigger [if exists] trigger_name
关键字OLD和NEW注意事项
In an INSERT trigger, only NEW.col_name can be used; there is no old row.
In a DELETE trigger, only OLD.col_name can be used; there is no new row.
In an UPDATE trigger, you can use both OLD.col_name and NEW.col_name
监听数据改变
after update on products
for each row
begin
if old.price <> new.price then
…………
执行完整的约束(删除)操作
如果删除了某个学生,需要删除该学生的所有注册。
after delete on students
for each row
begin
delete from enrollments where sid = old.sid;
事件,有些表需要按固定的事件以固定的规则更新
创建事件
create event event_name
on schedule schedule_spec
do event_body;
解释:
schedule_spec: at timestamp [+ interval interval_spec] | every interval [starts timestamp [+ interval interval_spec] ] [ends timestamp [+ interval interval_spec] ]
interval_spec: quantity {year | quarter | month | day | hour | minute | week | second | year_month | day_hour | day_minute | day_second | hour_minute | hour_second | minute_second}
例子:
create event my_schedule
on schedule at current_timestamp + interval 3 hours
do insert into MySchedule values (‘faculty meeting’, ‘2013-11-14 16:30:00’, ‘G11’);
create event my_schedule
on schedule every 1 day
do delete from MySchedule where event_time < current_timestamp;