mysql游标样例讲解:
create function test() returns varchar(200)
begin
declare finished int default 0;
declare list varchar(200) default "";
declare n_name varchar(200) default "";
declare fethCur cursor for select xxx_name from xxx;
declare continue handler for NOT FOUND set finished=1; open fethCur;
fetchCurLoop:Loop
FETCH fethCur into n_name;
if finished then leave fetchCurLoop;
end if;
set list = concat(list,",",n_name);
end Loop;
close fethCur;
return substr(list,3);
end;
在mysql后台执行以上脚本提示:1418错误码,This function has none of DETERMINISTIC, NO SQL类似描述
原因:
这是我们开启了bin-log, 我们就必须指定我们的函数是否是
1 DETERMINISTIC 不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句
其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。
show variables like 'log_bin_trust_function_creators'; Value是OFF。执行 set global log_bin_trust_function_creators=1;即可创建函数成功,但是重启mysql该设置会无效,需要修改my.cnf文件。
执行函数查询结果命令:select 函数名() as test;
函数语法规则:create or replace function function_name(参数1,参数2..) return return_datatype
mysql中的substr(string string,num start,num length)函数,start是从1开始。
FETCH 获取游标当前指针的记录,并传给指定变量列表,注意变量数必须与游标返回的字段数一致,要获得多行数据,使用循环语句去执行FETCH
函数借用游标实现数据插入操作,mysql函数需要有返回值:
create function tests() returns varchar(200)
begin
declare finished boolean default 0 ;
declare tmp varchar(200) default "";
declare tmp1 varchar(200) default "";
declare fe cursor for
select n_code,n_name from A;
declare continue handler for sqlstate '02000' set finished=1;
open fe;
repeat
FETCH fe into tmp,tmp1;
if not finished then
insert into B(n_code,n_name) values (tmp,tmp1);
end if;
until finished end repeat;
close fe;
return tmp;
end;