2016-06-28 6 views
1

다음은 저장 프로 시저입니다. 그것은 잘 작동하지만 내 문제는 VARCHAR 출력 매개 변수를 가져올 수 없습니다.Mysql 저장 프로 시저가 VARCHAR 출력 매개 변수를 반환하지 않습니다.

나는 문제가있어 부분은 out 매개 변수 여기 op_resultMessage

BEGIN 
    SET op_resultMessage = @curcName; 
END; 

저장 프로 시저의에 @curcName의 과제이다.

CREATE DEFINER=`root`@`localhost` PROCEDURE `addCurriculum`( 
    IN p_curcName varchar(100), 
    IN p_description TEXT, 
    IN p_yearLevel VARCHAR(50), 
    IN p_syStart INT, 
    IN p_syEnd INT, 
    IN p_creator VARCHAR(50), 
    OUT op_resultMessage VARCHAR(50)) 
BEGIN 

    DECLARE curcName VARCHAR(20) ; 

    IF EXISTS 
     (SELECT @curcName := `name` 
     FROM curriculum 
     WHERE 
      yearLevel  =  p_yearLevel 
      AND syStart  =  p_syStart 
      AND syEnd  =  p_syEnd) 

    THEN -- 

    BEGIN 
     SET op_resultMessage = @curcName; 
    END; 

     ELSE 

      BEGIN 
       INSERT INTO curriculum(`name`, description, yearLevel, syStart, syEnd, creator) 
       VALUES(p_curcName,p_description,p_yearLevel,p_syStart,p_syEnd,p_creator); 
      END; 

    END IF; 

END 

나는 그래서

SET op_resultMessage = @curcName 'already uses the school year and year level you're trying to insert'; 

같은 것을 가야한다 name

을 존재하는 경우 메시지를 반환하기 위해 노력하고있어하지만 난 제대로 연결할 및 값을 지정하는 방법을 모르겠어요. 나는 여전히 := SET= 운영자와 혼동 스럽습니다. 나는 그것이 내가 문제를 겪고있는 곳이라고 생각한다. 내가

OUT op_resultMessage VARCHAR(50) 

같은 INT에 out 매개 변수의 유형을 변경하는 경우

는 그것은 숫자 1로 출력 매개 변수 값을 반환 SET op_resultMessage = 1;

같은 op_resultMessage에 번호를 할당합니다. varchar에서는 작동하지 않습니다.

그래서 나는 내가 어떤 도움을 주셔서 감사합니다 것

CALL `enrollmentdb`.`addCurriculum` 
('Test Curriculum ','Test ','Grade 1',2015,2016,'jordan',@outputMsg); 

SELECT @outputMsg; -- this doesn't return any value even if Grade 1, 2015 and 2016 exists 

절차를 호출 할 때. 나는 실제로 mysql을 최근에 배웠다.

감사합니다.

답변

1
drop procedure if exists addCurriculum; 
delimiter $$ 
CREATE PROCEDURE `addCurriculum`( 
    IN p_curcName varchar(100), 
    IN p_description TEXT, 
    IN p_yearLevel VARCHAR(50), 
    IN p_syStart INT, 
    IN p_syEnd INT, 
    IN p_creator VARCHAR(50), 
    OUT op_resultMessage VARCHAR(50)) 
BEGIN 

    DECLARE curcName VARCHAR(20) ; 

    SELECT `name` into @curcName 
     FROM curriculum 
     WHERE 
      yearLevel  =  p_yearLevel 
      AND syStart  =  p_syStart 
      AND syEnd  =  p_syEnd 
      LIMIT 1; 
    -- Note change above. When selecting into a variable (or more than 1) 
    -- then 0 or 1 rows can come back max or an Error occurs 

    IF @curcName is not null then 
     SET op_resultMessage = @curcName; 
    ELSE 
     BEGIN 
      INSERT INTO curriculum(`name`, description, yearLevel, syStart, syEnd, creator) 
      VALUES(p_curcName,p_description,p_yearLevel,p_syStart,p_syEnd,p_creator); 
     END; 
     SET op_resultMessage = 'GEEZ I am right here'; -- Drew added this 
    END IF; 
END$$ 
delimiter ; 

주 저장 프로 시저에서 해설하는 select into var 패턴으로 발생합니다 다른 오류를 반환하는 경우에만 0 또는 1 행 특히 일부입니다. 따라서 LIMIT 1. 그 행은 원하는 행 (제한 1) 일 수도 있고 아닐 수도 있지만, 바로 지금 그 행이 있습니다.

+1

도움 주셔서 감사합니다. 내가 당신의 대답을 보았을 때 curcName이 null인지 단순히 확인할 수있는 불필요한 if-else 블록을 사용한다는 것을 깨달았습니다. 감사합니다. 감사. – p3ace

+0

내 기쁨. 나는 당신이 그것으로 1 행 최대 측면을 해결하기를 바랍니다. – Drew