2013年6月26日星期三

【转】XShell下乱码的解决方法

首先检查系统的language设置的是否是中文。
在终端下输入命令∶
# echo $LANG
若不是,则需要修改环境变量。修改环境变量有多种方法,简单总结三种比较常用的∶
1>只针对当前终端的修改,对其他用户没有影响
    在命令行下输入∶
    # export LANG=ja_JP.UTF-8
    这种修改只对当前终端有效,终端退出后即结束。若想要查看系统支持的语言和字符集,可以用命令
    # locale -a
2>针对当前用户的修改,修改当前用户的bash配置文件。当用户一登陆即export进LANG变量
    先进入当前用户的home目录,如root用户的home目录是/root/,其他用户的home目录一般是/home/username/
    # ls -a
    可以看到.bash_profile这个隐藏文件,在终端下输入一下命令∶
    # echo “export LANG=ja_JP.UTF-8” >> .bash_profile
    此命令的作用是吧echo命令的输出重定向输出到.bash_profile的末尾
3>针对所有用户的修改
    编辑/etc/sysconfig/i18n这个文件,i18n是internationalization的缩写,表示i和n之间有18个字母,本意是 指软件的国际化。i18n支持多种语言,但同一时间只能是英文和一种选定的语言,例如英文+中文、英文+日文等等。
    修改LANG变量的值即可
    以 上只是修改了系统的字符编码。但是即便编码正确,在xshell下也可能会乱码。因为xshell也有编码的设置。在xshell的工具栏上有一个 encoding的按钮,单击这个按钮可以选择编码。如果是日文乱码,一般可以选择Unicode(UTF-8)、Japanese(EUC)、 Japanese(shift-JIS)这三种,具体是哪一种能够正确的显示并不乱码跟要显示的文件所用的编码有关。
    当然,除了第一种方式可以马上使设置生效,第二种方式和第三种方式需要重启shell。

摘自:http://www.cnblogs.com/dongzhiquan/archive/2011/03/20/1994499.html

【转】VirtualBox在NAT下的端口映射

在win7下装的virualbox,虚拟系统为ubuntu下,网络设置为NAT,在ubuntu先安装tomcat,但是web应用程序由于框架的限制对firefox有点不兼容,只能用ie。但是在NAT下无法在局域网中访问ubuntu,只好采取端口映射。

 

1查看设备名称

  在VirtualBox菜单栏,单开“控制”--》“日志菜单”,点击查找写入关键字“NAT”查找类似以下内容

 

