MySQL在存储过程中使用游标

#在存储过程中使用游标

DROP TABLE IF EXISTS tbl;
CREATE TABLE tbl(
    id INT NOT NULL AUTO_INCREMENT,
    title VARCHAR(50) NOT NULL,
    author VARCHAR(50) NOT NULL,
    PRIMARY KEY(id)
);

DROP PROCEDURE IF EXISTS sp7;
CREATE PROCEDURE sp7(INOUT rst VARCHAR(100), OUT rst_code INT, OUT rst_msg TEXT) COMMENT ‘在存储过程中使用游标‘
BEGIN
    DECLARE err_sta VARCHAR(5) DEFAULT ‘‘;
    DECLARE err_msg TEXT DEFAULT ‘‘;

    DECLARE csr_id INT;
    DECLARE csr_title VARCHAR(50);
    DECLARE csr_author VARCHAR(50);
    DECLARE csr_done INT DEFAULT FALSE;#声明游标结束标识
    DECLARE csr CURSOR FOR SELECT id,title,author FROM tbl;#声明游标

    DECLARE EXIT HANDLER FOR SQLWARNING,SQLEXCEPTION
    BEGIN
        GET DIAGNOSTICS CONDITION 1 err_sta=RETURNED_SQLSTATE,err_msg=MESSAGE_TEXT;
        SET rst_code=FALSE;
        SET rst_msg=CONCAT(‘[Err] ‘,err_sta,‘ - ‘,err_msg);
        ROLLBACK;
    END;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET csr_done = TRUE;#游标NOT FOUND处理程序

    #SIGNAL SQLSTATE ‘42000‘ SET MESSAGE_TEXT = ‘when some value is not allowed‘;#自定义异常返回消息

    START TRANSACTION;

    OPEN csr;#开启游标
        lp: LOOP

            FETCH csr INTO csr_id,csr_title,csr_author;#按照查询表列的顺序

            IF csr_done THEN
                LEAVE lp;
            END IF;

            SET rst = CONCAT(csr_title,‘;‘,rst);

        END LOOP lp;
    CLOSE csr;#关闭游标

    #INSERT INTO tbl(title,author) VALUES(‘Learn CSharp‘,‘James‘);
    #INSERT INTO tbl(title,author) VALUES(NULL,‘Jen‘);#[Err] 23000 - Column ‘title‘ cannot be null

    COMMIT;

    SET rst_code=TRUE, rst_msg=‘‘;
END

SET @rst=‘‘;
CALL sp7(@rst,@rst_code,@rst_msg);
SELECT @rst as rst,@rst_code AS rst_code,@rst_msg as rst_msg;
时间: 2024-12-14 19:40:31

MySQL在存储过程中使用游标的相关文章

Sql server存储过程中常见游标循环用法

原文:Sql server存储过程中常见游标循环用法 用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE @A1 VARCHAR(10), @A2 VARCHAR(10), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELECT A1,A2,A3 FROM YOUTABLENAME OPEN YOUCURNAME fetch next from youcurname into @a1,@a2,@a3 while

mysql 存储过程中使用游标中使用临时表可以替代数组效果

mysql不支持数组.但有时候需要组合几张表的数据,在存储过程中,经过比较复杂的运算获取结果直接输出给调用方,比如符合条件的几张表的某些字段的组合计算,mysql临时表可以解决这个问题.临时表:只有在当前连接情况下, TEMPORARY 表才是可见的.当连接关闭时, TEMPORARY 表被自动取消.必须拥有 create temporary table 权限,才能创建临时表.可以通过指定 engine = memory; 来指定创建内存临时表. 先建立要用的数据表及数据: drop table

mysql创建存储过程中的问题

1.在创建存储过程成功后,使用call 存储过程名执行时报错: Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT)错误. 解决方法:检查存储过程使用到的表格的编码方式,包括字段和表格本身.最后统一编码方式.在类型是属于字符.字符串这等类型的后面加上 CHARSET utf8 例: DELIMITER $$   USE `mall`$$   DROP PROCEDURE IF EXI

Mysql向存储过程中传递中文参数变成乱码的解决方案

今天做程序需要用到一个存储过程,然后用php程序调用.  存储过程如下: delimiter $$ CREATE PROCEDURE disagree_upgrade_detail(a int,b text) BEGIN SET NAMES 'utf8'; UPDATE `upgrade_detail` SET `disagree_description`=b WHERE `id`=a; INSERT INTO `disagree_upgrade_detail` SELECT * from `u

mysql写存储过程/PHP写和调用存储过程

PHP调用MYSQL存储过程实例 来源: http://blog.csdn.net/ewing333/article/details/5906887 实例一:无参的存储过程 $conn = mysql_connect('localhost','root','root') or die ("数据连接错误!!!"); mysql_select_db('test',$conn); $sql = " create procedure myproce() begin INSERT IN

mysql中游标在存储过程中的详细用法

昨天写的一个东东,分享下给大家. drop PROCEDURE  if exists sp_cleanUserData; CREATE  PROCEDURE `sp_cleanUserData`() BEGIN /*定义游标*/ declare v_dt bigint(20) default 0 ; declare v_num INT DEFAULT 0; /*游标循环到末尾时给定义的常量赋值*/ declare cur_userId   CURSOR FOR select  userId fr

Mysql存储过程中使用cursor

一.表 学生表 CREATE TABLE `t_student` ( `stuNum` int(11) NOT NULL auto_increment, `stuName` varchar(20) default NULL, `birthday` date default NULL, PRIMARY KEY  (`stuNum`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 学生分数表 CREATE TABLE `t_stu_score` ( `id` int(11

mysql之——存储过程 + 游标 + 事务

下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考. 其中,涉及到了存储过程.游标(双层循环).事务. [说明]:代码中的注释只针对当时业务而言,无须理会. 代码如下: DELIMITER $$ DROP PROCEDURE IF EXISTS `transferEmailTempData`$$ CREATE PROCEDURE transferEmailTempData(IN jobId VARCHAR(24)) BEGIN DECLARE idval VARCH

mysql存储过程中 乱码问题解决办法

中文乱码无论在何时都是一个头疼的问题,mysql的存储过程参数也同样存在这个问题.1.直接使用insert into语句没问题,能够正常插入汉字.2.把insert into语句移到Procedure中后,就无法插入汉字了.在客户端软件中插入的汉字总是为乱码,英文和数字没问题.3.如果在jdbc中调用这个Procedure总是报错: 在查阅了很多相关资料后,发现只需要改动procedure的参数的定义就OK了,改动为:在varchar参数后面加入: character set 指定编码.由于服务