zoukankan      html  css  js  c++  java
  • 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,'张三');  
  • 相关阅读:
    Spring的事务处理机制
    英特尔诺基亚联手研发Symbian系统的智能手机
    国际最新LOGO设计趋势总结
    Java学习笔记_身份验证机制
    用Validator检查你的表单
    软件企业:细节造就竞争力
    优化软件性能的方法
    【开发经验】Struts常见错误及原因分析
    CF547E Mike and Friends
    [ZJOI2015]诸神眷顾的幻想乡
  • 原文地址:https://www.cnblogs.com/t0404/p/10291052.html
Copyright © 2011-2022 走看看