Java代码  收藏代码
  1. 00:00:00.688 [/Devices/e1000/0/LUN#0/] (level 4)  
  2. 00:00:00.688   Driver <string>  = "NAT" (cb=4)  

 

       /Devices/e1000/0/LUN#0/设备标识。

2 在cmd下执行以下命令,可以放在bat下执行

 

Java代码  收藏代码
  1. VBoxManage.exe  setextradata "ubuntu" "VBoxInternal/Devices/e1000/0/LUN#0/Config/http/Protocol" TCP  
  2.   
  3. VBoxManage.exe  setextradata "ubuntu" "VBoxInternal/Devices/e1000/0/LUN#0/Config/http/GuestPort" 8080  
  4.   
  5. VBoxManage.exe  setextradata "ubuntu" "VBoxInternal/Devices/e1000/0/LUN#0/Config/http/HostPort" 8080  
  6.   
  7.   
  8. VBoxManage.exe  setextradata "ubuntu" "VBoxInternal/Devices/e1000/0/LUN#0/Config/shell/Protocol" TCP  
  9.   
  10. VBoxManage.exe  setextradata "ubuntu" "VBoxInternal/Devices/e1000/0/LUN#0/Config/shell/GuestPort" 22  
  11.   
  12. VBoxManage.exe  setextradata "ubuntu" "VBoxInternal/Devices/e1000/0/LUN#0/Config/shell/HostPort" 22  

 上面对ssh端口和tomcat的端口(这里用的是8080)进行了映射,其中 VBoxManage.exe 安装在virtualBox目录下,

后面“ubuntu”是虚拟系统的名字,后面是设备标识,对照步骤1应该可以明白,config后面一个名字例如http和shell

可以任意取,GuestPort是虚拟机中所启动服务的端口,HostPost是主机上的映射端口。执行完毕之后,重新启动

虚拟机,就可以了。注意是启动虚拟机不是重启虚拟的ubuntu系统。


摘自:http://jiajw0426.iteye.com/blog/812647

2013年6月24日星期一

【转】 Windows中VirtualBox虚拟机实现桥接方式(Bridged Adapter)

VirtualBox 装好之后默认的网络是NAT模式,但这种模式中虚拟机配置的IP和主机的不再同一网段内,无法获得和主机一样的局域网地位,更不可能从主机用远程桌面携带硬盘的方式远程控制。而最简便的方法就是虚拟机使用桥接的网络方式。

海波很久没有写点像样的东西,写这篇算冲个数吧,也没什么技术含 量,新手入门级的。今天海波第一次使用 VirtualBox 这款虚拟机软件,用的还是绿色版的(Portable-VirtualBox),如有需要可以搜索之或者在文末下载。网上有好多 Linux 下的桥接教程,Windows下的不多哦。

首先说一下我的环境,主机系统是 Windows 7 旗舰版;VirtualBox 虚拟机是 3.0.4 r50677 的绿色版本 Portable-VirtualBox,各个版本的设置应该是大同小异吧;虚拟机安装 Windows XP SP3。
http://www.renhaibo.com/archives/136.html

问题及解决过程如下(虚拟机安装操作系统省略)

1.在刚装好的XP虚拟机的网络设置界面如下图,当链接方式为"Bridged Adapter"的时候,下面的"名称"显示"未指定",而且在下面有错误提示如"发现无效设置"和"在 网络:网络连接 1 页,未指定要bridged的主机网络界面"。
http://www.renhaibo.com/archives/136.html

2.这是因为 Windows 7 系统中没有安装 VirtualBox 的桥接服务驱动(也可能是我用绿色版本的原因),接下来将要安装驱动。

3.打开本地连接的属性界面,如下图
http://www.renhaibo.com/archives/136.html

4.选择"安装(N)...",进入如下图界面
http://www.renhaibo.com/archives/136.html

5.选择"服务",点击"添加(A)..."按钮,进入如下界面
http://www.renhaibo.com/archives/136.html

6.点击"从磁盘安装(H)...",出现可以浏览目录的界面
http://www.renhaibo.com/archives/136.html

7.点击"浏览(B)...",并找到 VirtualBox 的安装目录
http://www.renhaibo.com/archives/136.html

8.进入目录后选择文件夹"app32"(因为我用的是32的系统,如果您用64位系统的话估计得选择"app64"文件夹),然后是驱动目录 "drivers",再就是网络目录"network",再往后您就要根据您的情况选择了,不清楚的话也可以挨个试试,这里我选的是"netflt"中的 "VBoxNetFlt_m"。过程图解如下6张图。
http://www.renhaibo.com/archives/136.html
http://www.renhaibo.com/archives/136.html
http://www.renhaibo.com/archives/136.html
http://www.renhaibo.com/archives/136.html
http://www.renhaibo.com/archives/136.html

9.点"打开"后一路点"确定"就会安装成功,中间安装过程可能需要等待一会儿,如下3张图片
http://www.renhaibo.com/archives/136.html
http://www.renhaibo.com/archives/136.html
http://www.renhaibo.com/archives/136.html

10.至此,桥接服务已经安装好了,可以选择桥接的网络模式了
http://www.renhaibo.com/archives/136.html

这样 VirtualBox 虚拟机中系统和宿主主机中的系统在网络中的地位是平等的,就可以用远程桌面的方式去访问虚拟机了,这样我觉得要比直接在虚拟机中操作要好,只是我个人的感觉而已,用 VMware 海波也是这么干的,是不是有点变态啊。

关于远程桌面的文章可以参考:远程桌面之服务器端的设置》、《远程桌面之网络环境的配置》和《远程桌面之客户端的设置》。

附件(绿色版VirtualBox下载地址):Portable-VirtualBox(请下载后查杀毒)

转载请注明,转自:RenHaibo.com
本文链接地址:http://www.renhaibo.com/archives/136.html

【转】VitualBox网络连接形式

VirtualBox的提供了四种网络接入模式,它们分别是:

1、NAT    网络地址转换模式(NAT,Network Address Translation)

2、Bridged Adapter    桥接模式

3、Internal    内部网络模式

4、Host-only Adapter  主机模式

 

下面我们分别对这四种网络模式进行分析解释:

第一种:NAT模式

NAT模式是最简单的实现虚拟机上网的方式,你可以这样理解:Vhost访问网络的所有数据都是由主机提供的,vhost并不真实存在于网络中,主机与网络中的任何机器都不能查看和访问到Vhost的存在。

 

虚拟机与主机关系:只能单向访问,虚拟机可以通过网络访问到主机,主机无法通过网络访问到虚拟机。

 

虚拟机与网络中其他主机的关系:只能单向访问,虚拟机可以访问到网络中其他主机,其他主机不能通过网络访问到虚拟机。

 

虚拟机与虚拟机之间的关系:相互不能访问,虚拟机与虚拟机各自完全独立,相互间无法通过网络访问彼此。

 

IP:10.0.2.15

网关:10.0.2.2

DNS:10.0.2.3

 

一 台虚拟机的多个网卡可以被设定使用 NAT, 第一个网卡连接了到专用网 10.0.2.0,第二个网卡连接到专用网络 10.0.3.0,等等。默认得到的客户端ip(IP Address)是10.0.2.15,网关(Gateway)是10.0.2.2,域名服务器(DNS)是10.0.2.3,可以手动参考这个进行修 改。

 

NAT方案优缺点:

笔记本已插网线时: 虚拟机可以访问主机,虚拟机可以访问互联网,在做了端口映射后(最后有说明),主机可以访问虚拟机上的服务(如数据库)。

 

笔记本没插网线时: 主机的“本地连接”有红叉的,虚拟机可以访问主机,虚拟机不可以访问互联网,在做了端口映射后,主机可以访问虚拟机上的服务(如数据库)。

 

第二种:Bridged Adapter模式

网桥模式是我最喜欢的用的一种模式,同时,模拟度也是相当完美。你可以这样理解,它是通过主机网卡,架设了一条桥,直接连入到网络中了。因此,它使得虚拟机能被分配到一个网络中独立的IP,所有网络功能完全和在网络中的真实机器一样。

 

虚拟机与主机关系:可以相互访问,因为虚拟机在真实网络段中有独立IP,主机与虚拟机处于同一网络段中,彼此可以通过各自IP相互访问。

 

虚拟机于网络中其他主机关系:可以相互访问,同样因为虚拟机在真实网络段中有独立IP,虚拟机与所有网络其他主机处于同一网络段中,彼此可以通过各自IP相互访问。

 

虚拟机于虚拟机关系:可以相互访问,原因同上。

 

IP:一般是DHCP分配的,与主机的“本地连接”的IP 是同一网段的。虚拟机就能与主机互相通信。

 

笔记本已插网线时:(若网络中有DHCP服务器)主机与虚拟机会通过DHCP分别得到一个IP,这两个IP在同一网段。 主机与虚拟机可以ping通,虚拟机可以上互联网。

 

笔记本没插网线时:主机与虚拟机不能通信。主机的“本地连接”有红叉,就不能手工指定IP。虚拟机也不能通过DHCP得到IP地址,手工指定IP后,也无法与主机通信,因为主机无IP。

 

这时主机的VirtualBox Host-Only Network 网卡是有ip的,192.168.56.1。虚拟机就算手工指定了IP 192.168.56.*,也ping不能主机。

 

第三种:Internal模式

内网模式,顾名思义就是内部网络模式,虚拟机与外网完全断开,只实现虚拟机于虚拟机之间的内部网络模式。

 

虚拟机与主机关系:不能相互访问,彼此不属于同一个网络,无法相互访问。

虚拟机与网络中其他主机关系:不能相互访问,理由同上。

虚拟机与虚拟机关系:可以相互访问,前提是在设置网络时,两台虚拟机设置同一网络名称。如上配置图中,名称为intnet。

 

IP: VirtualBox的DHCP服务器会为它分配IP ,一般得到的是192.168.56.101,因为是从101起分的,也可手工指定192.168.56.*。

 

笔记本已插网线时:虚拟机可以与主机的VirtualBox Host-Only Network 网卡通信

 

这种方案不受主机本地连接(网卡)是否有红叉的影响。

 

第四种:Host-only Adapter模式

主机模式,这是一种比较复杂的模式,需要有比较扎实的网络基础知识才能玩转。可以说前面几种模式所实现的功能,在这种模式下,通过虚拟机及网卡的设置都可以被实现。

 

我们可以理解为Vbox在主机中模拟出一张专供虚拟机使用的网卡,所有虚拟机都是连接到该网卡上的,我们可以通过设置这张网卡来实现上网及其他很多功能,比如(网卡共享、网卡桥接等)。

 

虚拟机与主机关系:默认不能相互访问,双方不属于同一IP段,host-only网卡默认IP段为192.168.56.X 子网掩码为255.255.255.0,后面的虚拟机被分配到的也都是这个网段。通过网卡共享、网卡桥接等,可以实现虚拟机于主机相互访问。

 

虚拟机与网络主机关系:默认不能相互访问,原因同上,通过设置,可以实现相互访问。

 

虚拟机与虚拟机关系:默认可以相互访问,都是同处于一个网段。

 

虚拟机访问主机:用的是主机的VirtualBox Host-Only Network网卡的IP:192.168.56.1  ,不管主机“本地连接”有无红叉,永远通。

 

主机访问虚拟机:用是的虚拟机的网卡3的IP: 192.168.56.101  ,不管主机“本地连接”有无红叉,永远通。

 

虚拟机访问互联网,用的是自己的网卡2, 这时主机要能通过“本地连接”有线上网,(无线网卡不行)

 

通过对以上几种网络模式的了解,我们就可以灵活运用,模拟组建出我们所想要的任何一种网络环境了。

 

比 如我想模拟出来一个一台主机,监控一个局域网上网情况的网络环境。首先我开启了两台虚拟机vhost1与vhost2,当然如果硬件允许,我同样可以再增 加vhost3、vhost4…所有的vhost我都设置成internat内网模式,网络名称为intnal,网关为192.168.56.100,意 思就是通过192.168.56.100网卡上网。其中有一台vhost1我设置为双网卡,一张为内网模式(192.168.56.100),一张为网桥 模式(192.168.1.101)。两张网卡设置双网卡共享上网。

 

虚拟机之间为局域网,其中有一台虚拟机vhost1通过与外网相连,所有局域网中的虚拟机又通过vhost1来实现上外网。这样vhost1就可以监控整个虚拟机局域网上网情况了。


摘自:http://blog.163.com/paladin_stalin/blog/static/16470658920111121103740814/

http://www.07net01.com/linux/VitualBoxwangluolianjiexingshi_37824_1354863027.html

2013年6月21日星期五

【转】sql server和mysql变量赋值的区别 以及 MySql Declare

sql server和mysql都是我们经常用到的数据库系统,下面就为您介绍sql server和mysql变量赋值的区别,希望对您能有所启迪。

sql server中变量要先申明后赋值:

局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的);

