gpt4 book ai didi

php - 插入语句在存储过程中不起作用

转载 作者:行者123 更新时间:2023-11-29 03:27:04 25 4
gpt4 key购买 nike

我最近在 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$$

这很奇怪,因为 UPDATE 语句在 Ubuntu 实例上工作正常,但 INSERT 语句不能。 INSERT 语句不插入任何内容,最后一个 SELECT 语句返回 NULL。如果执行了 UPDATE 语句,最后的 SELECT 语句会返回一些内容并且数据会得到适当更新。

我已经将 INSERT 语句作为一个独立的语句运行,它工作正常,但它在存储过程中不起作用。 XAMPP 实例(它可以工作)和 Ubuntu 实例(它不能工作)之间有什么区别?

最佳答案

我已经找到导致 INSERT 语句不工作的原因,这与我在原始问题中遗漏的存储过程部分有关,认为它不是问题的原因。这是完整的过程:

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 语句。

解决这个问题的方法是 DECLARE 另一个变量,恰本地命名为 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$$

我的本​​地 XAMPP MySQL 实例可以重用变量,但我的 AWS Ubuntu MySQL 实例却不能,这真的让我感到困惑。这对我来说真的没有意义。

关于php - 插入语句在存储过程中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34653377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com