Mysql 存储过程_MySQL
delimiter /
存储过程:
create procedure test
()#或者是(a int,b int,out b int)
begin
#这里写你的操作
end /
调用:call test()/
存储函数:
create function test
()#或者是(a int,b int)
returns int #函数体必须包含一个RETURN value语句
begin
#这里写你的操作
return 1;
end/
调用:select test()/
备注:存储函数内不能查表(不能使用select 语句)储过程可以
语法:
- 存储过程中的局部变量前面无@符号用declare定义,且只能在begin end块中,全局变量为@var,前面带有@符号
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
操作
end if;
case 值 (可选)
when 条件 then 操作
when 条件 then 操作
end
4.循环
while 条件 do … end while
loop … end loop
repeat … end repeat
goto
while … end while 例
CREATE PROCEDURE p14 ()
BEGIN
DECLARE v INT;
SET v = 0;
WHILE v
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 使用
b1:begin
declare i int;
set i=1;
label lab1;
select 'hi';
set i=i+1;
if(i
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子句。
例:
CREATE PROCEDURE curdemo()
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库中
查询存储过程
show create procedure test/ #查询存储过程详细
show create function test/
触发器: TRIGGER
类型:
INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列
时间: BEFORE AFTER
例:
CREATE TRIGGER testtrio BEFORE INSERT ON test1
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> SET @a=1;
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;