申明局部变量语法:declare @变量名 数据类型;例如:declare @num int;

赋值:有两种方法式(@num为变量名,value为值)

set @num=value;   或   select @num=value;

如果想获取查询语句中的一个字段值可以用select给变量赋值,如下:

select @num=字段名 from 表名 where ……

mysql变量赋值不用事前申明,在用的时候直接用“@变量名”使用就可以了。

第一种用法:set @num=1; 或set @num:=1; //这里要使用变量来保存数据,直接使用@num变量

第二种用法:select @num:=1; 或 select @num:=字段名 from 表名 where …… (张英:似乎mysql中不能使用 select @p1 := c1, @p2:=c2 from tb 方式赋值)

注意上面两种赋值符号,使用set时可以用“=”或“:=”,但是使用select时必须用“:=赋值”


mysql可以在SP中声明不带@的局部变量,具体见declare。

 

Declare

 

20.2.8. DECLARE语句

DECLARE语句被用来把不同项目局域到一个 子程序:局部变量(请参阅20.2.9节,“存储程序中的变量”),条件和 处理程序(请参阅20.2.10节,“条件和处理程序”) 及光标(请参阅20.2.11节,“光标”)。SIGNAL和RESIGNAL语句当前还不被支持。

DECLARE仅被用在BEGIN ... END复合语句里,并且必须在复合语句的开头,在任何其它语句之前。

