Php Insert语句在存储过程中不起作用

Php Insert语句在存储过程中不起作用,php,mysql,amazon-web-services,stored-procedures,ubuntu-14.04,Php,Mysql,Amazon Web Services,Stored Procedures,Ubuntu 14.04,我最近在一个AWS EC2 Ubuntu实例上上传了我的MySQL数据库,现在我遇到了一个问题,我开发的存储过程在该实例上不能正常工作。它在Windows上的XAMPP实例上运行得非常好,所以我不完全确定问题出在哪里,因为我不熟悉Linux和AWS 以下是存储过程: DELIMITER $$ CREATE PROCEDURE sp_PopulateAbstract (conID INT, eID INT, abs TEXT) BEGIN DECLARE existID INT;

我最近在一个AWS EC2 Ubuntu实例上上传了我的MySQL数据库,现在我遇到了一个问题,我开发的存储过程在该实例上不能正常工作。它在Windows上的XAMPP实例上运行得非常好,所以我不完全确定问题出在哪里,因为我不熟悉Linux和AWS

以下是存储过程:

DELIMITER $$
CREATE PROCEDURE sp_PopulateAbstract
(conID INT, eID INT, abs TEXT)
BEGIN
    DECLARE existID INT;
    DECLARE abID INT;

    SELECT a.contributorID INTO existID
    FROM abstract a
    WHERE a.contributorID = conID and a.eventID = eID;

    IF conID = existID
    THEN
       --UPDATE statement works fine on Ubuntu instance
       UPDATE abstract
       SET abstract = abs
       WHERE eventID = eID and contributorID = conID; 
    ELSE
       --This statement doesn't work 
       INSERT INTO abstract
       (eventID, contributorID, abstract)
       VALUES (eID, conID, abs);
    END IF;

    SELECT a.abstractID INTO abID
    FROM abstract a
    WHERE a.eventID = eID and a.contributorID = conID;

    SELECT abID as abstractID;
END$$
DELIMITER $$
BEGIN
    DECLARE existID INT;
    DECLARE abID INT;

    SELECT a.contributorID INTO existID
    FROM eventcontributor a 
    WHERE a.contributorID = conID and a.eventID = eID;

    IF conID = existID
    THEN
        --cause of problem
        SELECT a.contributorID INTO existID
        FROM abstract a
        WHERE a.contributorID = conID and a.eventID = eID;

        IF conID = existID
        THEN 
            UPDATE abstract
            SET abstract = abs
            WHERE eventID = eID and contributorID = conID; 
        ELSE 
            INSERT INTO abstract
            (eventID, contributorID, abstract)
            VALUES (eID, conID, abs);
        END IF;

        SELECT a.abstractID INTO abID
        FROM abstract a
        WHERE a.eventID = eID and a.contributorID = conID;

        DELETE
        FROM abstractattachments
        WHERE abstractID = abID;

        SELECT abID as abstractID;
    ELSE
        SELECT -1 as abstractID;
    END IF;
END$$
这很奇怪,因为
UPDATE
语句在Ubuntu实例上运行良好,而
INSERT
语句则不行。
INSERT
语句不插入任何内容,最后一个
SELECT
语句返回
NULL
。如果执行了
UPDATE
语句,则最后一个
SELECT
语句确实会返回一些内容,并且数据会相应地更新


我已经将
INSERT
语句作为独立语句运行,它工作正常,但在存储过程中不起作用。XAMPP实例和Ubuntu实例之间有什么区别?我已经找到了导致INSERT语句不起作用的原因,这与我在原始问题中遗漏的存储过程部分有关,我认为这不是问题的原因。以下是完整的程序:

DELIMITER $$
CREATE PROCEDURE sp_PopulateAbstract
(conID INT, eID INT, abs TEXT)
BEGIN
    DECLARE existID INT;
    DECLARE abID INT;

    SELECT a.contributorID INTO existID
    FROM abstract a
    WHERE a.contributorID = conID and a.eventID = eID;

    IF conID = existID
    THEN
       --UPDATE statement works fine on Ubuntu instance
       UPDATE abstract
       SET abstract = abs
       WHERE eventID = eID and contributorID = conID; 
    ELSE
       --This statement doesn't work 
       INSERT INTO abstract
       (eventID, contributorID, abstract)
       VALUES (eID, conID, abs);
    END IF;

    SELECT a.abstractID INTO abID
    FROM abstract a
    WHERE a.eventID = eID and a.contributorID = conID;

    SELECT abID as abstractID;
END$$
DELIMITER $$
BEGIN
    DECLARE existID INT;
    DECLARE abID INT;

    SELECT a.contributorID INTO existID
    FROM eventcontributor a 
    WHERE a.contributorID = conID and a.eventID = eID;

    IF conID = existID
    THEN
        --cause of problem
        SELECT a.contributorID INTO existID
        FROM abstract a
        WHERE a.contributorID = conID and a.eventID = eID;

        IF conID = existID
        THEN 
            UPDATE abstract
            SET abstract = abs
            WHERE eventID = eID and contributorID = conID; 
        ELSE 
            INSERT INTO abstract
            (eventID, contributorID, abstract)
            VALUES (eID, conID, abs);
        END IF;

        SELECT a.abstractID INTO abID
        FROM abstract a
        WHERE a.eventID = eID and a.contributorID = conID;

        DELETE
        FROM abstractattachments
        WHERE abstractID = abID;

        SELECT abID as abstractID;
    ELSE
        SELECT -1 as abstractID;
    END IF;
END$$
在这个完整的过程中,问题实际上是在变量
existID
中重新选择一个值时引起的。出于某种原因,现在真正的问题是,如果MySQL的Ubuntu实例已经包含一个变量值,那么它不会覆盖该变量值。也许这与MySQL的版本不同于Ubuntu和我的Windows XAMPP上的版本有关

因此,变量
existID
保留其初始值,嵌套的
IF
语句测试为
true
,这意味着实际执行的是
UPDATE
语句,而不是
INSERT
语句

解决此问题的方法是
声明另一个变量,恰当地命名为
existID2
,然后使用此变量,而不是重复使用
existID

解决方案:

DELIMITER $$
BEGIN
    DECLARE existID INT;
    DECLARE existID2 INT;
    DECLARE abID INT;

    SELECT a.contributorID INTO existID
    FROM eventcontributor a 
    WHERE a.contributorID = conID and a.eventID = eID;

    IF conID = existID
    THEN
        --using a new, empty variable
        SELECT a.contributorID INTO existID2
        FROM abstract a
        WHERE a.contributorID = conID and a.eventID = eID;

        IF conID = existID2
        THEN 
            UPDATE abstract
            SET abstract = abs
            WHERE eventID = eID and contributorID = conID; 
        ELSE 
            INSERT INTO abstract
            (eventID, contributorID, abstract)
            VALUES (eID, conID, abs);
        END IF;

        SELECT a.abstractID INTO abID
        FROM abstract a
        WHERE a.eventID = eID and a.contributorID = conID;

        DELETE
        FROM abstractattachments
        WHERE abstractID = abID;

        SELECT abID as abstractID;
    ELSE
        SELECT -1 as abstractID;
    END IF;
END$$

为什么我的MySQL本地XAMPP实例可以重用变量,而我的AWS Ubuntu MySQL实例不能重用变量,这真的让我很困惑。这对我来说真的没有意义。

一次执行一条语句。如果执行“if”语句,那么为什么执行“else”语句。在时间,如果或否则将执行