Mysql游标和预定义语句的用法

一 游标
    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,'张三');  
原文地址:https://www.cnblogs.com/t0404/p/10291052.html