MySQL 存储过程返回多于一行

问题描述 投票:0回答:1

因此,我创建了这个存储过程,在向数据库实施新行之前,我检查了包含值的行是否已经存在。如果该行已存在,我返回该行的现有 ID,否则返回新创建的行 ID。

存储过程是:

BEGIN
    DECLARE TestJobExists int;
    
    SELECT id into TestJobExists FROM TestJob 
WHERE `JobLink` = JobLink AND `StartTime` = StartTime 
    AND `Endtime` = Endtime 
    AND `Owner` = Owner_info AND `Engine` = Engine_info 
    AND (`TestSuiteId` = TestSuiteId or `TestSuiteId` is NULL)
    AND (`TestSuiteCollectionId` = TestSuiteCollectionId or 
      `TestSuiteCollectionId` is NULL) 
    AND `Finished` = Finished AND `JenkinsBuild` = JenkinsBuild 
    AND `JenkinsJobName` = JenkinsJobName;

    -- Set values to NULL if we have an empty string (we allow either null or ints)

    IF TestSuiteId = '' THEN
    SET TestSuiteId = null;
    END IF;
    
    IF TestSuiteCollectionId = '' THEN
    SET TestSuiteCollectionId = null;
    END IF;
    
    IF TestSuiteCollectionId != '' THEN
    SET TestSuiteId = null;
    END IF;

    -- If we have found an ID it should be above or equal to 1 else insert new row

    IF TestJobExists >= 1 THEN      
        SELECT TestJobExists AS LastInsertId;        
    ELSE
      INSERT INTO TestJob
(`id`,`JobLink`,`StartTime`,`Endtime`,`Owner`,`Engine`,`TestSuiteId`,`TestSuiteCollectionId`,`Finished`,`JenkinsBuild`,`JenkinsJobName`) 
VALUES (NULL, JobLink, StartTime, Endtime, Owner_info, Engine_info, TestSuiteId, TestSuiteCollectionId, Finished, JenkinsBuild, JenkinsJobName);
      SELECT LAST_INSERT_ID() AS LastInsertId;          
    END IF; 
END

TestJobExists
将设置为现有 ID,如果不存在则设置为 null。如果不存在,我们插入一个新行。

我尝试运行 SQL 查询,但它只返回一行:

SELECT id into TestJobExists FROM TestJob 
WHERE `JobLink` = "https://www.test.com" 
   AND `StartTime` = "2022-05-02 08:36:07" 
   AND `Endtime` = "2022-05-02 09:24:23"
   AND `Owner` = "" AND `Engine` = "Tap" 
   AND (`TestSuiteId` = "" or `TestSuiteId` is NULL)
   AND (`TestSuiteCollectionId` = "462" or `TestSuiteCollectionId` is NULL) 
   AND `Finished` = "SUCCESS" AND `JenkinsBuild` = "537"
   AND `JenkinsJobName` = "VTU";

但是当我使用完全相同的值调用存储过程时,它说它不能返回超过一行:

CALL CreateTestJob("https://www.test.com","2022-05-02 08:36:07","2022-05-02 09:24:23","","Tap","","462","SUCCESS","537","VTU")

那么为什么当我自己运行它时它会返回一行,而当它在存储过程中时它为什么会返回多行?

我的猜测是,这与我对如何使用它或 SQL 搜索

(TestSuiteId = "" or TestSuiteId is NULL) AND (TestSuiteCollectionId = "462" or TestSuiteCollectionId is NULL)
行的方式的理解有关
DATETIME
StartTime = "2022-05-02 08:36:07" AND Endtime = "2022-05-02 09:24:23"

这就是桌子的样子:

Table: testjob
Columns:
id int(11) AI PK 
Timestamp timestamp 
JobLink varchar(300) 
JobNo int(11) 
StartTime datetime 
EndTime datetime 
Owner varchar(45) 
Engine varchar(100) 
TestSuiteId int(11) 
TestSuiteCollectionId int(11) 
Finished varchar(45) 
JenkinsBuild int(100) 
JenkinsJobName varchar(100) 
LogTimestamp varchar(45) 
JobVerdict varchar(45) 
logText longtext 
FlagStatus int(11) 
Delete int(11) 
Manuel int(11)
mysql stored-procedures mariadb
1个回答
0
投票

最后在浏览此链接和多次搜索后发现这对我有用。 将其添加到 sp 的开头。 设置全局 log_bin_trust_function_creators = 0;

© www.soinside.com 2019 - 2024. All rights reserved.