首页 mysql游标

mysql游标

举报
开通vip

mysql游标mysql游标 mysql数据库中关于Cursor游标的使用方法 mysql数据库中关于Cursor游标的使用方法 DECLARE cursor_name CURSOR FOR SELECT_statement; 游标操作 OPEN 打开游标 OPEN cursor_name; FETCH 获取游标当前指针的记录,并传给指定变量列表,注意变量数必须与MySQL游标返回的字段数一致,要获得多行数据,使用循环语句去执行FETCH FETCH cursor_name INTO variable list;...

mysql游标
mysql游标 mysql数据库中关于Cursor游标的使用 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 mysql数据库中关于Cursor游标的使用方法 DECLARE cursor_name CURSOR FOR SELECT_statement; 游标操作 OPEN 打开游标 OPEN cursor_name; FETCH 获取游标当前指针的记录,并传给指定变量列表,注意变量数必须与MySQL游标返回的字段数一致,要获得多行数据,使用循环语句去执行FETCH FETCH cursor_name INTO variable list; CLOSE关闭游标 CLOSE cursor_name ; 注意:MySQL的游标是向前只读的,也就是说,你只能顺序地从开始往后读取结果集,不能从后往前,也不能直接跳到中间的记录 open 打开实例 mysql> mysql> CREATE TABLE Employee( -> id int, -> first_name VARCHAR(15), -> last_name VARCHAR(15), -> start_date DATE, -> end_date DATE, -> salary FLOAT(8,2), -> city VARCHAR(10), -> description VARCHAR(15) -> ); Query OK, 0 rows affected (0.02 sec) mysql> mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description) -> values (1,'Jason', 'Martin', '19960725', '20060725', 1234.56, 'Toronto', 'Programmer'); Query OK, 1 row affected (0.01 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description) -> values(2,'Alison', 'Mathews', '19760321', '19860221', 6661.78, 'Vancouver','Tester'); Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description) -> values(3,'James', 'Smith', '19781212', '19900315', 6544.78, 'Vancouver','Tester'); Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description) -> values(4,'Celia', 'Rice', '19821024', '19990421', 2344.78, 'Vancouver','Manager'); Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description) -> values(5,'Robert', 'Black', '19840115', '19980808', 2334.78, 'Vancouver','Tester'); Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description) -> values(6,'Linda', 'Green', '19870730', '19960104', 4322.78,'New York', 'Tester'); Query OK, 1 row affected (0.01 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description) -> values(7,'David', 'Larry', '19901231', '19980212', 7897.78,'New York', 'Manager'); Query OK, 1 row affected (0.00 sec) mysql> mysql> insert into Employee(id,first_name, last_name, start_date, end_Date, salary, City, Description) -> values(8,'James', 'Cat', '19960917', '20020415', 1232.78,'Vancouver', 'Tester'); Query OK, 1 row affected (0.00 sec) mysql> mysql> select * from Employee; +------+------------+-----------+------------+------------+---------+-----------+-------------+ | id | first_name | last_name | start_date | end_date | salary | city | description | +------+------------+-----------+------------+------------+---------+-----------+-------------+ | 1 | Jason | Martin | 1996-07-25 | 2006-07-25 | 1234.56 | Toronto | Programmer | | 2 | Alison | Mathews | 1976-03-21 | 1986-02-21 | 6661.78 | Vancouver | Tester | | 3 | James | Smith | 1978-12-12 | 1990-03-15 | 6544.78 | Vancouver | Tester | | 4 | Celia | Rice | 1982-10-24 | 1999-04-21 | 2344.78 | Vancouver | Manager | | 5 | Robert | Black | 1984-01-15 | 1998-08-08 | 2334.78 | Vancouver | Tester | | 6 | Linda | Green | 1987-07-30 | 1996-01-04 | 4322.78 | New York | Tester | | 7 | David | Larry | 1990-12-31 | 1998-02-12 | 7897.78 | New York | Manager | | 8 | James | Cat | 1996-09-17 | 2002-04-15 | 1232.78 | Vancouver | Tester | +------+------------+-----------+------------+------------+---------+-----------+-------------+ 8 rows in set (0.02 sec) mysql> mysql> mysql> mysql> mysql> DELIMITER //www.3 ppt 关于艾滋病ppt课件精益管理ppt下载地图下载ppt可编辑假如ppt教学课件下载triz基础知识ppt .com mysql> CREATE FUNCTION city_list() RETURNS VARCHAR(255) -> BEGIN -> -> DECLARE finished INTEGER DEFAULT 0; -> DECLARE city_name VARCHAR(50) DEFAULT ""; -> DECLARE list VARCHAR(255) DEFAULT ""; -> DECLARE city_cur CURSOR FOR SELECT city FROM employee; -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; -> -> OPEN city_cur; -> -> get_city: LOOP -> FETCH city_cur INTO city_name; -> IF finished THEN -> LEAVE get_city; -> END IF; -> SET list = CONCAT(list,", ",city_name); -> END LOOP get_city; -> -> CLOSE city_cur; -> -> RETURN SUBSTR(list,3); -> END -> // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> mysql> SELECT city_list() AS cities; +------------------------------------------------------------------------------- -----+ | cities | +------------------------------------------------------------------------------- -----+ | Toronto, Vancouver, Vancouver, Vancouver, Vancouver, New York, New York, Vancouver | +------------------------------------------------------------------------------- -----+ 1 row in set (0.00 sec) mysql> mysql> drop function city_list; Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql> mysql> drop table Employee; Query OK, 0 rows affected (0.00 sec) ======== 游标的Handler MySQL中delimit命令。 这个命令与存储过程没什么关系。 其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。 即改变输入结束符。 默认情况下,delimiter是分号“;”。 在命令行客户端中,如果有一行命令以分号结束, 那么回车后,mysql将会执行该命令。 但有时候,不希望MySQL这么做。因为可能输入较多的语句,且语句中包含有分号。 默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。 因为mysql一遇到分号,它就要自动执行。 这种情况下,就可以使用delimiter,把delimiter后面换成其它符号,如//或$$。 此时,delimiter作用就是对整个小段语句做一个简单的封装。 此命令多用在定义子程序,触发程序等mysql自己内嵌小程序中。 mysql> DELIMITER // mysql> CREATE FUNCTION city_list() RETURNS VARCHAR(255) -> BEGIN -> -> DECLARE finished INTEGER DEFAULT 0; -> DECLARE city_name VARCHAR(50) DEFAULT ""; -> DECLARE list VARCHAR(255) DEFAULT ""; -> DECLARE city_cur CURSOR FOR SELECT city FROM employee; -> DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1; -> -> OPEN city_cur; -> -> get_city: LOOP -> FETCH city_cur INTO city_name; -> IF finished THEN -> LEAVE get_city; -> END IF; -> SET list = CONCAT(list,", ",city_name); 连接字符串 -> END LOOP get_city; -> -> CLOSE city_cur; -> -> RETURN SUBSTR(list,3); 返回字符串的部分字符 -> END -> // Query OK, 0 rows affected (0.00 sec) mysql> DELIMITER ; mysql> mysql> SELECT city_list() AS cities; +------------------------------------------------------------------------------- -----+ | cities | +------------------------------------------------------------------------------- -----+ | Toronto, Vancouver, Vancouver, Vancouver, Vancouver, New York, New York, Vancouver | +------------------------------------------------------------------------------- -----+ 1 row in set (0.02 sec) mysql> mysql> drop function city_list; Query OK, 0 rows affected (0.00 sec) mysql> mysql> mysql> mysql> drop table Employee; Query OK, 0 rows affected (0.00 sec) ==== mysql 游标数据输出实例 mysql> delimiter $$ 当重复使用某些查询或者操作时,可以创建一个存储过程。 创建存储过程 mysql> CREATE PROCEDURE myProc() -> READS SQL DATA -> BEGIN -> DECLARE l_last_row INT DEFAULT 0; -> DECLARE l_dept_id INT; -> DECLARE c_dept CURSOR FOR -> SELECT id -> FROM employee; -> /* handler to set l_last_row=1 if a cursor returns no more rows */ -> DECLARE continue handler for NOT FOUND SET l_last_row=1; -> -> OPEN c_dept; -> dept_cursor: LOOP -> FETCH c_dept INTO l_dept_id; -> IF (l_last_row=1) THEN -> LEAVE dept_cursor; -> END IF; -> select l_dept_id; -> -> END LOOP dept_cursor; -> CLOSE c_dept; -> -> END$$ Query OK, 0 rows affected (0.01 sec) mysql> mysql> delimiter ; 调用存储过程 call myProc; drop procedure myProc; 创建存储过程时括号中也可设置参数 MySQL 存储过程是从 MySQL 5.0 开始增加的新功能。存储过程的优点有一箩筐。不过最主要的还是执行效率和SQL 代码封装。特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库时(例如 PHP),要组织很多 SQL 语句。特别是业务逻辑复杂的时候,一大 堆的 SQL 和条件夹杂在 PHP 代码中,让人不寒而栗。现在有了 MySQL 存储过程,业务逻辑 可以封装存储过程中,这样不仅容易维护,而且执行效率也高。 一、MySQL 创建存储过程 “pr_add” 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 “a”、 “b”,返回这两个参数的和。 drop procedure if exists pr_add; -- 计算两个数之和 create procedure pr_add ( a int, b int ) begin declare c int; if a is null then set a = 0; end if; if b is null then set b = 0; end if; set c = a + b; select c as sum; /* return c; -- 不能在 MySQL 存储过程中使用。return 只能出现在函数中。 */ end; 二、调用 MySQL 存储过程 call pr_add(10, 20); 执行 MySQL 存储过程,存储过程参数为 MySQL 用户变量。 set @a = 10; set @b = 20; call pr_add(@a, @b); 三、MySQL 存储过程特点 创建 MySQL 存储过程的简单语法为: create procedure 存储过程名字() ( [in|out|inout] 参数 datatype ) begin MySQL 语句; end; MySQL 存储过程参数如果不显式指定“in”、“out”、“inout”,则默认为“in”。习惯上,对 于是“in” 的参数,我们都不会显式指定。 1. MySQL 存储过程名字后面的“()”是必须的,即使没有一个参数,也需要“()” 2. MySQL 存储过程参数,不能在参数名称前加“@”,如:“@a int”。下面的创建存储过程语 法在 MySQL 中是错误的(在 SQL Server 中是正确的)。 MySQL 存储过程中的变量,不需要 在变量名字前加“@”,虽然 MySQL 客户端用户变量要加个“@”。 create procedure pr_add ( @a int, -- 错误 b int -- 正确 ) 3. MySQL 存储过程的参数不能指定默认值。 4. MySQL 存储过程不需要在 procedure body 前面加 “as”。而 SQL Server 存储过程必须 加 “as” 关键字。 create procedure pr_add ( a int, b int ) as -- 错误,MySQL 不需要 “as” begin mysql statement ...; end; 5. 如果 MySQL 存储过程中包含多条 MySQL 语句,则需要 begin end 关键字。 create procedure pr_add ( a int, b int ) begin mysql statement 1 ...; mysql statement 2 ...; end; 6. MySQL 存储过程中的每条语句的末尾,都要加上分号 “;” ... declare c int; if a is null then set a = 0; end if; ... end; 7. MySQL 存储过程中的注释。 /* 这是个 多行 MySQL 注释。 */ declare c int; -- 这是单行 MySQL 注释 (注意 -- 后至少要有一个空格) if a is null then # 这也是个单行 MySQL 注释 set a = 0; end if; ... end; 8. 不能在 MySQL 存储过程中使用 “return” 关键字。 set c = a + b; select c as sum; /* return c; -- 不能在 MySQL 存储过程中使用。return 只能出现在函数中。 */ end; 9. 调用 MySQL 存储过程时候,需要在过程名字后面加“()”,即使没有一个参数,也需要“()” call pr_no_param(); 10. 因为 MySQL 存储过程参数没有默认值,所以在调用 MySQL 存储过程时候,不能省略参 数。可以用 null 来替代。 call pr_add(10, null);
本文档为【mysql游标】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_721103
暂无简介~
格式:doc
大小:38KB
软件:Word
页数:16
分类:工学
上传时间:2018-02-04
浏览量:1