2016-06-28 11 views
1

Ниже приведена моя хранимая процедура. Он отлично работает, но моя проблема заключается в том, что выходной параметр не может быть равен VARCHAR.Mysql Stored Proc не возвращает параметр VARCHAR out

часть, где у меня проблемы является назначение @curcName в выводимый параметр op_resultMessage

BEGIN 
    SET op_resultMessage = @curcName; 
END; 

Вот хранимых процедур.

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 

Я пытаюсь вернуть сообщение IF EXISTS name

Так оно и должно пойти что-то вроде

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

Но я не знаю, как правильно конкатенации и присваивать значения. Я все еще путаюсь с операторами := SET и =. Наверное, у меня проблемы.

Если изменить тип затраченного параметра к INT как

OUT op_resultMessage VARCHAR(50) 

затем присваивает номер op_resultMessage как SET op_resultMessage = 1;

Он возвращает как из значения параметров номер 1. Он просто не будет работать с варчаром.

Так что, когда я пытаюсь вызвать процедуру

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 ; 

Обратите внимание на комментарии в хранимой процедуре, особенно часть только 0 или 1 строк возвращающимся еще произойдет ошибка с select into var рисунком. Итак, LIMIT 1. Это может быть или не быть той строкой, которую вы хотите (ограничение 1), но это именно то, где она сейчас.

+1

Спасибо за помощь. Когда я увидел ваш ответ, я понял, что использовал ненужные блоки if-else, где я могу просто проверить, является ли curcName нулевым. Я ценю это. Благодарю. – p3ace

+0

мое удовольствие. Надеюсь, вы разрешите его 1-й ряд. – Drew