MySQL SELECT not finding known values - mysql

There is probably something simple here that I'm just not seeing, but I've been trying all I can think of for a few hours. It's time to toss it to more knowledgable folks...
I want to attempt to intercept a duplicate index, so my auto increment value doesn't advance. Plus, after this much time, it has just become one of those things I have to solve at this point.
Starting with an empty table, I call the procedure with PricingHeaderID_In set to zero in order to invoke the INSERT logic.
Lookup1 obviously finds nothing, because there is nothing to find, and pricingHeaderID1 is NULL. Then, the new row is inserted, Lookup2 retrieves the newly inserted row as expected, and pricingHeaderID2 shows the correct value.
Now, I call the procedure with EXACTLY the same values everywhere, Lookup1 still finds nothing, and pricingHeaderID1 is NULL. That causes the insert logic to run, and MySQL correctly detects a duplicate.
My question is simple: If MySQL can detect that the values will cause a duplicate key, then why is Lookup1 failing?
Here's my table definition:
CREATE TABLE PricingHeaders (
PricingHeaderID bigint NOT NULL AUTO_INCREMENT,
UserID bigint NOT NULL,
ClientName varchar(100) NOT NULL,
Subdivision varchar(100) NOT NULL,
SubjectProperty varchar(100) NOT NULL,
DatePrepared date NOT NULL,
MonthsSearched smallint DEFAULT NULL,
Bedrooms tinyint DEFAULT NULL,
Bathrooms tinyint DEFAULT NULL,
Stories tinyint DEFAULT NULL,
SquareFeet smallint DEFAULT NULL,
YearBuilt smallint DEFAULT NULL,
HasPool bit DEFAULT 0,
Created datetime DEFAULT CURRENT_TIMESTAMP,
Modified datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (PricingHeaderID),
UNIQUE KEY UserClientPropertyDate (UserID,ClientName,SubjectProperty,DatePrepared),
INDEX UserSubdivision (UserID,Subdivision)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
And here's my stored procedure:
CREATE PROCEDURE SavePricingHeader ( Token_In VARCHAR(36),
PricingHeaderID_In bigint,
UserID_In bigint,
ClientName_In varchar(100),
Subdivision_In varchar(100),
SubjectProperty_In varchar(100),
DatePrepared_In date,
MonthsSearched_In smallint,
Bedrooms_In tinyint,
Bathrooms_In tinyint,
Stories_In tinyint,
SquareFeet_In smallint,
YearBuilt_In smallint,
HasPool_In bit )
BEGIN
DECLARE errNo int DEFAULT 0;
DECLARE errMsg varchar(250) DEFAULT 'OK';
DECLARE currOp varchar(250) DEFAULT 'Init';
DECLARE pricingHeaderID1 bigint DEFAULT NULL;
DECLARE pricingHeaderID2 bigint DEFAULT NULL;
DECLARE tokenValidated bit DEFAULT 0;
DECLARE sqlErrNo CHAR(5) DEFAULT '00000';
DECLARE sqlErrMsg TEXT DEFAULT '';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 sqlErrNo = RETURNED_SQLSTATE, sqlErrMsg = MESSAGE_TEXT;
SET errNo = 1;
SET errMsg = 'SQL Error';
END;
IF errNo = 0 THEN
SET currOp = 'Extend session';
CALL ExtendSession(Token_In, tokenValidated);
END IF;
IF errNo = 0 THEN
IF tokenValidated = 0 THEN
SET errNo = 9001;
SET errMsg = 'Invalid session.';
END IF;
END IF;
IF errNo = 0 THEN
SET currOp = 'Lookup1';
SELECT `PricingHeaderID` INTO pricingHeaderID1 FROM `PricingHeaders`
WHERE `UserID` = UserID_In
AND `ClientName` = ClientName_In
AND `SubjectProperty` = SubjectProperty_In
AND `DatePrepared` = DatePrepared_In;
IF errNo = 0 THEN
IF pricingHeaderID1 IS NOT NULL THEN
IF pricingHeaderID1 <> PricingHeaderID_In THEN
SET errNo = 9002;
SET errMsg = 'Duplicate Index.';
END IF;
END IF;
END IF;
END IF;
IF errNo = 0 THEN
IF PricingHeaderID_In = 0 THEN
SET currOp = 'Insert';
INSERT INTO `PricingHeaders` (
`UserID`,
`ClientName`,
`Subdivision`,
`SubjectProperty`,
`DatePrepared`,
`MonthsSearched`,
`Bedrooms`,
`Bathrooms`,
`Stories`,
`SquareFeet`,
`YearBuilt`,
`HasPool`
) VALUES (
UserID_In,
ClientName_In,
Subdivision_In,
SubjectProperty_In,
DatePrepared_In,
MonthsSearched_In,
Bedrooms_In,
Bathrooms_In,
Stories_In,
SquareFeet_In,
YearBuilt_In,
HasPool_In
);
IF errNo = 0 THEN
SET pricingHeaderID1 = LAST_INSERT_ID();
END IF;
ELSE
SET currOp = 'Update';
SET pricingHeaderID1 = PricingHeaderID_In;
UPDATE `PricingHeaders` SET
`ClientName` = ClientName_In,
`Subdivision` = Subdivision_In,
`SubjectProperty` = SubjectProperty_In,
`DatePrepared` = DatePrepared_In,
`MonthsSearched` = MonthsSearched_In,
`Bedrooms` = Bedrooms_In,
`Bathrooms` = Bathrooms_In,
`Stories` = Stories_In,
`SquareFeet` = SquareFeet_In,
`YearBuilt` = YearBuilt_In,
`HasPool` = HasPool_In
WHERE `PricingHeaderID` = PricingHeaderID_In;
END IF;
END IF;
IF errNo = 0 THEN
SET currOp = 'Lookup2';
SELECT `PricingHeaderID` INTO pricingHeaderID2 FROM `PricingHeaders`
WHERE `UserID` = UserID_In
AND `ClientName` = ClientName_In
AND `SubjectProperty` = SubjectProperty_In
AND `DatePrepared` = DatePrepared_In;
END IF;
IF errNo = 0 THEN
IF pricingHeaderID2 IS NULL THEN
SET errNo = 9003;
SET errMsg = 'Not retrieved.';
END IF;
END IF;
SELECT pricingHeaderID1, pricingHeaderID2, errNo, errMsg, currOp, sqlErrNo, sqlErrMsg;
END

Your basic problem is your call to the second procedure,
which must look like
CALL ExtendSession(Token_In, #tokenValidated)
Whe4n you want to retrieve an OUT variable in MySQL#
CREATE TABLE PricingHeaders (
PricingHeaderID bigint NOT NULL AUTO_INCREMENT,
UserID bigint NOT NULL,
ClientName varchar(100) NOT NULL,
Subdivision varchar(100) NOT NULL,
SubjectProperty varchar(100) NOT NULL,
DatePrepared date NOT NULL,
MonthsSearched smallint DEFAULT NULL,
Bedrooms tinyint DEFAULT NULL,
Bathrooms tinyint DEFAULT NULL,
Stories tinyint DEFAULT NULL,
SquareFeet smallint DEFAULT NULL,
YearBuilt smallint DEFAULT NULL,
HasPool bit DEFAULT 0,
Created datetime DEFAULT CURRENT_TIMESTAMP,
Modified datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (PricingHeaderID),
UNIQUE KEY UserClientPropertyDate (UserID,ClientName,SubjectProperty,DatePrepared),
INDEX UserSubdivision (UserID,Subdivision)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_general_ci;
CREATE PROCEDURE ExtendSession(IN Token_In VARCHAR(36), OUT tokenValidated int)
BEGIN
SET tokenValidated = 1;
END;
✓
CREATE PROCEDURE SavePricingHeader ( Token_In VARCHAR(36),
PricingHeaderID_In bigint,
UserID_In bigint,
ClientName_In varchar(100),
Subdivision_In varchar(100),
SubjectProperty_In varchar(100),
DatePrepared_In date,
MonthsSearched_In smallint,
Bedrooms_In tinyint,
Bathrooms_In tinyint,
Stories_In tinyint,
SquareFeet_In smallint,
YearBuilt_In smallint,
HasPool_In bit )
BEGIN
DECLARE errNo int DEFAULT 0;
DECLARE errMsg varchar(250) DEFAULT 'OK';
DECLARE currOp varchar(250) DEFAULT 'Init';
DECLARE pricingHeaderID1 bigint DEFAULT NULL;
DECLARE pricingHeaderID2 bigint DEFAULT NULL;
DECLARE tokenValidated bit DEFAULT 0;
DECLARE sqlErrNo CHAR(5) DEFAULT '00000';
DECLARE sqlErrMsg TEXT DEFAULT '';
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1 sqlErrNo = RETURNED_SQLSTATE, sqlErrMsg = MESSAGE_TEXT;
SET errNo = 1;
SET errMsg = 'SQL Error';
END;
IF errNo = 0 THEN
SET currOp = 'Extend session';
CALL ExtendSession(Token_In, #tokenValidated);
END IF;
IF errNo = 0 THEN
IF #tokenValidated = 0 THEN
SET errNo = 9001;
SET errMsg = 'Invalid session.';
END IF;
END IF;
IF errNo = 0 THEN
SET currOp = 'Lookup1';
SELECT `PricingHeaderID` INTO pricingHeaderID1 FROM `PricingHeaders`
WHERE `UserID` = UserID_In
AND `ClientName` = ClientName_In
AND `SubjectProperty` = SubjectProperty_In
AND `DatePrepared` = DatePrepared_In;
IF errNo = 0 THEN
IF pricingHeaderID1 IS NOT NULL THEN
IF pricingHeaderID1 <> PricingHeaderID_In THEN
SET errNo = 9002;
SET errMsg = 'Duplicate Index.';
END IF;
END IF;
END IF;
END IF;
IF errNo = 0 THEN
IF PricingHeaderID_In = 0 THEN
SET currOp = 'Insert';
INSERT INTO `PricingHeaders` (
`UserID`,
`ClientName`,
`Subdivision`,
`SubjectProperty`,
`DatePrepared`,
`MonthsSearched`,
`Bedrooms`,
`Bathrooms`,
`Stories`,
`SquareFeet`,
`YearBuilt`,
`HasPool`
) VALUES (
UserID_In,
ClientName_In,
Subdivision_In,
SubjectProperty_In,
DatePrepared_In,
MonthsSearched_In,
Bedrooms_In,
Bathrooms_In,
Stories_In,
SquareFeet_In,
YearBuilt_In,
HasPool_In
);
IF errNo = 0 THEN
SET pricingHeaderID1 = LAST_INSERT_ID();
END IF;
ELSE
SET currOp = 'Update';
SET pricingHeaderID1 = PricingHeaderID_In;
UPDATE `PricingHeaders` SET
`ClientName` = ClientName_In,
`Subdivision` = Subdivision_In,
`SubjectProperty` = SubjectProperty_In,
`DatePrepared` = DatePrepared_In,
`MonthsSearched` = MonthsSearched_In,
`Bedrooms` = Bedrooms_In,
`Bathrooms` = Bathrooms_In,
`Stories` = Stories_In,
`SquareFeet` = SquareFeet_In,
`YearBuilt` = YearBuilt_In,
`HasPool` = HasPool_In
WHERE `PricingHeaderID` = PricingHeaderID_In;
END IF;
END IF;
IF errNo = 0 THEN
SET currOp = 'Lookup2';
SELECT `PricingHeaderID` INTO pricingHeaderID2 FROM `PricingHeaders`
WHERE `UserID` = UserID_In
AND `ClientName` = ClientName_In
AND `SubjectProperty` = SubjectProperty_In
AND `DatePrepared` = DatePrepared_In;
END IF;
IF errNo = 0 THEN
IF pricingHeaderID2 IS NULL THEN
SET errNo = 9003;
SET errMsg = 'Not retrieved.';
END IF;
END IF;
SELECT pricingHeaderID1, pricingHeaderID2, errNo, errMsg, currOp, sqlErrNo, sqlErrMsg;
END
✓
CALL SavePricingHeader(1,0,1,'test','subd','subepro',NOW(), 1,2,1,1,12,1981,0)
pricingHeaderID1 | pricingHeaderID2 | errNo | errMsg | currOp | sqlErrNo | sqlErrMsg
---------------: | ---------------: | ----: | :----- | :------ | :------- | :--------
1 | 1 | 0 | OK | Lookup2 | 00000 |
✓
db<>fiddle here

Related

MySQL stored procedure returns more than one row

So I've created this stored procedure, where I made a check if the row with the values already exists or not, before implementing a new row to the database. If the row already exists, I return the existing ID of that row, else I return the newly created row ID.
The Stored procedure is:
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 will be set to the existing ID or null if it doesn't exist. If it doesn't exist we insert a new row.
I tried to run the SQL query, which only returned a single row:
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";
But when I call the stored procedure with exactly the same values it says that it cant return more than one row:
CALL CreateTestJob("https://www.test.com","2022-05-02 08:36:07","2022-05-02 09:24:23","","Tap","","462","SUCCESS","537","VTU")
So why does it return a single row when I run it for itself and why does it return multiple when it's inside the stored procedure?
My guess is that it's something to do with my understanding on how either this is used (TestSuiteId = "" or TestSuiteId is NULL) AND (TestSuiteCollectionId = "462" or TestSuiteCollectionId is NULL) or the way the SQL searches for the DATETIME rows StartTime = "2022-05-02 08:36:07" AND Endtime = "2022-05-02 09:24:23"
This is how the table looks:
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)

Stored Procedure Updating more than one time MySQL

I have a stored procedure to update some rows in MySQL. But when I call the stored procedure, it affects more than actual rows.
Here is my stored procedure:
CREATE DEFINER=`root`#`localhost` PROCEDURE `SP_INSERT_DATA`(
IN `incoming_data` TEXT,
IN `value_array` TEXT,
IN `serial_number` VARCHAR(50),
IN `data_timestamp` VARCHAR(50),
OUT `result_id` INT,
OUT `result_message` VARCHAR(500)
)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
DECLARE i INT;
DECLARE value_iteration VARCHAR(50);
DECLARE lcl_data_type_id INT;
DECLARE arr_data_type_name VARCHAR(50);
DECLARE affected_data_row_count INT;
DECLARE cstmr_id INT;
DECLARE exit handler FOR 40001
BEGIN
GET DIAGNOSTICS CONDITION 1
#p1 = MYSQL_ERRNO, #p2 = MESSAGE_TEXT;
SET result_id = -2;
SET result_message = CONCAT('RETURNED ERROR NO : ', #p1 , '\r\nMESSAGE TEXT : ',#p2);
ROLLBACK;
END;
DECLARE exit handler for sqlexception
BEGIN
GET DIAGNOSTICS CONDITION 1
#p1 = MYSQL_ERRNO, #p2 = MESSAGE_TEXT;
SET result_id = -999;
SET result_message = CONCAT('RETURNED ERROR NO : ', #p1 , '\r\nMESSAGE TEXT : ',#p2);
ROLLBACK;
END;
START TRANSACTION;
SET i = 1;
SET affected_data_row_count = 0;
SET cstmr_id = 0;
SET result_id = 0;
SET result_message = 'Success';
SELECT id INTO cstmr_id FROM templaricustomers WHERE templaricustomers.customer_serial_number = serial_number LIMIT 1;
IF(cstmr_id <> 0) THEN
WHILE (LOCATE(',', value_array) > 0)
DO
SET arr_data_type_name = SUBSTRING_INDEX(value_array,',',i);
SET value_array = SUBSTRING(value_array, LOCATE(',',value_array) + 1);
SELECT JSON_EXTRACT(incoming_data, arr_data_type_name) INTO value_iteration;
SET arr_data_type_name := SUBSTRING_INDEX(arr_data_type_name, ".", -1);
IF (SELECT COUNT(id) FROM datatypes WHERE datatypes.data_name = arr_data_type_name) > 0 THEN
SELECT id INTO lcl_data_type_id FROM datatypes WHERE datatypes.data_name = arr_data_type_name LIMIT 1;
ELSE
INSERT INTO datatypes (datatypes.data_name,datatypes.description ,datatypes.inserted_date) VALUES(arr_data_type_name,arr_data_type_name,NOW());
SELECT id INTO lcl_data_type_id FROM datatypes WHERE datatypes.data_name = arr_data_type_name LIMIT 1;
END IF;
IF (SELECT COUNT(id) FROM mqttpacket WHERE mqttpacket.data_type_id = lcl_data_type_id AND mqttpacket.customer_id = cstmr_id) > 0 THEN
UPDATE mqttpacket SET mqttpacket.data_value = value_iteration , mqttpacket.inserted_time = data_timestamp WHERE mqttpacket.data_type_id = lcl_data_type_id AND mqttpacket.customer_id = cstmr_id;
ELSE
INSERT INTO mqttpacket (mqttpacket.data_type_id,mqttpacket.customer_id,mqttpacket.data_value,mqttpacket.inserted_time) VALUES(lcl_data_type_id,cstmr_id,value_iteration,data_timestamp);
END IF;
SET affected_data_row_count = affected_data_row_count +1;
END WHILE;
SET result_id = 0;
SET result_message = CONCAT('Query performed successfully. Effected rows : ',CAST(affected_data_row_count AS CHAR));
ELSE
SET result_id = -1;
SET result_message = 'Customer Serial Number not found.';
END IF;
COMMIT;
END
Here is how I call it:
CALL `SP_INSERT_DATA`('{"subcooling":-40,"B1":113,"B2":206,"B3":471,"B4":226,"B5":8,"B6":380,"B7":210,"B8":187,"Discharge":135,"Suction":120,"High_Pressure":90,"Low_Pressure":90,"Evaporation":73,"Condensation":73,"MAX_CMP_SPEED":1100,"Thermal_Limit":748,"SH":46,"EEV_pct":0,"COP":0,"DSH":60,"WaterFlux":8,"FanPower":1,"DeltaTtoStart":0,"DeltaPtoStart":60,"CMP_ROTOR_RPS":0,"SET_CH_FLASH":120,"SET_HP_FLASH":350,"SET_DHW_FLASH":470,"Defrosting":0,"B8_AVERAGE":63,"SET_PLANT":0,"SET_CH_BMS":160,"SET_HP_BMS":200,"SET_DHW_BMS":480,"SET_ACTIVE":200,"SET_DSH":250,"EEV_INJ_pct":0,"LPT":0,"HPT":0,"PLANT_MODE_MANUAL":0,"DHW_MODE_MANUAL":0,"WATER_FLOW":8,"DISCHARGE_TMP":135,"INVERTER_TMP":8,"ENVELOP_ZONE":1,"EEV_A_STEPS":0,"EBM_POWER":1,"EBM_MAX_POWER":106,"COMP_pct_FINAL":0,"TOTAL_POWER_ABSORBED":10,"POWER_OUT_KW":0,"COOLINGCAPACITY":0}' , '$.subcooling,$.B1,$.B2,$.B3,$.B4,$.B5,$.B6,$.B7,$.B8,$.Discharge,$.Suction,$.High_Pressure,$.Low_Pressure,$.Evaporation,$.Condensation,$.MAX_CMP_SPEED,$.Thermal_Limit,$.SH,$.EEV_pct,$.COP,$.DSH,$.WaterFlux,$.FanPower,$.DeltaTtoStart,$.DeltaPtoStart,$.CMP_ROTOR_RPS,$.SET_CH_FLASH,$.SET_HP_FLASH,$.SET_DHW_FLASH,$.Defrosting,$.B8_AVERAGE,$.SET_PLANT,$.SET_CH_BMS,$.SET_HP_BMS,$.SET_DHW_BMS,$.SET_ACTIVE,$.SET_DSH,$.EEV_INJ_pct,$.LPT,$.HPT,$.PLANT_MODE_MANUAL,$.DHW_MODE_MANUAL,$.WATER_FLOW,$.DISCHARGE_TMP,$.INVERTER_TMP,$.ENVELOP_ZONE,$.EEV_A_STEPS,$.EBM_POWER,$.EBM_MAX_POWER,$.COMP_pct_FINAL,$.TOTAL_POWER_ABSORBED,$.POWER_OUT_KW,$.COOLINGCAPACITY,', '123456', '2021-02-24 10:43:00.00' ,#result_id, #result_message);
The table mqttpacket is a system versioned table. Here are the table creation queries.
CREATE TABLE test_database.MQTTPacket(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
data_type_id INT NOT NULL,
customer_id INT NOT NULL,
data_value INT NULL,
row_start TIMESTAMP(6) GENERATED ALWAYS AS ROW START INVISIBLE,
row_end TIMESTAMP(6) GENERATED ALWAYS AS ROW END INVISIBLE,
inserted_time TIMESTAMP(6) NULL DEFAULT NULL,
PERIOD FOR SYSTEM_TIME(row_start,row_end),
FOREIGN KEY (data_type_id) REFERENCES test_database.DataTypes(id),
FOREIGN KEY (customer_id) REFERENCES test_database.templaricustomers(id)
)WITH SYSTEM VERSIONING;
CREATE TABLE `datatypes` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`data_name` VARCHAR(50) NOT NULL COLLATE 'latin1_general_ci',
`inserted_date` DATE NULL DEFAULT NULL,
`description` VARCHAR(50) NULL DEFAULT NULL COLLATE 'latin1_general_ci',
`device_id` INT(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `device_id` (`device_id`) USING BTREE,
CONSTRAINT `datatypes_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `test_database`.`devices` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT
)
CREATE TABLE `templaricustomers` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`customer_serial_number` VARCHAR(50) NOT NULL COLLATE 'latin1_general_ci',
`customer_name` VARCHAR(50) NULL DEFAULT NULL COLLATE 'latin1_general_ci',
`inserted_date` TIMESTAMP(6) NOT NULL DEFAULT current_timestamp(6),
PRIMARY KEY (`id`) USING BTREE
)
So, when I first call the stored procedure, my result_message variable returns "Query performed successfully. Effected rows : 53" however MySql says
Affected rows: 107 Found rows: 0 Warnings: 0 Duration for 1 query: 0.015 sec.
In the second call of the SP, it says
Affected rows: 160 Found rows: 0 Warnings: 0 Duration for 1 query: 0.031 sec.
Thankful for any help in advance.

What is the error in my mysql user defined function?

Syntax error at line 6 in mysql 8.0, The function created as below
CREATE FUNCTION getStokMiktar(p_sto_id INT, p_dep_id INT)
RETURNS DOUBLE
BEGIN
DECLARE ret DOUBLE
SET ret = (SELECT SUM(CASE WHEN sth_depoid_cikis = p_dep_id THEN -sth_miktar
WHEN sth_depoid_giris = p_dep_id THEN sth_miktar
ELSE 0
END CASE)
FROM stokhareketleri
WHERE
(sth_depoid_cikis = p_dep_id OR sth_depoid_giris = p_dep_id)
AND sth_stokid = p_sto_id)
RETURN ret
END
And my table's structure is :
CREATE TABLE `stokhareketleri` (
`sth_id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`sth_stokid` INT(11) NOT NULL,
`sth_giriscikis` TINYINT(4) NOT NULL,
`sth_evraktipi` INT(11) NOT NULL,
`sth_depoid_cikis` INT(11) NOT NULL,
`sth_depoid_giris` INT(11) NOT NULL,
`sth_miktar` DOUBLE NOT NULL,
PRIMARY KEY (`sth_id`)
)
COLLATE='utf8_turkish_ci'
ENGINE=InnoDB
;
What is the error at line 6? Thanks in advance.
As mentioned by #Salmon, try this
delimiter $$
CREATE FUNCTION getStokMiktar(p_sto_id INT, p_dep_id INT)
RETURNS DOUBLE
BEGIN
DECLARE ret DOUBLE;
SELECT
SUM(CASE WHEN sth_depoid_cikis = p_dep_id THEN - sth_miktar
WHEN sth_depoid_giris = p_dep_id THEN sth_miktar
ELSE 0 END) INTO ret
FROM stokhareketleri
WHERE p_dep_id IN (sth_depoid_cikis,sth_depoid_giris)
AND sth_stokid = p_sto_id;
RETURN ret;
END $$

Error Code: 1062 Duplicate entry for key 'PRIMARY'

I am constantly getting a Error code 1062: Duplicate Entry.
The first row insert, but then it fails on the same ID.
So everytime I hit execute it will increment: 1466, 1467, 1468, 1469.
And each time there is the same record entered, so I am assuming the autoincrement is only working for the first iteration.
Table:
'entity':
CREATE TABLE `entity` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`reg_num` varchar(45) NOT NULL,
`enterprise_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1474 DEFAULT CHARSET=latin1 COMMENT=\'Comment'
Stored procedure:
DELIMITER $$
CREATE DEFINER=`root`#`localhost` PROCEDURE `tp_to_entityPROC`()
DETERMINISTIC
COMMENT 'stored'
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE Tid INT;
DECLARE Tt_name TEXT;
DECLARE allt CURSOR FOR
SELECT training_provider_id, training_provider_name
FROM training_providers;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
OPEN allt;
read_loop: LOOP
IF done THEN
LEAVE read_loop;
END IF;
FETCH allt INTO Tid, Tt_name;
SET #id = 0;
SET #t_name = 0;
SET #id = Tid;
SET #t_name = Tt_name;
SET #empty = '';
if (#id != 0) THEN
INSERT INTO entity (name)
VALUES (#t_name);
SET #my_id = LAST_INSERT_ID();
IF #my_id != 0 THEN
UPDATE training_awarded_providers
SET training_awarded_provider_id = #my_id
WHERE training_awarded_provider_id = #id;
END IF;
END IF;
END LOOP;
CLOSE allt;
END
Not sure about the exact error of duplicate entry but your posted code is not going to work.
Your Table schema
CREATE TABLE `entity` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`reg_num` varchar(45) NOT NULL <-- Here it's non null column
In your store procedure you are trying to insert null to reg_num column which will never succeed
if (#id != 0) THEN
INSERT INTO entity (name)
VALUES (#t_name);

Mysql procedure with no year support

I'm using a MySQL procedure to fetch a shop's open and close times based on two different tables. Normal 'shop_hours' are defined with open/close time and the column day of week (1-7). To allow for customization of normal open/closing times I also have a table named 'shop_hours_special', this is defined with a day of year column.
If I run the argument CALL timesDate('2013-01-02','1', 'false') I get NULL results even though the shop is open this date.
If any MySQL mastermind could give me tips how to make it work with other years than the current, I would be much grateful!
DELIMITER $$
DROP PROCEDURE IF EXISTS timesDate$$
CREATE PROCEDURE timesDate(IN searchedDate DATE, IN dType TINYINT(3), IN ignoreCurrentTime BOOLEAN)
BEGIN
DECLARE final_o_time, final_c_time, o_time, c_time, curTime TIME;
DECLARE dayYear, dayWeek, curDay INT;
DECLARE special_exist BOOLEAN;
SET dayYear = DAYOFYEAR(searchedDate);
SET dayWeek = WEEKDAY(searchedDate) + 1;
SET curDay = DAYOFYEAR(NOW());
SET curTime = TIME(NOW());
SELECT IF(COUNT(*) > 0, TRUE, FALSE), open_time, close_time INTO special_exist, o_time, c_time
FROM shop_hours_special
WHERE day_of_year = dayYear AND `type` = dType;
IF special_exist THEN
IF IgnoreCurrentTime THEN
SET final_o_time = o_time;
SET final_c_time = c_time;
ELSEIF dayYear < curDay THEN
SET final_o_time = NULL;
SET final_c_time = NULL;
ELSEIF dayYear = curDay THEN
IF curTime < o_time THEN
SET final_o_time = o_time;
SET final_c_time = c_time;
ELSEIF curTime < c_time THEN
SET final_o_time = curTime;
SET final_c_time = c_time;
ELSE
SET final_o_time = NULL;
SET final_c_time = NULL;
END IF;
ELSE
SET final_o_time = o_time;
SET final_c_time = c_time;
END IF;
ELSE
SELECT open_time, close_time INTO o_time, c_time
FROM shop_hours
WHERE day_of_week = dayWeek AND (open_time != MAKETIME(0,0,0) OR close_time != MAKETIME(0,0,0)) AND `type` = dType;
IF IgnoreCurrentTime THEN
SET final_o_time = o_time;
SET final_c_time = c_time;
ELSEIF dayYear < curDay THEN
SET final_o_time = NULL;
SET final_c_time = NULL;
ELSEIF dayYear = curDay THEN
IF curTime < o_time THEN
SET final_o_time = o_time;
SET final_c_time = c_time;
ELSEIF curTime < c_time THEN
SET final_o_time = curTime;
SET final_c_time = c_time;
ELSE
SET final_o_time = NULL;
SET final_c_time = NULL;
END IF;
ELSE
SET final_o_time = o_time;
SET final_c_time = c_time;
END IF;
END IF;
SELECT final_o_time, final_c_time;
END$$
DELIMITER ;
MySQL dump:
CREATE TABLE `shop_hours` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`shop_id` int(11) unsigned NOT NULL,
`type` tinyint(3) NOT NULL DEFAULT '1',
`day_of_week` int(11) NOT NULL,
`open_time` time NOT NULL,
`close_time` time NOT NULL,
PRIMARY KEY (`id`),
KEY `shop_id` (`shop_id`),
CONSTRAINT `shop_hours_ibfk_1` FOREIGN KEY (`shop_id`) REFERENCES `shops` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `shop_hours` (`id`, `shop_id`, `type`, `day_of_week`, `open_time`, `close_time`)
VALUES
(1,1,1,1,'09:30:00','20:00:00'),
(2,1,1,2,'09:30:00','20:00:00'),
(3,1,1,3,'09:30:00','20:00:00'),
(4,1,1,4,'09:30:00','20:00:00'),
(5,1,1,5,'09:30:00','20:00:00'),
(6,1,1,6,'11:00:00','20:00:00'),
(7,1,1,7,'11:00:00','20:00:00'),
(8,1,2,1,'11:45:00','12:30:00'),
(9,1,2,2,'11:45:00','12:30:00'),
(10,1,2,3,'11:45:00','12:30:00'),
(11,1,2,4,'11:45:00','12:30:00'),
(12,1,2,5,'11:45:00','12:30:00'),
(13,1,2,6,'00:00:00','00:00:00'),
(14,1,2,7,'00:00:00','00:00:00');
CREATE TABLE `shop_hours_special` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`shop_id` int(11) unsigned NOT NULL,
`type` tinyint(3) NOT NULL DEFAULT '1',
`day_of_year` int(11) NOT NULL,
`open_time` time NOT NULL,
`close_time` time NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unique` (`shop_id`,`type`,`day_of_year`),
KEY `shop_id` (`shop_id`),
CONSTRAINT `shop_hours_special_ibfk_1` FOREIGN KEY (`shop_id`) REFERENCES `shops` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `shop_hours_special` (`id`, `shop_id`, `type`, `day_of_year`, `open_time`, `close_time`)
VALUES
(1,1,1,1,'00:00:00','00:00:00'),
(2,1,1,92,'00:00:00','00:00:00'),
(3,1,1,96,'00:00:00','00:00:00'),
(4,1,1,97,'00:00:00','00:00:00'),
(5,1,1,99,'00:00:00','00:00:00'),
(6,1,1,100,'00:00:00','00:00:00'),
(7,1,1,125,'00:00:00','00:00:00'),
(8,1,1,138,'00:00:00','00:00:00'),
(9,1,1,148,'00:00:00','00:00:00'),
(10,1,1,149,'00:00:00','00:00:00'),
(11,1,2,1,'00:00:00','00:00:00'),
(12,1,2,92,'00:00:00','00:00:00'),
(13,1,2,96,'00:00:00','00:00:00'),
(14,1,2,97,'00:00:00','00:00:00'),
(15,1,2,99,'00:00:00','00:00:00'),
(16,1,2,100,'00:00:00','00:00:00'),
(17,1,2,125,'00:00:00','00:00:00'),
(18,1,2,138,'00:00:00','00:00:00'),
(19,1,2,148,'00:00:00','00:00:00'),
(20,1,2,149,'00:00:00','00:00:00'),
(21,1,1,358,'11:00:00','15:00:00'),
(22,1,2,358,'00:00:00','00:00:00'),
(23,1,1,359,'00:00:00','00:00:00'),
(24,1,2,359,'00:00:00','00:00:00'),
(25,1,1,360,'00:00:00','00:00:00'),
(26,1,2,360,'00:00:00','00:00:00'),
(27,1,2,361,'00:00:00','00:00:00'),
(28,1,1,361,'00:00:00','00:00:00'),
(29,1,1,366,'11:00:00','14:00:00'),
(30,1,2,366,'00:00:00','00:00:00'),
(31,1,2,362,'00:00:00','00:00:00'),
(32,1,2,363,'00:00:00','00:00:00');