光标必须在声明处理程序之前被声明,并且变量和条件必须在声明光标或处理程序之前被声明。

20.2.9. 存储程序中的变量

你可以在子程序中声明并使用变量。

20.2.9.1. DECLARE局部变量

DECLARE var_name[,...] type [DEFAULT value]

这个语句被用来声明局部变量。要给变量提供一个默认值,请包含一个DEFAULT子句。值可以被指定为一个表达式,不需要为一个常数。如果没有DEFAULT子句,初始值为NULL。

局部变量的作用范围在它被声明的BEGIN ... END块内。它可以被用在嵌套的块中,除了那些用相同名字 声明变量的块。

20.2.9.2. 变量SET语句

  SET var_name = expr [, var_name = expr] ...

在存储程序中的SET语句是一般SET语句的扩展版本。被参考变量可能是子程序内声明的变量,或者是全局服务器变量。

在 存储程序中的SET语句作为预先存在的SET语法的一部分来实现。这允许SET a=x, b=y, ...这样的扩展语法。其中不同的变量类型(局域 声明变量及全局和集体变量)可以被混合起来。这也允许把局部变量和一些只对系统变量有意义的选项合并起来。在那种情况下,此选项被识别,但是被忽略了。

20.2.9.3. SELECT ... INTO语句

