为什么数据没有存储在OUTHOL表中,因为这是一个简单的MySQL存储过程,merge语句具有update、insert和delete功能?
我正在运行一个包含update、insert和delete语句的存储过程,并将目标表和源表中的更改存储到mysql中的outhol表中,但数据没有存储在outhol表中。为什么呢 由于此存储过程在没有任何异常的情况下获得成功,但最后的outhol选项卡为空为什么数据没有存储在OUTHOL表中,因为这是一个简单的MySQL存储过程,merge语句具有update、insert和delete功能?,mysql,sql,database,stored-procedures,Mysql,Sql,Database,Stored Procedures,我正在运行一个包含update、insert和delete语句的存储过程,并将目标表和源表中的更改存储到mysql中的outhol表中,但数据没有存储在outhol表中。为什么呢 由于此存储过程在没有任何异常的情况下获得成功,但最后的outhol选项卡为空 @delimiter %%%; CREATE PROCEDURE `QBIWeb`.`Attributes_ProductAttribute_data_Test`() SQL SECURITY INVOKER BEGIN
@delimiter %%%;
CREATE PROCEDURE `QBIWeb`.`Attributes_ProductAttribute_data_Test`()
SQL SECURITY INVOKER
BEGIN
DROP TEMPORARY TABLE IF EXISTS outhol;
CREATE TEMPORARY TABLE outhol(outputnote varchar(2000));
DROP TEMPORARY TABLE IF EXISTS SourceValues;
CREATE TEMPORARY TABLE SourceValues ( ProductAttributeId INT
, TypeOfSystemId INT
, TypeOfProfitCenterCode INT
, TypeOfProgramLineCode VARCHAR(2)
, TypeOfProductLineCode INT
, TypeOfAttributeCode VARCHAR(25)
, ValueBit TINYINT
, ValueInt INT
, ValueText LONGTEXT
, ValueDecimal DECIMAL(28,2)
, ValueDateTime DATETIME);
INSERT INTO SourceValues VALUES
(1, null, null, null, 32, 'MULTIPLE_QUOTE', 0, null, null, null, null)
, (2, null, null, null, 34, 'MULTIPLE_QUOTE', 0, null, null, null, null)
, (3, null, null, null, 70, 'MULTIPLE_QUOTE', 0, null, null, null, null);
DROP TEMPORARY TABLE IF EXISTS Attributes_ProductAttribute_dataTest;
CREATE TEMPORARY TABLE Attributes_ProductAttribute_dataTest (ProductAttributeId INT
, TypeOfSystemId INT
, TypeOfProfitCenterCode INT
, TypeOfProgramLineCode VARCHAR(2)
, TypeOfProductLineCode INT
, TypeOfAttributeCode VARCHAR(25)
, ValueBit TINYINT
, ValueInt INT
, ValueText LONGTEXT
, ValueDecimal DECIMAL(28,2)
, ValueDateTime DATETIME);
INSERT INTO Attributes_ProductAttribute_dataTest VALUES
(4, null, null, null, 71, 'MULTIPLE_QUOTE', 0, null, null, null, null)
, (3, null, null, null, 34, 'MULTIPLE_QUOTE', 0, null, null, null, null)
, (6, null, null, null, 73, 'MULTIPLE_QUOTE', 0, null, null, null, null);
BEGIN
/*DECLARE @var_done INT DEFAULT FALSE;*/
DECLARE var_ProductAttributeId INT;
DECLARE var_TypeOfSystemId INT;
DECLARE var_TypeOfProfitCenterCode INT;
DECLARE var_TypeOfProgramLineCode VARCHAR(2);
DECLARE var_TypeOfProductLineCode INT;
DECLARE var_TypeOfAttributeCode VARCHAR(25);
DECLARE var_ValueBit TINYINT;
DECLARE var_ValueInt INT;
DECLARE var_ValueText LONGTEXT;
DECLARE var_ValueDecimal DECIMAL(28,2);
DECLARE var_ValueDateTime DATETIME;
DECLARE cursor_source CURSOR FOR SELECT ProductAttributeId
, TypeOfSystemId
, TypeOfProfitCenterCode
, TypeOfProgramLineCode
, TypeOfProductLineCode
, TypeOfAttributeCode
, ValueBit
, ValueInt
, ValueText
, ValueDecimal
, ValueDateTime
FROM SourceValues;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @var_done = TRUE;
OPEN cursor_source;
read_loop: LOOP
FETCH cursor_source INTO var_ProductAttributeId ,
var_TypeOfSystemId ,
var_TypeOfProfitCenterCode ,
var_TypeOfProgramLineCode ,
var_TypeOfProductLineCode ,
var_TypeOfAttributeCode ,
var_ValueBit ,
var_ValueInt ,
var_ValueText ,
var_ValueDecimal ,
var_ValueDateTime;
/* execute statements START*/
IF @var_done THEN
LEAVE read_loop;
END IF;
IF NOT @var_done THEN
IF EXISTS(SELECT * FROM Attributes_ProductAttribute_dataTest AD WHERE AD.ProductAttributeId=var_ProductAttributeId AND
IFNULL(var_TypeOfSystemId, 0) <> IFNULL(TypeOfSystemId, 0) or
IFNULL(var_TypeOfProfitCenterCode, 0) <> IFNULL(AD.TypeOfProfitCenterCode, 0) or
IFNULL(var_TypeOfProgramLineCode,0) <> IFNULL(AD.TypeOfProgramLineCode,0) or
IFNULL(var_TypeOfProductLineCode, 0) <> IFNULL(AD.TypeOfProductLineCode, 0) or
IFNULL(var_TypeOfAttributeCode,0) <> IFNULL(AD.TypeOfAttributeCode,0) or
IFNULL(var_ValueBit, 0) <> IFNULL(AD.ValueBit, 0) or
IFNULL(var_ValueInt, 0) <> IFNULL(AD.ValueInt, 0) or
IFNULL(var_ValueText,0) <> IFNULL(AD.ValueText,0) or
IFNULL(var_ValueDecimal, 0) <> IFNULL(AD.ValueDecimal, 0) or
IFNULL(var_ValueDateTime, 0) <> IFNULL(AD.ValueDateTime, 0)
)
THEN
UPDATE Attributes_ProductAttribute_dataTest SET
TypeOfSystemId = var_TypeOfSystemId
, TypeOfProfitCenterCode = var_TypeOfProfitCenterCode
, TypeOfProgramLineCode = var_TypeOfProgramLineCode
, TypeOfProductLineCode = var_TypeOfProductLineCode
, TypeOfAttributeCode = var_TypeOfAttributeCode
, ValueBit = var_ValueBit
, ValueInt = var_ValueInt
, ValueText = var_ValueText
, ValueDecimal = var_ValueDecimal
, ValueDateTime = var_ValueDateTime
WHERE ProductAttributeId = var_ProductAttributeId;
/* ----Logging the resutls ---*/
INSERT INTO outhol VALUES (CONCAT('UPDATED: ', 'ProductAttributeId = ' , ifnull(cast(var_ProductAttributeId as char), 'null')));
ELSEIF NOT EXISTS(SELECT * FROM Attributes_ProductAttribute_dataTest AD WHERE AD.ProductAttributeId = var_ProductAttributeId ) THEN
INSERT INTO Attributes_ProductAttribute_dataTest VALUES (var_ProductAttributeId ,
var_TypeOfSystemId ,
var_TypeOfProfitCenterCode ,
var_TypeOfProgramLineCode ,
var_TypeOfProductLineCode ,
var_TypeOfAttributeCode ,
var_ValueBit ,
var_ValueInt ,
var_ValueText ,
var_ValueDecimal ,
var_ValueDateTime
);
/* ----Logging the resutls ---*/
INSERT INTO outhol VALUES (CONCAT('INSERTED: ', 'ProductAttributeId= ' , ifnull(cast(var_ProductAttributeId as char), 'null'))) ;
END IF;
END IF;
END LOOP;
/* execute statements END*/
CLOSE cursor_source;
BEGIN
/* Deleting Records not n Source */
DECLARE cursor_trg CURSOR FOR SELECT ProductAttributeId FROM Attributes_ProductAttribute_dataTest ;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET @var_done = TRUE;
OPEN cursor_trg;
read_loop: LOOP
FETCH cursor_trg INTO var_ProductAttributeId;
/* execute statements START*/
IF @var_done THEN
LEAVE read_loop;
END IF;
IF NOT @var_done THEN
IF NOT EXISTS(SELECT * FROM SourceValues SV WHERE SV.ProductAttributeId = var_ProductAttributeId) THEN
DELETE FROM Attributes_ProductAttribute_dataTest WHERE ProductAttributeId = var_ProductAttributeId;
/* ----Logging the resutls ---*/
INSERT INTO outhol VALUES (CONCAT('DELETED: ', 'ProductAttributeId = ' , ifnull(cast(var_ProductAttributeId as char), 'null')) );
END IF;
END IF;
END LOOP;
/* execute statements END*/
CLOSE cursor_trg;
SELECT * FROM SourceValues;
SELECT * FROM Attributes_ProductAttribute_dataTest ;
SELECT * FROM outhol;
END;
END;
END;```
@分隔符%%;
创建过程`QBIWeb`.`Attributes\u ProductAttribute\u data\u Test`()
SQL安全调用程序
开始
删除临时表(如果存在);
创建临时表outhol(outputnotevarchar(2000));
如果存在源值,则删除临时表;
创建临时表SourceValues(ProductAttributeId INT
,TypeOfSystemId INT
,TypeOfProfitCenterCode INT
,程序代码VARCHAR的类型(2)
,TypeOfProductLineCode INT
,属性代码VARCHAR的类型(25)
,ValueBit TINYINT
,ValueInt
,ValueText LONGTEXT
,值十进制(28,2)
,ValueDateTime(日期时间);
插入到SourceValues值中
(1,null,null,null,32,'多引号',0,null,null,null,null,null)
,(2,null,null,null,34,'多引号',0,null,null,null,null,null)
,(3,null,null,null,70,'多引号',0,null,null,null,null,null);
如果存在属性\产品属性\数据测试,则删除临时表;
创建临时表属性\u ProductAttribute\u dataTest(ProductAttributeId INT
,TypeOfSystemId INT
,TypeOfProfitCenterCode INT
,程序代码VARCHAR的类型(2)
,TypeOfProductLineCode INT
,属性代码VARCHAR的类型(25)
,ValueBit TINYINT
,ValueInt
,ValueText LONGTEXT
,值十进制(28,2)
,ValueDateTime(日期时间);
插入属性\产品属性\数据测试值
(4,null,null,null,71,'多引号',0,null,null,null,null,null)
,(3,null,null,null,34,'多引号',0,null,null,null,null,null)
,(6,null,null,null,73,'多引号',0,null,null,null,null,null);
开始
/*声明@var_done INT DEFAULT FALSE*/
声明var_ProductAttributeId INT;
声明var_TypeOfSystemId INT;
声明var_TypeOfProfitCenterCode INT;
声明var_类型的程序代码VARCHAR(2);
声明productlinecode INT的var_类型;
声明var_类型属性代码VARCHAR(25);
声明var_ValueBit TINYINT;
声明var_ValueInt;
声明var_ValueText LONGTEXT;
声明var_值十进制(28,2);
声明var_ValueDateTime DATETIME;
声明游标\选择ProductAttributeId的源游标
,系统的类型
,TypeOfProfitCenterCode
,TypeOfProgramLineCode
,产品线代码的类型
,属性代码的类型
,ValueBit
,ValueInt
,ValueText
,ValueDecimal
,ValueDateTime
源值;
声明未找到集合的继续处理程序@var_done=TRUE;
开源;
读循环:循环
将游标\u源提取到var\u ProductAttributeId中,
var_类型的系统,
var_ProfitCenter代码的类型,
var_类型的程序代码,
var_ProductlineCode的类型,
变量类型属性代码,
var_ValueBit,
var_ValueInt,
var_ValueText,
var_ValueDecimal,
var_ValueDateTime;
/*执行语句开始*/
如果@var_完成了,那么
离开read_循环;
如果结束;
如果没有@var_完成,则
如果存在(从属性\u ProductAttribute\u数据测试AD中选择*其中AD.ProductAttributeId=var\u ProductAttributeId和
IFNULL(var_TypeOfSystemId,0)IFNULL(TypeOfSystemId,0)或
IFNULL(var_typeOfProfitCenter代码,0)IFNULL(AD.typeOfProfitCenter代码,0)或
IFNULL(var_TypeOfProgramLineCode,0)IFNULL(AD.TypeOfProgramLineCode,0)或
IFNULL(var_TypeOfProductLineCode,0)IFNULL(AD.TypeOfProductLineCode,0)或
IFNULL(var_TypeOfAttributeCode,0)IFNULL(AD.TypeOfAttributeCode,0)或
IFNULL(var_ValueBit,0)IFNULL(AD.ValueBit,0)或
IFNULL(var_ValueInt,0)IFNULL(AD.ValueInt,0)或
IFNULL(var_ValueText,0)IFNULL(AD.ValueText,0)或
IFNULL(var_ValueDecimal,0)IFNULL(AD.ValueDecimal,0)或
IFNULL(var_ValueDateTime,0)IFNULL(AD.ValueDateTime,0)
)
然后
更新属性\u产品属性\u数据测试集
TypeOfSystemId=var_TypeOfSystemId
,TypeOfProfitCenterCode=var_TypeOfProfitCenterCode
,typeofprogralinecode=var\u typeofprogralinecode
,TypeOfProductLineCode=var\u TypeOfProductLineCode
,TypeOfAttributeCode=var\u TypeOfAttributeCode
,ValueBit=var\u ValueBit
,ValueInt=var\u ValueInt
,ValueText=var\u ValueText
,ValueDecimal=var\u ValueDecimal
,ValueDateTime=var\u ValueDateTime
其中ProductAttributeId=var_ProductAttributeId;
/*----记录结果---*/
插入outhol值(CONCAT('UPDATED:','Pr