转换结束符:
delimiter /
存储过程:
()#或者是(a int,b int,out b int)
begin
#这里写你的操作
end /
调用:call test()/
存储函数:
()#或者是(a int,b int)
returns int #函数体必须包含一个RETURN value语句
begin
#这里写你的操作
return 1;
end/
调用:select test()/
备注:存储函数内不能查表(不能使用select 语句)储过程可以
语法:
-
存储过程中的局部变量前面无@符号用declare定义,且只能在begin end块中,全局变量为@var,前面带有@符号create procedure test(out a int)
begin
declare ab int default 1;
set a=100;
set a=ab;
enddeclare 定义的变量的优先级最高,所有当out a 等变量和局部变量相同名的时候,该变量只在该begin块中有效
SELECT id,data INTO x,y FROM test.t1 通过查询赋值变量
begin不能并列使用
2.返回值通过OUT参数得到
3.判断
if条件 then
操作
ELSEIF#中间无空格
end if;
case 值 (可选)
when 条件 then 操作
when 条件 then 操作
end
4.循环
while 条件 do … end while
loop … end loop
repeat … end repeat
goto
while … end while 例
BEGIN
DECLARE v INT;
SET v = 0;
WHILE v < 5 DO
INSERT INTO t VALUES (v);
SET v = v + 1;
END WHILE;
END; //
labels 使用
lab1 :begin
操作
end lab1;
lab2:while 条件 do
#操作
#可以使用leave lab2;跳出循环
#可以使用iterate lab2;跳过当次循环
end while lab2
GOTO 使用
declare i int;
set i=1;
label lab1;
select 'hi';
set i=i+1;
if(i<2)
goto lab1;
end b1;
5.错误处理
declare continue handler for sqlstate 'error number' 操作 end;
declare exit handler for sqlstate 'error number' 操作 end;
sqlstate 'error number' 还可以是
not found #空行
sqlexception #发生错误
sqlwarning #发生警告
以上语句均在发送错误的时候才触发
6.光标
只读的及不滚动, 声明处理程序之前被声明, SELECT语句不能有INTO子句。
例:
BEGIN
declare a,b,done int;
DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;#声明错误处理
OPEN cur1;#打开光标
while done!=1 do
fetch cur1 into a,b;
if a>b then select 'a';
else select 'b';
end if ;
end while;
close cur1;
end ;
备注:取得最后插入的ID 函数为last_insert_id();所有的存储过程等信息都在INFORMATION_SCHEMA库中
光标操作属于一个完整的语句块,所以有其他语句混合的时候用
begin
end;
分割
查询存储过程
show create function test/
触发器: TRIGGER
类型:
INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列
时间: BEFORE AFTER
例:
FOR EACH ROW BEGIN
#操作
END
动态SQL:
语法:
PREPARE stmt_name FROM preparable_stmt;
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
{DEALLOCATE | DROP} PREPARE stmt_name;
实例:
mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?";
mysql> EXECUTE STMT USING @a;
mysql> SET @skip=1; SET @numrows=5;
mysql> PREPARE STMT FROM "SELECT * FROM tbl LIMIT ?, ?";
mysql> EXECUTE STMT USING @skip, @numrows;
只能配合存储过程使用,不支持触发器或存储函数
建立以下触发器会出错误的:
CREATE TRIGGER cds_add_a AFTER INSERT ON b
FOR EACH ROW BEGIN
DECLARE done INT DEFAULT 0;
DECLARE ye INT;
DECLARE cur1 CURSOR FOR select jahr from cds where id=1;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO ye;
IF NOT done THEN
IF ye='1990' THEN
PREPARE STMT FROM "INSERT INTO `a` (`a`) VALUES (?)";
EXECUTE STMT USING @ye;
SET done = 1;
END IF;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
END;//
delimiter ;
(ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger)
编写储存过程的时候习惯把每个独立块用begin end 分割