SELECT col_name[,...] INTO var_name[,...] table_expr

这个SELECT语法把选定的列直接存储到变量。因此,只有单一的行可以被取回。

SELECT id,data INTO x,y FROM test.t1 LIMIT 1;

注意,用户变量名在MySQL 5.1中是对大小写不敏感的。请参阅9.3节,“用户变量”

重要: SQL变量名不能和列名一样。如果SELECT ... INTO这样的SQL语句包含一个对列的参考,并包含一个与列相同名字的 局部变量,MySQL当前把参考解释为一个变量的名字。例如,在下面的语句中,xname 被解释为到xname variable 的参考而不是到xname column的:

  CREATE PROCEDURE sp1 (x VARCHAR(5))
 BEGIN
    DECLARE xname VARCHAR(5) DEFAULT 'bob';
    DECLARE newname VARCHAR(5);
    DECLARE xid INT;
    
    SELECT xname,id INTO newname,xid 
      FROM table1 WHERE xname = xname;
    SELECT newname;
 END;
当这个程序被调用的时候,无论table.xname列的值是什么,变量newname将返回值‘bob’。

摘自:http://www.cnblogs.com/end/archive/2011/03/30/1999646.html

【转】MYSQL使用游标嵌套的两个实例

在实际业务逻辑开发中,难免用到游标嵌套,举例如下:

delimiter //
drop procedure if exists good_nested_cursors1
//
CREATE   PROCEDURE good_nested_cursors1(  )
   READS SQL DATA
BEGIN
  DECLARE l_grade_id INT;
  DECLARE l_class_id   INT;
  DECLARE l_class_cnt     INT DEFAULT 0 ;
  DECLARE l_done          INT DEFAULT  0;
  
  DECLARE grade_csr cursor  FOR    SELECT grade_id FROM org_grade;
  DECLARE class_csr cursor  FOR     SELECT class_id FROM org_class  WHERE grade_id=l_grade_id;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_done=1;
  OPEN grade_csr;
  grade_loop: LOOP   -- Loop through org_grade
    FETCH grade_csr into l_grade_id;
                select concat('年级:', l_grade_id);
    IF l_done=1 THEN
       LEAVE grade_loop;
    END IF;
    OPEN class_csr;
    SET l_class_cnt=0;
    class_loop: LOOP      -- Loop through class in grade.
      FETCH class_csr INTO l_class_id;
      IF l_done=1 THEN
         LEAVE class_loop;
      END IF;
      SET l_class_cnt=l_class_cnt+1;
      select concat('    班级:', l_class_id);
    END LOOP;
    CLOSE class_csr;
    SET l_done=0;
  
  END LOOP grade_loop;
  CLOSE grade_csr;
