【问题标题】:Stuck on stored procedure and cursor卡在存储过程和游标上
【发布时间】:2015-02-04 19:44:24
【问题描述】:

我正在尝试创建一个存储过程,该过程将接受 TYPEID 和用户编号作为参数,然后搜索尚未被访问的可用条目 采取/已归还(显示比较和查看表 1 和 2),然后在贷款表中插入新行。在此之前检查 如果用户被禁止(表 3,使用 SIGNAL 进行思考)。

数据:

TABLE1: 
+-----------+----------+
|    CODE   |  TYPEID  |
+-----------+----------+
| 441       |  mn014   |
| 223       |  mn014   |
| 224       |  mn014   |
| 655       |  mn089   |
| 854       |  mn089   |
| 449       |  mn032   |
+-----------+----------+

TABLE2:
+-----------+----------+----------+
| CODE      | TAKENDTE | RTURNDTE |
+-----------+----------+----------+
| 441       | 25/08/14 | 01/01/15 |
| 223       | 25/08/14 | 03/01/15 |
| 223       | 25/08/14 | 01/02/15 |
| 223       | 25/08/14 |   NULL   |
| 655       | 25/08/14 | 07/01/15 |
| 854       | 25/08/14 |   NULL   |
| 449       | 25/08/14 | 06/01/15 |
+-----------+---------------------+

TABLE3:
+-----------+----------+----------+
| USERNO    |   NAME   |  BANNED  |
+-----------+----------+----------+
| 111       |  Bob     |    0     |
| 112       |  Sally   |    1     |
| 113       |  Jim     |    0     |
| 114       |  Billy   |    0     |
| 115       |  Jessica |    0     |
| 116       |  Fred    |    0     |
| 117       |  Patrik  |    0     |
+-----------+---------------------+

我尝试使用我认为需要使用的 CURSOR,但出现错误我无法解决这是我到目前为止所做的

    DELIMITER $$

    CREATE PROCEDURE new_entry(IN isbn_search CHAR(17), useNO INT)

     BEGIN
     DECLARE complete BOOLEAN DEFAULT FALSE;
     DECLARE newEntry VARCHAR (30) DEFAULT ' ';
     DECLARE S CURSOR FOR
    select t1.*
    from table1 t1
    where typeid = 'mn014' and
          not exists (select 1
                      from table2 t2
                      where t2.code = t.code and
                            t2.rturndte is null
                     );      
     DECLARE CONTINUE HANDLER FOR NOT FOUND
       SET complete = TRUE;

                OPEN S;
        SET newLoan = ' ';
        sloop : LOOP
        FETCH NEXT INTO newLoan;

        IF complete THEN 

       LEAVE sloop;

        END IF;

        SET newLoan = CONCAT (code, isbn, duration);


        CLOSE S;

END$$                
DELIMITER ;

有什么想法吗? 谢谢

【问题讨论】:

    标签: mysql sql stored-procedures signals cursors


    【解决方案1】:

    我不太明白你需要做什么,但我看到了一些问题,我在下面列出:

    • 当你声明游标不能使用t1. *时,你必须使用特定的列,即:t1.CODE
    • 变量newLoan未声明,必须先声明后才能赋值。
    • LOOP 没有尽头 (END LOOP)。
    • 变量codeisbnduration 你从哪里得到的?

    例子:

    DELIMITER $$
    
    -- CREATE PROCEDURE `new_entry`(IN `isbn_search` CHAR(17), `useNO` INT)
    CREATE PROCEDURE `new_entry`(`isbn_search` CHAR(17), `useNO` INT)
    BEGIN
        -- DECLARE `complete` BOOLEAN DEFAULT FALSE;
        DECLARE `complete` BOOL DEFAULT FALSE;
        -- DECLARE `newEntry` VARCHAR (30) DEFAULT ' ';
        DECLARE `newLoan` VARCHAR (30) DEFAULT '';
        DECLARE `CONCAT_newLoan` VARCHAR (60) DEFAULT '';
    
        /*
        DECLARE S CURSOR FOR
            select t1.*
            from table1 t1
            where typeid = 'mn014' and
              not exists (select 1
                          from table2 t2
                          where t2.code = t.code and
                                t2.rturndte is null
                         );
        */
    
        /* Simplified statement */
        DECLARE `S` CURSOR FOR
        SELECT `t1`.`CODE`
        FROM `table1` `t1`
        WHERE `TYPEID` = 'mn014';
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET `complete` := TRUE;
        OPEN `S`;
    
        -- SET newLoan = ' ';
    
        `sloop`: LOOP
            FETCH `S` INTO `newLoan`;
            IF `complete` THEN
                CLOSE `S`;
                LEAVE `sloop`;
            END IF;
            -- SET `newLoan` = CONCAT(`code`, `isbn`, `duration`);
            /* Simplified statement */
            SET `CONCAT_newLoan` := CONCAT(`CONCAT_newLoan`, `newLoan`);
        END LOOP;
        -- CLOSE S;
        SELECT `CONCAT_newLoan`;
    END$$
    
    DELIMITER ;
    

    SQL Fiddle demo

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多