http://blog.itpub.net/559237/viewspace-438942/

今天花了半天时间来研究mysql的存储过程函数和触发器的创建,觉得和oracle的大同小异,只是语法上更艰涩点,可能是先入为主吧,经过多次失败,终于创建成功,需要注意创建前要先执行“delimiter //”,创建后以“//”结束,还有就是怎么没有像plsql dev这样的工具来调试程序呢。和oracle的在语法上主要不同点有如下几方面:

1.declare放到了begin体里面

2.给变量复制是set xxx = 1

3. 在事务开始时要start transaction;

4.函数的返回是returns(oracle的是return),返回类型也需要给varchar等类型定义长度

还有就是在网上翻了个遍,手册也看了,就是没有找到存储过程的自定义异常,不知道到底有没有。

以下举几个例子:

没有create or replace语句,只要先删除再创建

delimiter$$

create function f_a(ai_n int) returns varchar(64) begin  declare vs_res varchar(64);  declare vi_count int;  select max(n),count(1)  into vs_res ,vi_count from d where i = ai_n;  if vs_res is null then   set vs_res = '';  end if;  return vs_res; end$$ DELIMITER ;

如果出现如下错误,需要设置set global log_bin_trust_function_creators=TRUE。 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

mysql> select f_a(1); +--------+ | f_a(1) | +--------+ | 直播   | +--------+ 1 row in set (0.05 sec)

存储过程: delimiter$$

create procedure p_a(in ai_num int)  begin  declare vi_loop int default 0;  declare vi_maxid,vi_count int;   select max(id),count(1) into vi_maxid,vi_count from a;  if vi_count = 0 then   set vi_maxid = 0;  end if;  start transaction;  set vi_loop = 1;  while vi_loop < ai_num do          set vi_maxid = vi_maxid + 1;   insert into u values(vi_maxid,vi_maxid);   set vi_loop = vi_loop + 1;  end while;  commit;  end$$

delimiter$$

delimiter $$

create procedure curdemo() begin   declare done int default 0;   declare a char(16);   declare b,c,d int;   declare cur1 cursor for select id,data from test.t1;   declare cur2 cursor for select i from test.t2;   declare continue handler for sqlstate '02000' set done = 1;   open cur1;   open cur2;   repeat     fetch cur1 into a, b;     fetch cur2 into c;     if not done then        set d = sign(b - c);        case d         when 0 then               insert into test.t3 values (a,0);         when 1 then               insert into test.t3 values (a,b);         when -1 then               insert into test.t3 values (a,c);        end case;     end if;   until done end repeat;   close cur1;   close cur2; end$$ delimiter; 触发器: 和oracle差不多,就是需要开头delimiter //,结尾用//,new前的:去掉即可。 mysql> drop trigger trg_a mysql> delimiter // mysql> create trigger trg_a before insert on a       -> for each row

-> insert into b set id=new.id,i=111;     -> delete from c where a=new.id;     -> end;     -> // Query OK, 0 rows affected (0.02 sec)

运行过程 msql>call p_a(1000); 通过show create procedure/function name可以查看过程和函数的结果 如mysql>show create procedure p_a;

####以下是项目中的例子

drop FUNCTION `manage`.`f_getarea`; DELIMITER $$

CREATE FUNCTION `manage`.`f_getarea`(as_areaid  varchar(32), ai_i   int)  #ai_i层数  #select f_getarea('1.22.333.55',2) can get '1.22.'  RETURNS varchar(32)  BEGIN   declare vi_temp,vi_i,vi_instr tinyint(2);     #不可能超过5层    if ai_i > 5 or ai_i < 1 then     return '';   end if;   set vi_temp = 0,vi_i = 0;   while 1 = 1 do         set vi_instr = vi_temp;  set vi_temp = locate('.',as_areaid,vi_temp+1);         if vi_temp = 0 then   return substr(as_areaid,1,vi_instr);  end if;         if vi_i = ai_i then   return substr(as_areaid,1,vi_instr);         end if;  set vi_i = vi_i + 1;   end while;   return '';  END$$

DELIMITER ;

