2015-02-04 3 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).
  • 변수 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