END;
//
delimiter ;
///////////////////////////////////////////////////////
//另一个例子:
CREATE PROCEDURE curdemo() 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT '' 
BEGIN 
declare done1,done2 int default 0; 
declare name1,name2 varchar(20); 
declare id1,id2 int;
   
declare cur1 cursor for select id,name from test1; 
declare continue handler for not found set done1 = 1;
open cur1;
repeat 
fetch cur1 into id1, name1; 
if not done1 then 
insert into test3(name) values(name1); 
begin 
declare cur2 cursor for select id,name from test2; 
declare continue handler for not found set done2 = 1; 
open cur2; 
repeat 
fetch cur2 into id2,name2; 
if not done2 then 
insert into test3(name) values(name2); 
end if;   
until done2 end repeat; 
close cur2; 
set done2=0; 
end; 
end if; 
until done1 end repeat; 
close cur1;
commit; 
END;
///
作者 蔡磊

摘自:http://www.qi9.cn/html/759_5400.html

【转】mysql 存储过程中使用多游标

mysql的存储过程可以很方便使用游标来实现一些功能,存储过程的写法大致如下:

先创建一张表,插入一些测试数据:

DROP TABLE IF EXISTS netingcn_proc_test;    CREATE TABLE `netingcn_proc_test` (    `id` INTEGER(11) NOT NULL AUTO_INCREMENT,    `name` VARCHAR(20),    `password` 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_proc;  delimiter //  create procedure test_proc()  begin  	-- 声明一个标志done, 用来判断游标是否遍历完成  	DECLARE done INT DEFAULT 0;    	-- 声明一个变量,用来存放从游标中提取的数据  	-- 特别注意这里的名字不能与由游标中使用的列明相同,否则得到的数据都是NULL  	DECLARE tname varchar(50) DEFAULT NULL;  	DECLARE tpass varchar(50) DEFAULT NULL;    	-- 声明游标对应的 SQL 语句  	DECLARE cur CURSOR FOR  		select name, password from netingcn_proc_test;    	-- 在游标循环到最后会将 done 设置为 1  	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;    	-- 执行查询  	open cur;  	-- 遍历游标每一行  	REPEAT  		-- 把一行的信息存放在对应的变量中  		FETCH cur INTO tname, tpass;  		if not done then  			-- 这里就可以使用 tname, tpass 对应的信息了  			select tname, tpass;  		end if;   	UNTIL done END REPEAT;  	CLOSE cur;  end  //  delimiter ;    -- 执行存储过程  call test_proc();

需要注意的是变量的声明、游标的声明和HANDLER声明的顺序不能搞错,必须是先声明变量,再申明游标,最后声明HANDLER。上述存储过程的 例子中只使用了一个游标,那么如果要使用两个或者更多游标怎么办,其实很简单,可以这么说,一个怎么用两个就是怎么用的。例子如下:

drop procedure IF EXISTS test_proc_1;  delimiter //  create procedure test_proc_1()  begin  	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_test;    	DECLARE cur_2 CURSOR FOR  		select id, name from netingcn_proc_test;    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;    	open cur_1;  	REPEAT  		FETCH cur_1 INTO tname, tpass;  		if not done then  			select tname, tpass;  		end if;   	UNTIL done END REPEAT;  	CLOSE cur_1;    	-- 注意这里,一定要重置done的值为 0  	set done = 0;    	open cur_2;  	REPEAT  		FETCH cur_2 INTO tid, tname;  		if not done then  			select tid, tname;  		end if;   	UNTIL done END REPEAT;  	CLOSE cur_2;  end  //  delimiter ;    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()  begin  	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_test;    	DECLARE cur_2 CURSOR FOR  		select id, name from netingcn_proc_test;    	DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;    	open cur_1;  	REPEAT  		FETCH cur_1 INTO tname, tpass;  		if not done then  			select tname, tpass;  		end if;   	UNTIL done END REPEAT;  	CLOSE cur_1;    	begin  		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_test;    		DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;    		open cur_2;  		REPEAT  			FETCH cur_2 INTO tid, tname;  			if not done then  				select tid, tname;  			end if;  	 	UNTIL done END REPEAT;  		CLOSE cur_2;  	end;  end  //  delimiter ;    call test_proc_2();

摘自:http://www.netingcn.com/mysql-procedure-muti-cursor.html