一 游标
1语法
1>声明光标
DECLARE cursor_name CURSOR FOR select_statement
这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。
SELECT语句不能有INTO子句。
2>光标OPEN语句
OPEN cursor_name
这个语句打开先前声明的光标。
3>光标FETCH语句
FETCH cursor_name INTO var_name [, var_name] ...
这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。
4>光标CLOSE语句
CLOSE cursor_name
5>用法举例
DROP PROCEDURE IF EXISTS pro_cursor;
DELIMITER //
CREATE PROCEDURE pro_cursor()
BEGIN
DECLARE gid INT;
DECLARE gname VARCHAR(20);
DECLARE ifEnd BOOLEAN DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT * FROM grade;
#定义一个句柄 当fetch 抓取数据时 会自动调用该句柄 如果找不到数据 会自动调用最后的sql语句 set
# not found等价于 SQLSTATE '02000'
DECLARE CONTINUE HANDLER FOR NOT FOUND SET ifEnd=TRUE;
OPEN cur;
WHILE(ifEnd=FALSE) DO
FETCH cur INTO gid,gname;
IF(ifEnd=FALSE) THEN
SELECT gid,gname;
END IF;
END WHILE;
CLOSE cur;
END
//
CALL pro_cursor;
二 预定义语句
1>结构 :
预制语句的SQL语法基于三个SQL语句:
PREPARE stmt_name FROM preparable_stmt;
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
{DEALLOCATE | DROP} PREPARE stmt_name;
2>举例
--创建表
CREATE TABLE `arcticle` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT NULL,
`content` varchar(200) DEFAULT NULL,
`createuser` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
--过程
DROP PROCEDURE IF EXISTS pro_queryTitle;
DELIMITER //
CREATE PROCEDURE pro_queryTitle(title VARCHAR(20),createuser VARCHAR(20))
BEGIN
SET @msql='select * from arcticle where 1=1 ';
IF title IS NOT NULL THEN
# select * from arcticle where 1=1 and title='java是否过时';
SET @msql=CONCAT(@msql,' and title='' ',title,'''');
END IF;
IF createuser IS NOT NULL THEN
SET @msql=CONCAT(@msql,' and createuser=''',createuser,'''');
END IF;
PREPARE stm1 FROM @msql;
EXECUTE stm1;
DEALLOCATE PREPARE stm1;
END
//
#'java是否过时','张三'
CALL pro_queryTitle(NULL,'张三');