苹果8的主板多少钱一块主板维修多少钱

Mysql的游标的定义使用及关闭深入分析
字体:[ ] 类型:转载 时间:
于游标的用法Mysql现在提供的还很特别,虽然使用起来没有PL/SQL那么顺手,不过使用上大致上还是一样,本文将详细介绍一下,需要了解的朋友可以参考下
Mysql从5.0开始支持存储过程和trigger,给我们喜欢用mysql的朋友们更喜欢mysql的理由了,语法上和PL/SQL有差别,不过搞过编程的人都知道,语法不是问题,关键是思想,大致了解语法后,就从变量定义,循环,判断,游标,异常处理这个几个方面详细学习了。关于游标的用法Mysql现在提供的还很特别,虽然使用起来没有PL/SQL那么顺手,不过使用上大致上还是一样, 定义游标 declare fetchSeqCursor cursor for select seqname, value from sys_ 使用游标 open fetchSeqCursor; fetch数据 fetch cursor into _seqname, _ 关闭游标 close fetchSeqC 不过这都是针对cursor的操作而已,和PL/SQL没有什么区别吧,不过光是了解到这个是根本不足以写出Mysql的fetch过程的,还要了解其他的更深入的知识,我们才能真正的写出好的游标使用的procedure 首先fetch离不开循环语句,那么先了解一下循环吧。 我一般使用Loop和while觉得比较清楚,而且代码简单。 这里使用Loop为例
代码如下: fetchSeqLoop:Loop fetch cursor into _seqname, _ end L
现在是死循环,还没有退出的条件,那么在这里和oracle有区别,Oracle的PL/SQL的指针有个隐性变量%notfound,Mysql是通过一个Error handler的声明来进行判断的, declare continue handler for Not found (do some action); 在Mysql里当游标遍历溢出时,会出现一个预定义的NOT FOUND的Error,我们处理这个Error并定义一个continue的handler就可以叻,关于Mysql Error handler可以查询Mysql手册定义一个flag,在NOT FOUND,标示Flag,在Loop里以这个flag为结束循环的判断就可以叻。
代码如下: declare fetchSeqO ## define the flag for loop judgement declare _seqname varchar(50); ## define the varient for store the data declare _value bigint(20); declare fetchSeqCursor cursor for select seqname, value from sys_## define the cursor declare continue handler for NOT FOUND set fetchSeqOk = ## define the continue handler for not found flag set fetchSeqOk = open fetchSeqC fetchSeqLoop:Loop if fetchSeqOk then leave fetchSeqL else fetch cursor into _seqname, _ select _seqname, _
end L close fetchSeqC
这就是一个完整的过程叻,那么会思考的人一般在这里都会思考,如果是这样的话,怎样做嵌套的游标循环叻,这里可以根据statement block的scope实现叻,Mysql里通过begin end来划分一个statement block,在block里定义的变量范围也在这个block里,所以关于嵌套的游标循环我们可以多加一个begin end来区分他们所对应的error handler(注意在Mysql里同一个error的handler只能定义一次,多定义的话,在compile的过程中会提示里duplicate handler defination,所以NOT FOUND的handler就只能定义一次),在一个begin end里定义这个里面游标的NOT FOUND handler,
代码如下: declare fetchSeqO ## define the flag for loop judgement declare _seqname varchar(50); ## define the varient for store the data declare _value bigint(20); declare fetchSeqCursor cursor for select seqname, value from sys_## define the cursor declare continue handler for NOT FOUND set fetchSeqOk = ## define the continue handler for not found flag set fetchSeqOk = open fetchSeqC fetchSeqLoop:Loop if fetchSeqOk then leave fetchSeqL else fetch cursor into _seqname, _ begin declare fetchSeqOk boolean default 'inner'; declare cursor2 cursor for select .... from ...;## define the cursor declare continue handler for NOT FOUND set fetchSeqOk = ## define the continue handler for n ot set fetchSeqOk = open cursor2; fetchloop2 loop if fetchSeqOk then else
close cursor2;
end L close fetchSeqC
这样就可以轻松实现更多层次的循环了,不过相对oracle的PL/SQL来说,Mysql现在还不支持动态游标的定义,所以很强大的动态拼出SQL的在游标里还不能做到,不过这完全不影响我对Mysql的喜爱程度,她就想那羞涩的荷花一样,虽然没有灿烂的色彩,但那简约的色调,清新而不染一丝铅尘的高雅,一样吸引着无数的mysql迷么,正如接天莲叶无穷碧,映日荷花别样红。付:Mysql也有类似Oracle里的execute immediate的动态SQL的功能,通过这个功能可有多少弥补一些动态游标的缺憾叻 set @sqlStr='select * from table where condition1 = ?'; prepare s1 for @sqlStr; execute s1 using @condition1; 如果有多个参数用逗号分隔 deallocate prepare s1; 手工释放,或者是connection关闭时,server自动回收。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具mysql 存储过程中游标与多游标实例-mysql教程-数据库-壹聚教程网mysql 存储过程中游标与多游标实例
游标是mysql存储过程中一个比较强大的功能,用到最多的就是存储过程中游标功能了,下面将给您介绍一个关于mysql存储过程中游标一些实例,希望给你带来帮助。
DELIMITER $$
DROP PROCEDURE IF EXISTS getUserInfo $$
CREATE PROCEDURE getUserInfo(in date_day datetime)
-- MYSQL存储过程名为:getUserInfo
-- 参数为:date_day日期格式:
declare _userName varchar(12); -- 用户名
declare _ -- 语文
declare _&&& -- 数学
-- 定义游标
DECLARE rs_cursor CURSOR FOR SELECT username,chinese,math from userInfo where datediff(createDate, date_day)=0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
-- 获取昨天的日期
if date_day is null then
&& set date_day = date_add(now(),interval -1 day);
cursor_loop:loop
&& FETCH rs_cursor into _userName, _chinese, _ -- 取数据
&& if done=1 then
&&& leave cursor_
&& update infoSum set total=_chinese+_math where UserName=_userN
end loop cursor_
DELIMITER ;
以上就是MYSQL存储过程中使用游标的实例介绍,如果多游标怎么用,下面我再用同样的实例来介绍。
mysql的存储过程可以很方便使用游标来实现一些功能,存储过程的写法大致如下:
先创建一张表,插入一些测试数据:
DROP TABLE IF EXISTS netingcn_proc_
CREATE TABLE `netingcn_proc_test` (
& `id` INTEGER(11) NOT NULL AUTO_INCREMENT,
& `name` VARCHAR(20),
& `pass` VARCHAR(20),
& PRIMARY KEY (`id`)
)ENGINE=InnoDB;
insert into netingcn_proc_test(name, password) values
('procedure1', 'pass1'),
('procedure2', 'pass2'),
('procedure3', 'pass3'),
('procedure4', 'pass4');
下面就是一个简单存储过程的例子:
drop procedure IF EXISTS test_
delimiter //
create procedure test_proc()
&-- 声明一个标志done, 用来判断游标是否遍历完成
&DECLARE done INT DEFAULT 0;
&-- 声明一个变量,用来存放从游标中提取的数据
&-- 特别注意这里的名字不能与由游标中使用的列明相同,否则得到的数据都是NULL
&DECLARE tname varchar(50) DEFAULT NULL;
&DECLARE tpass varchar(50) DEFAULT NULL;
&-- 声明游标对应的 SQL 语句
&DECLARE cur CURSOR FOR
&& name, password from netingcn_proc_
&-- 在游标循环到最后会将 done 设置为 1
&DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
&-- 执行查询
&-- 遍历游标每一行
&&-- 把一行的信息存放在对应的变量中
&&FETCH cur INTO tname,
&&if not done then
&&&-- 这里就可以使用 tname, tpass 对应的信息了
&&&select tname,
&&UNTIL done END REPEAT;
-- 执行存储过程
call test_proc();需要注意的是变量的声明、游标的声明和HANDLER声明的顺序不能搞错,必须是先声明变量,再申明游标,最后声明HANDLER。上述存储过程的例子中只使用了一个游标,那么如果要使用两个或者更多游标怎么办,其实很简单,可以这么说,一个怎么用两个就是怎么用的。例子如下:
drop procedure IF EXISTS test_proc_1;
delimiter //
create procedure test_proc_1()
&DECLARE done INT DEFAULT 0;
&DECLARE tid int(11) DEFAULT 0;
&DECLARE tname varchar(50) DEFAULT NULL;
&DECLARE tpass varchar(50) DEFAULT NULL;
&DECLARE cur_1 CURSOR FOR
&&select name, password from netingcn_proc_
&DECLARE cur_2 CURSOR FOR
&&select id, name from netingcn_proc_
&DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
&open cur_1;
&&FETCH cur_1 INTO tname,
&&if not done then
&&&select tname,
&&UNTIL done END REPEAT;
&CLOSE cur_1;
&-- 注意这里,一定要重置done的值为 0
&set done = 0;
&open cur_2;
&&FETCH cur_2 INTO tid,
&&if not done then
&&&select tid,
&&UNTIL done END REPEAT;
&CLOSE cur_2;
call test_proc_1();
上述代码和第一个例子中基本一样,就是多了一个游标声明和遍历游标。这里需要注意的是,在遍历第二个游标前使用了set done = 0,因为当第一个游标遍历玩后其值被handler设置为1了,如果不用set把它设置为 0 ,那么第二个游标就不会遍历了。当然好习惯是在每个打开游标的操作前都用该语句,确保游标能真正遍历。当然还可以使用begin语句块嵌套的方式来处理多个游标,例如:
drop procedure IF EXISTS test_proc_2;
delimiter //
create procedure test_proc_2()
&DECLARE done INT DEFAULT 0;
&DECLARE tname varchar(50) DEFAULT NULL;
&DECLARE tpass varchar(50) DEFAULT NULL;
&DECLARE cur_1 CURSOR FOR
&&select name, password from netingcn_proc_
&DECLARE cur_2 CURSOR FOR
&&select id, name from netingcn_proc_
&DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
&open cur_1;
&&FETCH cur_1 INTO tname,
&&if not done then
&&&select tname,
&&UNTIL done END REPEAT;
&CLOSE cur_1;
&&DECLARE done INT DEFAULT 0;
&&DECLARE tid int(11) DEFAULT 0;
&&DECLARE tname varchar(50) DEFAULT NULL;
&&DECLARE cur_2 CURSOR FOR
&&&select id, name from netingcn_proc_
&&DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
&&open cur_2;
&&&FETCH cur_2 INTO tid,
&&&if not done then
&&&&select tid,
& &UNTIL done END REPEAT;
&&CLOSE cur_2;
call test_proc_2();
关于mysql中
上一页: &&&&&下一页:相关内容当前位置:&&
MySQL存储过程中游标循环的跳出和继续操作示例
&&&&来源:&互联网& 发布时间:
最近遇到这样的问题,在MySQL的存储过程中,游标操作时,需要执行一个conitnue的操作.众所周知,MySQL中的游标循环操作常用的有三种,LOOP,REPEAT,WHILE.三种循环,方式大同小异.以前从没用过,所以记下来,方便以后查阅.
UNTIL expression
END REPEAT
DECLARE num INT;
DECLARE my_string
VARCHAR(255);
my_string =CONCAT(my_string,num,',');
num = num +1;
UNTIL num &5
END REPEAT;
WHILE expression DO
DECLARE num INT;
DECLARE my_string
VARCHAR(255);
SET num =1;
SET str ='';
& span&10DO
my_string =CONCAT(my_string,num,',');
num = num +1;
END WHILE;
3.LOOP(这里面有非常重要的ITERATE,LEAVE)
DECLARE num
DECLARE str
VARCHAR(255);
SET num =1;
SET my_string ='';
loop_label:
num &10THEN
num = num +1;
IF(num mod3)THEN
my_string =CONCAT(my_string,num,',');
PS:可以这样理解ITERATE就是我们程序中常用的contiune,而ITERATE就是break.当然在MySQL存储过程,需要循环结构有个名称,其他都是一样的.
官方的文档--&/doc/refman/5.0/en/loop.html
相关技术文章: &&&&
MySQL作为最常用的数据库,经常遇到各种各样的问题。今天要说的就是表存储引擎的修改。有三种方式,列表如下。
1.真接修改。在数据多的时候比较慢,而且在修改时会影响读取性能。my_table是操作的表,innoDB是新的存储引擎。
代码如下:ALTER TABLE my_table ENGINE=InnoDB
2.导出,导入。这个比较容易操作,直接把导出来的sql文件给改了,然后再导回去。用mysqldump ,枫哥常用的是navicate那样更容易上手。友情提醒风险较大。
3.创建,插入。这个比第一种速度快, 安全性比第二种高,推荐。分2步操...... &&&&
在数据库中,对性能影响最大的包括数据库的锁策略、缓存策略、索引策略、存储策略、执行计划优化策略。
索引策略决定数据库快速定位数据的效率,存储策略决定数据持久化的效率。
1.索引不存储null值。
更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本
没Null值,不能利用到索引,只能全表扫描。
为什么索引列不能存Null值?
将索引列值进行建树,其中必然涉及到诸多的比较操作。Null值的特殊性就在于参与的运算大多取值为n...... &&&&
上次介绍了如何使用ansible playbook安装zabbix客户端(http://www./article/52158.htm),这次介绍一下如何使用playbook安装mysql。
下面是安装mysql的信息:
mysql_basedir: /data/mysql/basedir
mysql_datadir: /data/mysql/datadir
mysql_user: mysql
mysql_database_user: root
数据库用户
mysql_passwd: 'E4yR3WnoluSFTCBAI'
数据库密码
mysql_port: 3306
mysql监听端口
mysql_sock: /data/mysql/datadir/mysql.sock
mysql的sock
mysql_charset: utf8
mysql字符集
mysql_collation: utf8_general_ci
mysql排序方式
mysql_version: Percona-Server-......&nbsp最新技术文章: &&&&
本文分析了mysqld进程关闭的过程,以及如何安全、缓和地关闭MySQL实例,对这个过程不甚清楚的同学可以参考下。
关闭过程:
1、发起shutdown,发出SIGTERM信号
2、有必要的话,新建一个关闭线程(shutdown thread)
如果是客户端发起的关闭,则会新建一个专用的关闭线程
如果是直接收到 SIGTERM 信号进行关闭的话,专门负责信号处理的线程就会负责关闭工作,或者新建一个独立的线程负责这个事
当无法创建独立的关闭线程时(例如内存不足),MySQL Server会发出类似下面的告警信息:
Error: Can't create thread to kill se...... &&&&
有一天,两个不懂mysql内核的人想去了解mysql内核代码,两个人不是去调试代码、查找资料,而是在那边思考。因为不了解内核,所以边思考边去验证。
使用的mysql代码是5.1.7,调试环境是windows平台下的vs2003。
Bingxi:“alex,你觉得mysql的启动过程会是什么样的呢?我们以银行为例吧。”
Alex:“嗯,bingxi。早上银行开门了,会先准备好环境,然后开门迎客,mysql也是这样。Mysql里面会有一个handle_connections_sockets函数,这个函数就好比是个叫号机,每个用户来了都会取个号,然后就会进行业务处理。”
代码如下:...... &&&&
mysqladmin是MySQL一个重要的客户端,最常见的是使用它来关闭数据库,除此,该命令还可以了解MySQL运行状态、进程信息、进程杀死等。本文介绍一下如何使用mysqladmin extended-status(因为没有"歧义",所以可以使用ext代替)了解MySQL的运行状态。
1. 使用-r/-i参数
使用mysqladmin extended-status命令可以获得所有MySQL性能指标,即show global status的输出,不过,因为多数这些指标都是累计值,如果想了解当前的状态,则需要进行一次差值计算,这就是mysqladmin extended-status的一个额外功能,非常实用。默认的,使用extended-status,看到也是累计值,但是,加上参数......&nbsp
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!
(C)2012-,E-mail:www_169it_(请将#改为@)君,已阅读到文档的结尾了呢~~
mysql存储过程中游标循环的跳出和继续操作示例
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
mysql存储过程中游标循环的跳出和继续操作示例
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 苹果8的主板多少钱一块 的文章

 

随机推荐