mysql存储过程、函数和触发器的创建 [转]
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存储过程、函数和触发器的创建 [转]的更多相关文章
- MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器
———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...
- MySQL 存储过程 函数 routine 权限
MySQL 存储过程 函数 routine 权限 Table of Contents 1. mysql存储过程/函数权限 1.1. 相关对象操作权限检查 1.2. 执行权限 1 mysql存储过程/函 ...
- MySQL自定义函数、触发器、存储过程
存储过程 概念 存储过程,是一个数据库对象,类似一个函数. 在存储过程中可以使用SQL中的绝大部分内容,并且可以加入编程语言的特性(循环判断分支). 编写好存储过程之后,可以在客户端调用存储过程,存储 ...
- mysql 存储过程 函数 触发器
mysql存储过程与函数 存储过程下载 demo mysql> delimiter // -- 这里//为修改默认分隔符: mysql> CREATE PROCEDURE simplep ...
- mysql使用存储过程&函数实现批量插入
写这边文章的目的,是想结合mysql 存储过程+函数完成一个批量删除的功能吧...正好也好加深下对procedure和function的熟练操作吧...废话不多说,我就直接上表结构啦哈,如下: cre ...
- Paip.断点调试MYSQL存储过程跟函数的解决方案大法
Paip.断点调试MYSQL存储过程跟函数的解决方案大法 作者Attilax , EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- MySQL 第十天(视图、存储过程、函数、触发器)
MySql高级-视图.函数.存储过程.触发器 目录 一.视图 1 1.视图的定义 1 2.视图的作用 1 (1)可以简化查询. 1 (2)可以进行权限控制, 3 3.查询 ...
- Mysql 存储过程、函数、触发器和视图的权限检查
当存储过程.函数.触发器和视图创建后,不单单创建者要执行,其它用户也可能需要执行,换句话说,执行者有可能不是创建者本身,那么在执行存储过程时,MySQL是如何做权限检查的? 在默认情况下,MySQL将 ...
随机推荐
- 自制Javascript分页插件,支持AJAX加载和URL带参跳转两种初始化方式,可用于同一页面的多个分页和不同页面的调用
闲话部分 最近闲着实在无聊,就做了点小东西练练手,由于原来一直在用AspNetPager进行分页,而且也进行了深度的定制与原有系统整合的也不错,不过毕竟是用别人的,想着看自己能试着做出来不能,后台的分 ...
- 注意mysql中的编码格式和php中的编码格式一致
今天发现用php代码插入英文可以,但是中文插入不进去,注意编码要一致,@mysql_connect("localhost","root","12345 ...
- PHP Socket编程起步
让我们以一个简单的例子开始---一个接收输入字符串,处理并返回这个字符串到客户端的TCP服务.下面是相应的代码: PHP 代码: ) or die("Could not read input ...
- iOS 改变UITextField中光标颜色
第一种: [[UITextField appearance] setTintColor:[UIColor blackColor]]; 这个方法会影响整个app的所有UITextFiled... 第二种 ...
- Php RSS
RSS 聚合最近非常流行,因此至少对 RSS 及其工作方式有所了解是一名 PHP 开发人员的迫切需要.本文介绍了 RSS 基础知识.RSS 众多用途中的一些用途.如何使用 PHP 从数据库创建 RSS ...
- WPF自定义Main函数
第一步:在app.xaml.cs里加入以下代码: [STAThread] public static void Main(string[] args) { App app = new App(); a ...
- 1.tomcat部署项目的几种方式和weblogic部署方式及一点通讯
第一种部署方式: 直接使用myeclipse 找到server服务 添加要部署的项目Add Deployment ,然后选中某个项目,首选Exploded Archive(development ...
- .net概述1
1.什么是.net 首先我先说说这个词的读音,很多外行朋友读作"点net"甚至许多圈内朋友也这样读,其实它正确读法应该是读作"dot net",音译即为&quo ...
- 为什么要刷新一下才能获取cookie
首先编写以下简单的代码: <?php setcookie('a','value'); print $_COOKIE['a']; 第一次访问时,报错: 报错的原因是$_COOKIE['a']的值不 ...
- DeDe缩略图路径的修改
今天在使用dedecms的时候,遇到的一点小问题,移站的时候缩略图不显示.然后就去百度搜了一下,出来的都是千篇一律. 因为一个网站里面缩略图太多,手动比较慢而已费时间, 俗话说的好“时间就是生命” ...