mysql存储过程、函数和触发器的创建 [转]的更多相关文章

  1. MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器

    ———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...

  2. MySQL 存储过程 函数 routine 权限

    MySQL 存储过程 函数 routine 权限 Table of Contents 1. mysql存储过程/函数权限 1.1. 相关对象操作权限检查 1.2. 执行权限 1 mysql存储过程/函 ...

  3. MySQL自定义函数、触发器、存储过程

    存储过程 概念 存储过程,是一个数据库对象,类似一个函数. 在存储过程中可以使用SQL中的绝大部分内容,并且可以加入编程语言的特性(循环判断分支). 编写好存储过程之后,可以在客户端调用存储过程,存储 ...

  4. mysql 存储过程 函数 触发器

    mysql存储过程与函数 存储过程下载  demo mysql> delimiter // -- 这里//为修改默认分隔符: mysql> CREATE PROCEDURE simplep ...

  5. mysql使用存储过程&函数实现批量插入

    写这边文章的目的,是想结合mysql 存储过程+函数完成一个批量删除的功能吧...正好也好加深下对procedure和function的熟练操作吧...废话不多说,我就直接上表结构啦哈,如下: cre ...

  6. Paip.断点调试MYSQL存储过程跟函数的解决方案大法

    Paip.断点调试MYSQL存储过程跟函数的解决方案大法 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog.csdn ...

  7. MySQL主从环境下存储过程,函数,触发器,事件的复制情况

    下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...

  8. MySQL 第十天(视图、存储过程、函数、触发器)

    MySql高级-视图.函数.存储过程.触发器 目录 一.视图    1 1.视图的定义    1 2.视图的作用    1 (1)可以简化查询.    1 (2)可以进行权限控制,    3 3.查询 ...

  9. Mysql 存储过程、函数、触发器和视图的权限检查

    当存储过程.函数.触发器和视图创建后,不单单创建者要执行,其它用户也可能需要执行,换句话说,执行者有可能不是创建者本身,那么在执行存储过程时,MySQL是如何做权限检查的? 在默认情况下,MySQL将 ...

随机推荐

  1. ImageIO.wtrie生成jpg图片质量损失方案:BufferedImage生成jpg图片文件流

    Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpeg"); ImageW ...

  2. 在iptables和selinux中放行smb服务

    配置selinux [root@localhost samba]# getsebool -a | grep samba 查找selinux中对samba的限制项samba_domain_control ...

  3. Python 中 open()文件操作的方式

    Python的open方法用来打开一个文件.第一个参数是文件的位置和文件名,第二个参数是读写模式: f=open('/1.txt','w') 读写模式的类型有: rU 或 Ua 以读方式打开, 同时提 ...

  4. oracle中 connect by prior 递归算法 -- 理解

    oracle中 connect by prior 递归算法 -- 理解 http://blog.163.com/xxciof/blog/static/7978132720095193113752/  ...

  5. [转]机器学习——C4.5 决策树算法学习

    1. 算法背景介绍 分类树(决策树)是一种十分常用的分类方法.它是一种监管学习,所谓监管学习说白了很简单,就是给定一堆样本,每个样本都有一组属性和一个类别,这些类别是事先确定的,那么通过学习得到一个分 ...

  6. 研究一下uucode编码

    uucode编码是把任意二进制数据转换为ascii字符的编码用于在一些只能传递文本的地方传送二进制数据uu模块提供了encode()和decode()用于将一个文件转换为uucode编码的字符文件,文 ...

  7. view ondraw

    窗口发生重绘时会被应用程序的窗口框架给调用 要使输出的东西始终能在窗口中看到 就可以使用该函数  窗口从到有的时候就会产生WM_PAINT消息,让窗口发生重绘 这是程序就会执行到ONDRAW函数处 所 ...

  8. Javascript的location对象

    JavaScript window.location对象 示例 注意 方法 经常使用window.location,它的结构总是记不住,简单梳理下,方便以后查询. 示例 URL:http://b.a. ...

  9. ssh登陆设置快捷方式

    在自己的环境下配置 ~/.ssh/config Host k231 HostName 192.168.1.231 User kyee 原来ssh 登陆192.168.1.231 的命令是 ssh ky ...

  10. Linux系统挂载点与分区的关系(转载)

    计算机中存放信息的主要的存储设备就是硬盘,但是硬盘不能直接使用,必须对硬盘进行分割,分割成的一块一块的硬盘区域就是磁盘分区.在传统的磁盘管理中,将一个硬盘分为两大类分区:主分区和扩展分区.主分区是能够 ...