mysql 的function和procedure 仅对5.0版本后的有效(包括show function status等命令是没用的)
以创建function为例,存储过程和这个差不多,懒得打字了
首先先在mysql 下运行 set global log_bin_trust_function_creators=TRUE; 这句话是把创建函数的权限打开,不然会报错的
然后可以写程序了,mysql的语法比较奇特(与oracle相比)
DELIMITER $$
create function fn_get_work_date(next_date date,pre_date date)
returns int
begin
DECLARE v_re int;
select count(*) into v_re from old.calendar where yymmdd>=pre_date and yymmdd<=next_date and code=0;
return v_re;
end $$
DELIMITER 百度了一下:
MySQL中delimit命令。这个命令与
存储过程没什么关系。
其实就是告诉
mysql
解释器,该段命令是否已经结束了,mysql是否可以执行了。
即改变输入结束符。默认情况下,delimiter是分号“
;”。
在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令。但有时候,不希望MySQL这么做。因为可能输入较多的语句,且语句中包含有分号。
默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。因为mysql一遇到分号,它就要自动执行。这种情况下,就可以使用delimiter,把delimiter后面换成其它符号,如//或$$。
此时,delimiter作用就是对整个小段语句做一个简单的封装。
把它理解成格式吧,接下来是定义创建函数的名字和输入输出
从begin开始,定义变量时,每个变量之前都必须加declare,如 DECLARE v_re1 int; DECLARE v_re2 int; 这个和oracle只要写一遍declare不一样
其他的sql语句照写,结束时end $$ 一下就好了。
按下执行后就可以看到结果了
比较蛋疼的是,mysql好像不能编辑你写过的function ,如果要编辑必须先删掉 drop function if exists 'your_function_name' ,然后再建
可以使用show function/procedure status 查看mysql上存在的function和procedure