mysql游标的应用包括函数

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;

原文地址:https://www.cnblogs.com/penglei2011/p/3723120.html