2015-02-04 65 views
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  | 
+-----------+---------------------+ 

我使用遊標這是什麼想我需要使用,但我得到的錯誤,我不能解決這個嘗試就是我迄今所做

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 ; 

有什麼想法嗎? 感謝

回答

0

我不太明白你需要做什麼,但我看到了一些問題,我的文章

  • 在聲明遊標不能使用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