首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MySQL触发器中准备好的查询中获得结果?

从MySQL触发器中准备好的查询中获得结果?
EN

Stack Overflow用户
提问于 2014-01-09 22:32:11
回答 2查看 283关注 0票数 4

你好,我对MySQL触发器非常陌生。我希望从准备好的查询中获得结果,但无法看到如何使以下代码工作:

代码语言:javascript
复制
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 res = (EXECUTE Stmt1)“行会产生一个错误。如何将stmt1的结果选择到变量$res中,以便在IF-子句中使用要比较的结果整数?

注意:基本的问题是,我希望在Mysql InnoDB中有一个“唯一约束”,它可以使用空值。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-10 00:38:57

即使此查询只返回一个值,也不能将查询结果SET到变量。将B.b3rn4rd语法与返回一行的查询一起使用。(fyi,需要使用CURSOR来迭代由多行组成的查询结果)

但是,这里不需要准备好的语句,您可以使用零安全比较运算符

代码语言:javascript
复制
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
...
票数 2
EN

Stack Overflow用户

发布于 2014-01-09 23:10:36

使用INTO语句。

代码语言:javascript
复制
SET un_quer = CONCAT('SELECT COUNT(*) INTO res FROM tender_tenderer WHERE tender_id=',NEW.tender_id);
...
EXECUTE stmt1;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21032614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档