2014-01-09 5 views
4

Здравствуйте, я довольно новичок в MySQL-запусках. Я хочу, чтобы получить результат из подготовленного запроса и не может видеть, как получить следующий код работы:Получить результат подготовленного запроса в MySQL Trigger?

BEGIN 
    DECLARE un_quer varchar(255); 
    DECLARE res integer; 

    IF(NEW.contact_id IS NULL) THEN 
     IF(NEW.name IS NULL OR NEW.email IS NULL) THEN 
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Forbidden: ... information not sufficient.'; 
     END IF; 
    END IF; 

    IF(NEW.name IS NULL OR NEW.email IS NULL) THEN 
     IF(NEW.contact_id IS NULL) THEN 
      SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Forbidden: ... information not sufficient.'; 
     END IF; 
    END IF; 

    SET un_quer = CONCAT('SELECT COUNT(*) FROM tender_tenderer WHERE tender_id=',NEW.tender_id); 

    IF(NEW.contact_id IS NULL) THEN 
     SET un_quer = CONCAT(un_quer,' AND contact_id IS NULL'); 
    ELSE 
     SET un_quer = CONCAT(un_quer,' AND contact_id = ',NEW.contact_id); 
    END IF; 

    IF(NEW.name IS NULL) THEN 
     SET un_quer = CONCAT(un_quer,' AND name IS NULL'); 
    ELSE 
     SET un_quer = CONCAT(un_quer,' AND name = "',NEW.name,'"'); 
    END IF; 

    PREPARE stmt1 FROM un_quer; 

    SET res = (EXECUTE stmt1); 


    IF (0 < res) THEN 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Forbidden: ...'; 
    END IF; 
END 

Я думаю, что большая часть кода работает, но строка «SET разреш = (ВЫПОЛНИТЬ stmt1);» производит ошибка. Как я могу выбрать результат stmt1 в переменную $ res, чтобы я мог использовать полученное целое число для сравнения в предложении IF?

ПРИМЕЧАНИЕ. Основная проблема заключается в том, что я хочу иметь «уникальное ограничение» в Mysql InnoDB, которое работает со значениями NULL.

ответ

2

Вы не можете SET результат запроса в переменную, даже если этот запрос возвращает только один одно значение. Используйте синтаксис b.b3rn4rd's с queries returning one single row. (FYI, использование CURSOR требуется для итерации по результатам запросов, состоящих в нескольких строках)

Однако, не требуется здесь подготовленное заявление, вы можете использовать null-safe comparison operator:

SELECT COUNT(*) INTO res 
FROM tender_tenderer 
WHERE tender_id = NEW.tender_id 
AND contact_id <=> NEW.contact_id 
AND name <=> NEW.name; 

IF (0 < res) THEN 
... 
+0

Кстати, ваши первые два 'IF()' строго эквивалентны: o) – RandomSeed

2

Используйте заявление INTO.

SET un_quer = CONCAT('SELECT COUNT(*) INTO res FROM tender_tenderer WHERE tender_id=',NEW.tender_id); 
... 
EXECUTE stmt1; 
+0

Спасибо за этот ответ тоже, это правильно. Однако ответ RandomSeed заключается в том, как я на самом деле решил его сейчас. – Blackbam

Смежные вопросы