0

我正在尝试创建一个存储过程,该过程将接受 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 ;

任何想法?谢谢

4

1 回答 1

1

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

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

例子:

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

于 2015-02-05T10:02:37.010 回答